|
Serwis Edukacyjny Nauczycieli I-LO w Tarnowie
Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy Wałaszek |
©2026 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ę f(x)
oraz przedział

Gdy funkcja f(x)
spełnia podane warunki, to w przedziale

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
poziomo
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ść
Poniższy rysunek obrazuje otrzymaną sytuację:

Zgodnie z twierdzeniem Talesa mamy:

Jeśli podstawimy do tego wzoru długości odcinków:

Otrzymamy:

a dalej:

Ostatnie przekształcenie ma na celu otrzymanie wzoru o lepszej
"zapamiętywalności". Mnożymy mianownik przez
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
| f(x) | – | funkcja, której pierwiastek liczymy. Musi spełniać warunki podane na początku tego rozdziału. |
| a,b | – | punkty krańcowe przedziału poszukiwań pierwiastka funkcji f(x); a,b ∈ R |
| x0 | – | pierwiastek funkcji f(x) |
| fa, fb, fo | – | wartości funkcji odpowiedniow punktach a, b, xo; fa, fb, f0 ∈ R |
| x1 | – | przechowuje poprzednią wartość przybliżenia x0 |
| εo | – | określa dokładność porównania z zerem; εo = 0.0000000001 |
| εx | – | określa dokładność wyznaczania pierwiastka x0; εx = 0.0000000001 |
| K01: | Czytaj a i b | |
| K02: | fa ←
f(a); fb ←
f(b); x1 ← a; x0 ← b |
|
| K03: | Jeśli fa ·
fb > 0, to pisz "Brak pierwiastka" i zakończ |
|
| K04: | Dopóki | x1
- x0 | >
εx: wykonuj kroki K05 ... K08 |
|
| K05: | x1 ← x0 | |
| K06: |
![]() |
|
| K07: | Jeśli
| f0 | < ε0, to idź do kroku K09 |
|
| K08: | Jeśli fa
·
f0 < 0, to b ← x0; fb ← f0, inaczej a ← x0; fa ← f0 |
|
| K09: | Pisz x0 | |
| K10: | Zakończ |

Algorytm Regula Falsi jest bardzo podobny do algorytmu bisekcji. Zmiany zaznaczono na schemacie blokowym zielonym kolorem elementów.
Odczytujemy zakres poszukiwań pierwiastka danej funkcji. W zmiennych
fa
i fb umieszczamy wartość funkcji
na krańcach tego zakresu. Inicjujemy
Pierwszy test ma na celu sprawdzenie warunku różnych znaków wartości funkcji
na krańcach przedziału
Rozpoczynamy pętlę wyliczania kolejnych przybliżeń pierwiastka funkcji. Pętla
wykonywana jest do momentu, gdy dwa ostatnio obliczone pierwiastki różnią się o
Na początku pętli do
Za nowy przedział
Programy wyznaczają miejsce zerowe funkcji:

Pierwiastków należy poszukiwać w przedziałach
C++// Program znajduje miejsce
// zerowe funkcji f(x) za
// pomocą algorytmu
// regula falsi
// ------------------------
// (C)2006 mgr J.Wałaszek
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
using namespace std;
// dokładność porównania z zerem
const double EPS0 = 0.0000000001;
// dokładność wyznaczenia pierwiastka
const double EPSX = 0.0000000001;
// 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,x1,fa,fb,f0;
cout << setprecision(8)
<< fixed
<< "Obliczanie pierwiastka funkcji\n"
"za pomoca metody Regula Falsi\n"
"f(x) = x^3*(x+sin(x^2-1)-1)-1\n"
"------------------------------\n"
" (C)2006 mgr Jerzy Walaszek\n\n"
"Podaj przedzial poszukiwan:\n\n";
cout << "a = "; cin >> a;
cout << "b = "; cin >> b;
cout << "\nWYNIK:\n\n";
fa = f(a);
fb = f(b);
x1 = a;
x0 = b;
if(fa * fb > 0) cout << "Brak pierwiastka\n";
else
{
while(fabs(x1 - x0) > EPSX)
{
x1 = x0;
x0 = a - fa * (b - a) / (fb - fa);
f0 = f(x0);
if(fabs(f0) < EPS0) break;
if(fa * f0 < 0)
{
b = x0; fb = f0;
}
else
{
a = x0; fa = f0;
}
}
cout << "x0 = " << setw(15) << x0 << endl;
}
cout << endl;
system("pause");
return 0;
}
|
Pascal// Program znajduje miejsce
// zerowe funkcji f(x) za
// pomocą algorytmu
// Regula Falsi
// ------------------------
// (C)2006 mgr J.Wałaszek
program mzf1;
uses math;
const
// dokładność porównania z zerem
EPS0 = 0.0000000001;
// dokładność wyznaczenia pierwiastka
EPSX = 0.0000000001;
// 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,x1,fa,fb,f0 : double;
begin
writeln('Obliczanie pierwiastka funkcji');
writeln('za pomoca metody Regula Falsi');
writeln('f(x) = x^3*(x+sin(x^2-1)-1)-1');
writeln('------------------------------');
writeln(' (C)2006 mgr Jerzy Walaszek');
writeln;
writeln('Podaj przedzial poszukiwan:');
writeln;
write('a = '); readln(a);
write('b = '); readln(b);
writeln;
writeln('WYNIK:');
writeln;
fa := f(a);
fb := f(b);
x1 := a;
x0 := b;
if fa * fb > 0 then
writeln('Brak pierwiastka')
else
begin
while abs(x1 - x0) > EPSX do
begin
x1 := x0;
x0 := a - fa * (b - a) / (fb - fa);
f0 := f(x0);
if abs(f0) < EPS0 then break;
if fa * f0 < 0 then
begin
b := x0; fb := f0;
end
else
begin
a := x0; fa := f0;
end;
end;
writeln('x0 = ',x0:15:8);
end;
writeln;
writeln('Nacisnij Enter...');
readln;
end.
|
Basic' Program znajduje miejsce
' zerowe funkcji f(x) za
' pomocą algorytmu
' Regula Falsi
' ------------------------
' (C)2006 mgr J.Wałaszek
Declare Function f(x As Double) _
As Double
' dokładność porównania z zerem
Const EPS0 As Double = 0.0000000001
' dokładność wyznaczenia pierwiastka
Const EPSX As Double = 0.0000000001
'---------------
' Program główny
'---------------
Dim As double a, b, x0, x1, fa, fb, f0
Print "Obliczanie pierwiastka funkcji"
Print "za pomoca metody Regula Falsi"
Print "f(x) = x^3*(x+sin(x^2-1)-1)-1"
Print "------------------------------"
Print " (C)2006 mgr Jerzy Walaszek"
Print
Print "Podaj przedzial poszukiwan:"
Print
Input "a = ", a
Input "b = ", b
Print
Print "WYNIK:"
Print
fa = f(a)
fb = f(b)
x1 = a
x0 = b
If fa * fb > 0 Then
Print "Brak pierwiastka"
Else
While Abs(x1 - x0) > EPSX
x1 = x0
x0 = a - fa * (b - a) / (fb - fa)
f0 = f(x0)
If Abs(f0) < EPS0 Then Exit While
If fa * f0 < 0 Then
b = x0 : fb = f0
Else
a = x0 : fa = f0
End If
Wend
Print Using "x0 = ######.########"; x0
End If
Print
Print "Nacisnij 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
|
Python
(dodatek)# Program znajduje miejsce
# zerowe funkcji f(x) za
# pomocą algorytmu
# Regula Falsi
# ------------------------
# (C)2006 mgr J.Wałaszek
import math
# Funkcja, której miejsce
# zerowe obliczamy
# f(x) = x^3*(x+sin(x^2-1)-1)-1
# <-1,0> i <1,2>
def f(x):
return x * x * x * \
(x+math.sin(x*x-1)-1)-1
# dokładność porównania z zerem
EPS0 = 0.0000000001
# dokładność wyznaczenia pierwiastka
EPSX = 0.0000000001
#---------------
# Program główny
#---------------
print("Obliczanie pierwiastka funkcji")
print("za pomocą metody Regula Falsi")
print("f(x) = x^3*(x+sin(x^2-1)-1)-1")
print("------------------------------")
print(" (C)2026 mgr Jerzy Wałaszek")
print()
print("Podaj przedział poszukiwań:")
print()
a = float(input("a = "))
b = float(input("b = "))
print()
print("WYNIK:")
print()
fa = f(a)
fb = f(b)
x1 = a
x0 = b
if fa * fb > 0:
print("Brak pierwiastka")
else:
while abs(x1 - x0) > EPSX:
x1 = x0
x0 = a-fa*(b-a)/(fb-fa)
f0 = f(x0)
if abs(f0) < EPS0: break
if fa * f0 < 0:
b, fb = x0, f0
else:
a, fa = x0, f0
print("x0 = %15.8f" % x0)
print()
input("Naciśnij Enter...")
|
| Wynik: |
Obliczanie pierwiastka funkcji za pomocą metody Regula Falsi f(x) = x^3*(x+sin(x^2-1)-1)-1 ------------------------------ (C)2026 mgr Jerzy Wałaszek Podaj przedział poszukiwań: a = 1 b = 2 WYNIK: x0 = 1.18983299 Naciśnij Enter... |
JavaScript<html>
<head>
</head>
<body>
<div style="overflow-x: auto;"
align="center">
<table
border="0"
cellpadding="4"
style="border-collapse:
collapse">
<tr>
<td nowrap>
<form
name="frmbincode"
style="text-align: center;
background-color:
#E7E7DA;
class=nomargin">
<b><big>
Obliczanie<br>
pierwiastka funkcji<br>
metodą Regula Falsi
</big></b><br><br>
f(x) = x<sup>3</sup>(x +
sin(x<sup>2</sup>-1)-1)-1<br>
<br>
(C)2026
mgr Jerzy Wałaszek
I LO w Tarnowie
<hr>
Wpisz do pól edycyjnych<br>
krańce przedziału<br>
poszukiwań pierwiastka<br>
<br>
a = <input
type="text"
name="inp_a"
size="16"
value="1"
style="text-align:
right">
<br>
b = <input
type="text"
name="inp_b"
size="16"
value="2"
style="text-align:
right">
<hr>
<input
type="button"
value="Szukaj"
name="B1"
onclick="main()">
<hr>
<b>Wynik:</b>
<div id="out">.</div>
</form>
</td>
</tr>
</table>
</div>
<script language=javascript>
// Program znajduje miejsce
// zerowe funkcji f(x)
// za pomocą algorytmu
// regula falsi
// ------------------------
// (C)2006 mgr J.Wałaszek
// dokładność porównania z zerem
var EPS0 = 0.0000000001
// dokładność wyznaczenia
// pierwiastka
var EPSX = 0.0000000001
// 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,x1,fa,fb,f0,t
a = parseFloat(document
.frmbincode.inp_a.value)
b = parseFloat(document
.frmbincode.inp_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)
x1 = a; x0 = b
if(fa * fb > 0)
t = "<font color=red><b>" +
"Brak pierwiastka" +
"</b></font>"
else
{
while(Math.abs(x1 - x0) > EPSX)
{
x1 = x0
x0 = a - fa * (b - a) /
(fb - fa)
f0 = f(x0)
if(Math.abs(f0) < EPS0)
break
if(fa * f0 < 0)
{
b = x0
fb = f0
}
else
{
a = x0
fa = f0
}
}
t += x0
}
}
t = "<nobr>" + t + "</nobr>"
document.getElementById("out")
.innerHTML = t
}
</script>
</body>
</html> |
Tutaj możesz przetestować działanie prezentowanego skryptu. Pierwiastków należy poszukiwać 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 ©2026 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:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.