Serwis Edukacyjny w I-LO w Tarnowie ![]() Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy Wałaszek |
©2023 mgr Jerzy Wałaszek
|
W naszym serwisie jest nowszy artykuł o obliczaniu pierwiastków funkcji: "Metody numeryczne".
SPIS TREŚCI |
Podrozdziały |
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
|
Gdy funkcja
Wyznaczamy punkt xo
jako środek przedziału
Obliczamy wartość funkcji w punkcie xo.
Jeśli długość przedziału jest mniejsza od założonej dokładności wyliczeń
pierwiastka, to wartość xo
jest poszukiwanym przybliżeniem. Kończymy algorytm. W przeciwnym razie
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ę [
f(x) | – | funkcja, której pierwiastek liczymy. Musi być ciągła i określona w przedziale poszukiwań pierwiastka. |
a,b | – | punkty krańcowe przedziału poszukiwań pierwiastka funkcji f(x). a,b ∈ R |
xo | – | pierwiastek funkcji f(x) |
fa , fb , fo | – wartości funkcji odpowiednio w punktach a, b, xo. fa , fb , fo ∈ R | |
εo | – określa dokładność porównania z zerem. | εo = 0.0000000001 |
εx | – określa dokładność wyznaczania pierwiastka xo. | εx = 0.0000000001 |
K01: | Czytaj a i b | |
K02: | fa ← f(a) ; fb ← f(b) | |
K03: | Jeśli fa ·
fb > 0, to pisz "Funkcja nie spełnia założeń" i zakończ |
|
K04: | Dopóki | a - b | > εx: wykonuj kroki K05...K07 |
|
K05: |
![]() |
|
K06: | Jeśli | fo | < εo, to idź do kroku K08 |
|
K07: | eśli fa
·
fo < 0, to b ← xo inaczej a ← xo; fa ← fo |
|
K08: | Pisz xo i zakończ |
Wykonanie algorytmu rozpoczynamy od odczytu zakresu poszukiwań pierwiastka danej funkcji. W zmiennych fa i fb umieszczamy wartość funkcji na krańcach tego zakresu
Pierwszy test ma na celu sprawdzenie warunku różnych znaków wartości funkcji na krańcach zakresu poszukiwań pierwiastka. Różne znaki gwarantują nam istnienie pierwiastka w danym zakresie. Zatem jeśli funkcja na krańcach nie przybiera różnych znaków, wypisujemy odpowiedni komunikat i kończymy algorytm.
Rozpoczynamy pętlę wyliczania kolejnych przybliżeń pierwiastka funkcji. Pętla
wykonuje się do momentu, aż przedział poszukiwań pierwiastka osiągnie długość
Wewnątrz pętli wyznaczamy punkt
W przeciwnym razie za nowy przedział
Programy wyznaczają miejsce zerowe funkcji:
Pierwiastków należy poszukiwać w przedziałach [-1,0] i [1,2].
C++// Program znajduje miejsce zerowe funkcji f(x) // za pomocą algorytmu połowienia - bisekcji //--------------------------------------------- // (C)2006 mgr J.Wałaszek I LO w Tarnowie #include <iostream> #include <iomanip> #include <cmath> #include <cstdlib> using namespace std; const double EPS0 = 0.0000000001; // dokładność porównania z zerem const double EPSX = 0.0000000001; // dokładność wyznaczenia pierwiastka // Funkcja, której miejsce zerowe obliczamy // f(x) = x^3*(x+sin(x^2-1)-1)-1 // <-1,0> i <1,2> //----------------------------------------- double f(double x) { return x * x * x * (x + sin(x * x - 1) - 1) - 1; } //----------------------------------------------------- // Program główny //----------------------------------------------------- int main() { double a,b,x0,fa,fb,f0; cout << setprecision(5) // 5 cyfr po przecinku << fixed; // format stałoprzecinkowy cout << "Obliczanie pierwiastka funkcji - metoda bisekcji\n" "f(x) = x^3*(x+sin(x^2-1)-1)-1\n" "------------------------------------------------\n" "(C)2006 mgr Jerzy Walaszek I LO w Tarnowie\n\n" "Podaj zakres poszukiwan pierwiastka:\n\n"; cout << "a = "; cin >> a; cout << "b = "; cin >> b; cout << "\n------------------------------------------------\n\n" "WYNIK:\n\n"; fa = f(a); fb = f(b); if(fa * fb > 0) cout << "Funkcja nie spelnia zalozen\n"; else { while(fabs(a - b) > EPSX) { x0 = (a + b) / 2; f0 = f(x0); if(fabs(f0) < EPS0) break; if(fa * f0 < 0) b = x0; else { a = x0; fa = f0; } } cout << "x0 = " << setw(15) << x0 << endl; } cout << "\n------------------------------------------------\n\n"; system("pause"); return 0; } |
Pascal// Program znajduje miejsce zerowe funkcji f(x) // za pomocą algorytmu połowienia - bisekcji //--------------------------------------------- // (C)2006 mgr J.Wałaszek I LO w Tarnowie program mzf1; uses math; const EPS0 = 0.0000000001; // dokładność porównania z zerem EPSX = 0.0000000001; // dokładność wyznaczenia pierwiastka // Funkcja, której miejsce zerowe obliczamy // f(x) = x^3*(x+sin(x^2-1)-1)-1 // <-1,0> i <1,2> //----------------------------------------- function f(x : real) : double; begin Result := x * x * x * (x + sin(x * x - 1) - 1) - 1; end; //----------------------------------------------------- // Program główny //----------------------------------------------------- var a,b,x0,fa,fb,f0 : double; begin writeln('Obliczanie pierwiastka funkcji - metoda bisekcji'); writeln('f(x) = x^3*(x+sin(x^2-1)-1)-1'); writeln('------------------------------------------------'); writeln('(C)2006 mgr Jerzy Walaszek I LO w Tarnowie'); writeln; writeln('Podaj zakres poszukiwan pierwiastka:'); writeln; write('a = '); readln(a); write('b = '); readln(b); writeln; writeln('------------------------------------------------'); writeln('WYNIK:'); writeln; fa := f(a); fb := f(b); if fa * fb > 0 then writeln('Funkcja nie spelnia zalozen') else begin while abs(a - b) > EPSX do begin x0 := (a + b) / 2; f0 := f(x0); if abs(f0) < EPS0 then break; if fa * f0 < 0 then b := x0 else begin a := x0; fa := f0; end; end; writeln('x0 = ',x0:15:8); end; writeln; writeln('------------------------------------------------'); writeln('Koniec. Nacisnij klawisz Enter...'); readln; end. |
Basic' Program znajduje miejsce zerowe funkcji f(x) ' za pomocą algorytmu połowienia - bisekcji '--------------------------------------------- ' (C)2006 mgr J.Wałaszek I LO w Tarnowie Declare Function f(x As Double) As Double Const EPS0 As Double = 0.0000000001 ' dokładność porównania z zerem Const EPSX As Double = 0.0000000001 ' dokładność wyznaczenia pierwiastka '----------------------------------------------------- ' Program główny '----------------------------------------------------- Dim As double a, b, x0, fa, fb, f0 Print "Obliczanie pierwiastka funkcji - metoda bisekcji" Print "f(x) = x^3*(x+sin(x^2-1)-1)-1" Print "------------------------------------------------" Print "(C)2006 mgr Jerzy Walaszek I LO w Tarnowie" Print Print "Podaj zakres poszukiwan pierwiastka:" Print Input "a = ", a Input "b = ", b Print Print "------------------------------------------------" Print Print "WYNIK:" Print fa = f(a) : fb = f(b) If fa * fb > 0 Then Print "Funkcja nie spelnia zalozen" Else While Abs(a - b) > EPSX x0 = (a + b) / 2 : f0 = f(x0) If Abs(f0) < EPS0 Then Exit While If fa * f0 < 0 Then b = x0 Else a = x0 : fa = f0 End If Wend Print Using "x0 = ######.########"; x0 End If Print Print "------------------------------------------------" Print Print "Koniec. Nacisnij klawisz Enter..." Sleep End ' Funkcja, której miejsce zerowe obliczamy ' f(x) = x^3*(x+sin(x^2-1)-1)-1 ' <-1,0> i <1,2> '----------------------------------------- Function f(x As Double) As Double Return x * x * x * (x + Sin(x * x - 1) - 1) - 1 End Function |
JavaScript<html> <head> </head> <body> <div align="center"> <form style="BORDER-RIGHT: #ff9933 1px outset; PADDING-RIGHT: 4px; BORDER-TOP: #ff9933 1px outset; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: #ff9933 1px outset; PADDING-TOP: 1px; BORDER-BOTTOM: #ff9933 1px outset; BACKGROUND-COLOR: #ffcc66" name="frmbincode"> <h3 style="TEXT-ALIGN: center"> Obliczanie pierwiastka funkcji metodą bisekcji </h3> <p style="TEXT-ALIGN: center"> <i>f(x) = x<sup>3</sup>(x + sin(x<sup>2</sup> - 1) - 1) - 1</i> </p> <p style="TEXT-ALIGN: center"> (C)2006 mgr Jerzy Wałaszek I LO w Tarnowie </p> <hr> <p style="text-align: center"> Wpisz do pól edycyjnych zakres przedziału poszukiwań pierwiastka </p> <div align="center"> <table border="0" id="table144" cellpadding="8" style="border-collapse: collapse"> <tr> <td> a = <input type="text" name="wsp_a" size="20" value="1" style="text-align: right"> </td> <td> b = <input type="text" name="wsp_b" size="20" value="2" style="text-align: right"> </td> <td> <input type="button" value="Szukaj pierwiastka" name="B1" onclick="main()"> </td> </tr> </table> </div> <div id="out" align=center>...</div> </form> <script language=javascript> // Program znajduje miejsce zerowe funkcji f(x) // za pomocą algorytmu połowienia - bisekcji //--------------------------------------------- // (C)2006 mgr J.Wałaszek I LO w Tarnowie var EPS0 = 0.0000000001; // dokładność porównania z zerem var EPSX = 0.0000000001; // dokładność wyznaczenia pierwiastka // Funkcja, której miejsce zerowe obliczamy // f(x) = x^3*(x+sin(x^2-1)-1)-1 // <-1,0> i <1,2> //----------------------------------------- function f(x) { return x * x * x * (x + Math.sin(x * x - 1) - 1) - 1; } //----------------------------------------------------- // Program główny //----------------------------------------------------- function main() { var a,b,x0,fa,fb,f0,t; a = parseFloat(document.frmbincode.wsp_a.value); b = parseFloat(document.frmbincode.wsp_b.value); if(isNaN(a) || isNaN(b)) t = "<font color=red><b>Złe krańce zakresu poszukiwań pierwiastka!</b></font>"; else { t = "x<sub>o</sub> = "; fa = f(a); fb = f(b); if(fa * fb > 0) t = "<font color=red><b>Funkcja nie spelnia zalozen</b></font>"; else { while(Math.abs(a - b) > EPSX) { x0 = (a + b) / 2; f0 = f(x0); if(Math.abs(f0) < EPS0) break; if(fa * f0 < 0) b = x0; else { a = x0; fa = f0; } } t += x0; } } document.getElementById("out").innerHTML = t; } </script> </div> </body> </html> |
Wynik: |
Obliczanie pierwiastka
funkcji - metoda bisekcji f(x) = x^3*(x+sin(x^2-1)-1)-1 ------------------------------------------------ (C)2006 mgr Jerzy Wałaszek I LO w Tarnowie Podaj zakres poszukiwań pierwiastka: a = 1 b = 2 ------------------------------------------------ WYNIK: x0 = 1,18983299 ------------------------------------------------ Koniec. Naciśnij klawisz Enter... |
Tutaj możesz przetestować działanie prezentowanego skryptu. Przykładowa
funkcja posiada pierwiastki w przedziałach
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2023 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.