![]() |
Autor artykułu: mgr Jerzy Wałaszek, wersja1.0 |
©2010 mgr
Jerzy Wałaszek
|
Miejscem zerowym funkcji
|
xo jest miejscem zerowym wtedy i tylko wtedy, gdy f(xo) = 0 |
|
Uwaga: Często uczniowie (nawet ci lepsi)
mylą to proste pojęcie i twierdzą, iż miejsce zerowe to argument
|
Przykład:
Funkcja f(x) = 2x - 4 posiada miejsce zerowe dla xo = 2, ponieważ:
| f(xo) | = 2xo - 4 |
| f(2) | = 2
|
Miejsce zerowe często nazywamy pierwiastkiem funkcji.
Funkcja może posiadać więcej niż jeden pierwiastek:
Przykład:
Funkcja f(x) = x2 - 1 posiada dwa pierwiastki: xo = -1 oraz xo = 1, gdyż:
| f(xo) | = (xo)2 - 1 |
| f(-1) | = (-1)2 - 1 = 1 - 1 = 0 |
| f(1) | = 12 - 1 = 1 - 1 = 0 |
Funkcja może posiadać nieskończenie wiele pierwiastków:
Przykład:
Funkcja f(x) = sin(x - 2) posiada pierwiastki dla każdego xo = kπ + 2, gdzie k = 0, ±1, ±2 ...
Graficznie miejsce zerowe funkcji możemy interpretować jako punkt przecięcia osi współrzędnych OX przez wykres funkcji:
Znajdowanie miejsc zerowych ma olbrzymie znaczenie w matematyce, fizyce, astronomii, technice itp. Dlatego już dawno temu matematycy opracowali wiele metod rozwiązywania tego zagadnienia. Zasadniczo istnieją dwa podejścia:
Mamy daną funkcję
| 1. | Funkcja Dla przykładu rozważmy prostą funkcję:
Ile wynosi wartość tej funkcji dla
|
| 2. | Funkcja
Funkcja w przedziale
Nieciągłość występuje w punkcie
|
| 3. | Funkcja
f(a) < f(xo) = 0 < f(b) lub f(a) > f(xo) = 0 > f(b) |
Gdy funkcja
Wyznaczamy punkt xo
jako środek przedziału

Obliczamy wartość funkcji w punkcie xo.
Sprawdzamy, czy

Jeśli nierówność jest spełniona, to xo
jest poszukiwaną wartością pierwiastka. Zwracamy wynik i kończymy algorytm.
W przeciwnym razie za nowy przedział poszukiwań pierwiastka przyjmujemy tą
połówkę
Program wyznacza miejsce zerowe funkcji: f(x) = x3(x + sin(x2 - 1) - 1) - 1. Pierwiastków należy poszukiwać w przedziałach <-1,0> i <1,2>.
// Znajdowanie miejsc zerowych
// METODA POŁOWIENIA - BISEKCJI
// (C)2010 I LO w Tarnowie
//------------------------
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
const double EPS = 0.00001;
// Tutaj definiujemy naszą funkcję
//--------------------------------
double f(double x)
{
return x * x * x * (x + sin(x * x - 1) - 1) - 1;
}
int main()
{
double a,b,x0,fa,fb,f0;
cout << fixed << setprecision(4);
cout << "OBLICZANIE MIEJSC ZEROWYCH FUNKCJI - METODA BISEKCJI\n"
"----------------------------------------------------\n\n";
// odczytujemy przedział poszukiwań pierwiastka
cout << "a = "; cin >> a;
cout << "b = "; cin >> b;
cout << endl;
// obliczamy wartości funkcji w punktach a i b
fa = f(a);
fb = f(b);
// sprawdzamy, czy na krańcach funkcja ma różne znaki
if(fa * fb < 0)
{
// pierwiastka szukamy metodą bisekcji
while(true)
{
x0 = (a + b) / 2;
f0 = f(x0);
// sprawdzamy, czy x0 jest przybliżonym pierwiastkiem
if(fabs(f0) < EPS)
{
cout << "x0 = " << x0 << " f(x0) = " << f0 << endl << endl;
break; // pierwiastek znaleziony, przerywamy pętlę
}
// za nowy przedział przyjmujemy połówkę, w której funkcja zmienia znak
if(fa * f0 < 0)
{
b = x0; fb = f0;
}
else
{
a = x0; fa = f0;
}
}
}
else cout << "FUNKCJA NIE SPELNIA WARUNKU NR 3\n\n";
return 0;
}
|
Mamy daną funkcję
Funkcja
Funkcja
Funkcja
f(a)
< f(xo)
= 0 < f(b)
lub f(a)
> f(xo)
= 0 > f(b)
Gdy funkcja

W języku łacińskim regula falsi oznacza
fałszywą prostą. Ideą tej metody jest założenie, iż
funkcja w coraz mniejszych przedziałach wokół pierwiastka zaczyna przypominać
funkcję liniową. Skoro tak, to przybliżenie pierwiastka otrzymujemy prowadząc
linię prostą (sieczną) z punktów krańcowych przedziału.
Sieczna przecina oś OX
w punkcie
Wzór dla

|
W naszym przypadku postępujemy następująco:
Kąt utworzą odpowiednie odcinki:
pionowo FA = (a,0)-(a,f(a)) powiększony o odcinek FB = (b,0)-(b,-f(b)) poziomo XAB = (a,0)-(b,0) |
Prostymi równoległymi będzie cięciwa z punktów krańcowych przedziału, oraz ta sama cięciwa przesunięta pionowo w górę o długość odcinka FB.
Poniższy rysunek obrazuje otrzymaną sytuację:

| Zgodnie z twierdzeniem Talesa mamy:
Jeśli podstawimy do tego wzoru długości odcinków:
FA = f(a)
Otrzymamy:
a dalej:
|
Ostatnie przekształcenie ma na celu otrzymanie wzoru o lepszej "zapamiętywalności". Mnożymy mianownik przez (-1), dzięki czemu staje się on spójny z licznikiem ułamka. Sam ułamek zmienia znak na minus.
Algorytm regula falsi jest bardzo podobny do opisanego w
poprzednim rozdziale algorytmu bisekcji.
Założenia wstępne dla badanej funkcji w obu algorytmach są identyczne. Różnią
się one sposobem wyznaczania punktu
W algorytmie regula falsi jest inaczej. Punk
Po wyznaczeniu przybliżonego pierwiastka postępowanie w obu
algorytmach jest w zasadzie takie samo. Sprawdzamy, czy wartość modułu różnicy
pomiędzy dwoma ostatnimi przybliżeniami pierwiastka jest mniejsza od zadanego
minimum. Jeśli tak, obliczenia kończymy zwracając
Obliczamy wartość funkcji w punkcie
Program wyznacza miejsce zerowe funkcji: f(x) = x3(x + sin(x2 - 1) - 1) - 1. Pierwiastków należy poszukiwać w przedziałach <-1,0> i <1,2>.
// Znajdowanie miejsc zerowych
// METODA FAŁSZYWEJ PROSTEJ - REGULA FALSI
// (C)2010 I LO w Tarnowie
//------------------------
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
const double EPS = 0.00001;
// Tutaj definiujemy naszą funkcję
//--------------------------------
double f(double x)
{
return x * x * x * (x + sin(x * x - 1) - 1) - 1;
}
int main()
{
double a,b,x0,fa,fb,f0;
cout << fixed << setprecision(4);
cout << "OBLICZANIE MIEJSC ZEROWYCH FUNKCJI - METODA REGULA FALSI\n"
"--------------------------------------------------------\n\n";
// odczytujemy przedział poszukiwań pierwiastka
cout << "a = "; cin >> a;
cout << "b = "; cin >> b;
cout << endl;
// obliczamy wartości funkcji w punktach a i b
fa = f(a);
fb = f(b);
// sprawdzamy, czy na krańcach funkcja ma różne znaki
if(fa * fb < 0)
{
// pierwiastka szukamy metodą regula falsi
while(true)
{
x0 = a - fa * (b - a) / (fb - fa);
f0 = f(x0);
// sprawdzamy, czy x0 jest przybliżonym pierwiastkiem
if(fabs(f0) < EPS)
{
cout << "x0 = " << x0 << " f(x0) = " << f0 << endl << endl;
break; // pierwiastek znaleziony, przerywamy pętlę
}
// za nowy przedział przyjmujemy połówkę, w której funkcja zmienia znak
if(fa * f0 < 0)
{
b = x0; fb = f0;
}
else
{
a = x0; fa = f0;
}
}
}
else cout << "FUNKCJA NIE SPELNIA WARUNKU NR 3\n\n";
return 0;
}
|
Zbadaj dla obu programów liczbę obiegów wewnętrznej pętli while, która wyznacza kolejne przybliżenia xo i wyciągnij odpowiednie wnioski.
![]() | I Liceum Ogólnokształcące |
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe