Prezentowane materiały są przeznaczone dla uczniów szkół ponadgimnazjalnych. 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 2 - 4 = 4 - 4 = 0 |
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