|
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 |
©2026 mgr Jerzy Wałaszek
|
| SPIS TREŚCI |
| Podrozdziały |
Metoda siecznych (ang. secant method) jest ulepszeniem metody regula falsi. Warunki początkowe są zatem podobne:
Na osi OX wybieramy pewien przedział \({[a;b]}\) o następujących własnościach:
Określoność funkcji oznacza, że dla każdego argumentu \(x\) z przedziału \({[a;b]}\) istnieje wartość funkcji. Warunek ten jest konieczny, ponieważ algorytm bisekcji wybiera punkty w przedziale \({[a;b]}\) i oblicza dla nich wartość funkcji. Jeśli trafi na punkt nieokreśloności, w którym nie można policzyć wartości funkcji, to cała metoda załamie się.
Ciągłość funkcji gwarantuje, iż jej wartości nie wykonują nagłych skoków i dla dowolnych dwóch wartości funkcji w tym przedziale znajdziemy wszystkie wartości pośrednie.
Ten warunek wraz z poprzednim gwarantuje, że w przedziale \({[a;b]}\) istnieje taki argument \(x_0\), dla którego funkcja ma wartość 0, która to wartość jest wartością pośrednią pomiędzy wartościami funkcji na krańcach przedziału \({[a;b]}\):
Dodatkowo w przedziale \({[a;b]}\) pierwsza pochodna funkcji jest różna od zera. Warunek ten gwarantuje nam, iż w tym przedziale funkcja nie posiada minimum/maksimum lokalnego, a co za tym idzie jej sieczna nie będzie równoległa do osi OX, ponieważ algorytm bazuje na znajdowaniu punktów przecięcia siecznych z osią OX.
W przedziale \({[a;b]}\) spełniającym warunki początkowe metody wybieramy dwa punkty początkowe \(x_1\) i \(x_2\), które leżą w tym przedziale. Będą to dwa pierwsze przybliżenia pierwiastka:

Z punktów wykresu o współrzędnych \((x_1,f(x_1))\) i \((x_2,f(x_2))\) prowadzimy sieczną i wyznaczamy punkt \(x_3\), który jest punktem przecięcia tej siecznej z osią OX:

Do wyznaczenia punktu \(x_3\) stosujemy ten sam wzór, co w metodzie regula falsi:
Sprawdzamy, czy w wyznaczonym punkcie wartość funkcji jest dostatecznie bliska zeru. Jeśli tak, to kończymy z wynikiem \(x_3\). Jeśli nie, to za nowe przybliżenia przyjmujemy dwa ostatnie \(x_2\) i \(x_3\) i kontynuujemy obliczenia wg tej samej metody:

Wzory możemy uogólnić:
Metoda siecznych jest zwykle szybko zbieżna do pierwiastka funkcji. Jednak po wybraniu złych punktów początkowych może się zdarzyć, iż nie będzie ona zbieżna. Dlatego należy zastosować licznik kolejnych przybliżeń, a po przekroczeniu zadanej ich liczby algorytm powinien zatrzymać się z błędem.
Istnieją dwa warunki poprawnego zakończenia obliczeń:
Poniższy program jest przykładową realizacją algorytmu siecznych. Program oblicza pierwiastek funkcji:
Wykres tej funkcji w przedziale \([-3;1]\) jest następujący:

Z wykresu wynika, iż pierwiastek znajduje się w przedziale \([-1,1;-1]\). Jako przybliżenia początkowe wybieramy krańce tego przedziału.
C++// Pierwiastek funkcji: metoda siecznych
// (C)2019 mgr Jerzy Wałaszek
// Metody numeryczne 0034
//--------------------------------------
#include <iostream>
#include <windows.h>
#include <cmath>
#include <iomanip>
using namespace std;
// Tutaj definiujemy funkcję,
// której pierwiastek jest wyliczany
//----------------------------------
double f(double x)
{
return sin(x*x-x+1/3.0)+0.5*x;
}
// Tutaj definiujemy parametry początkowe
// Dokładność wyznaczania pierwiastka
double EPSX = 1e-14;
// Dokładność wyznaczania zera
double EPSY = 1e-14;
// Punkty startowe
double x1 = -1.1;
double x2 = -1.0;
// Maksymalna liczba obiegów
int n = 64;
// Program główny
//---------------
int main()
{
// Zmienne
double f1,f2,fn,xn;
// Zmienna informująca o poprawnym
// zakończeniu metody
bool result = false;
SetConsoleOutputCP(CP_UTF8);
SetConsoleCP(CP_UTF8);
cout << setprecision(15)
<< fixed;
cout <<
"Obliczanie przybliżonego pierwiastka "
"funkcji metodą siecznych\n"
"-------------------------------------"
"------------------------\n\n";
// Obliczamy i zapamiętujemy
// wartości funkcji na krańcach
// przedziału <a;b>
f1 = f(x1);
f2 = f(x2);
while(--n)
{
// Obliczamy punkt przecięcia
// siecznej z osią OX
xn = (f1 * x2 - f2 * x1) / (f1 - f2);
// Obliczamy wartość funkcji
// w punkcie przecięcia
fn = f(xn);
// sprawdzamy warunki zakończenia
if((fabs(fn)< EPSy) ||
(fabs(xn - x2) < EPSX))
{
result = true;
break;
}
// Uaktualniamy przybliżenia
x1 = x2; f1 = f2;
x2 = xn; f2 = fn;
}
if(!result)
cout <<
"Przekroczono liczbę obiegów !!!\n\n";
cout << "Pierwiastek xn = "
<< setw(20) << xn << endl
<< "Wartość funkcji f(xn) = "
<< setw(20) << fn << endl
<< "Dokładność dla x EPSX = "
<< setw(20) << EPSX << endl
<< "Dokładność dla y EPSY = "
<< setw(20) << EPSY << endl
<< "Liczba obiegów = "
<< setw(4) << 64 - n;
cout << endl << endl;
system("pause");
return 0;
}
|
| Wynik |
Obliczanie przybliżonego pierwiastka funkcji metodą siecznych ------------------------------------------------------------- Pierwiastek xn = -1.077713513691340 Wartość funkcji f(xn) = 0.000000000000000 Dokładność dla x EPSX = 0.000000000000010 Dokładność dla y EPSY = 0.000000000000010 Liczba obiegów = 5 |
Porównaj otrzymany wynik z dwiema poprzednimi metodami:
Obliczanie przybliżonego pierwiastka funkcji metodą bisekcji ------------------------------------------------------------ Pierwiastek x0 = -1.077713513691339 Wartość funkcji f(x0) = 0.000000000000002 Dokładność dla x EPSX = 0.000000000000010 Dokładność dla y EPSY = 0.000000000000010 Liczba obiegów i = 44 |
Obliczanie przybliżonego pierwiastka funkcji metodą regula falsi ---------------------------------------------------------------- Pierwiastek x0 = -1.077713513691340 Wartość funkcji f(x0) = 0.000000000000000 Dokładność dla y EPSY = 0.000000000000010 Liczba obiegów = 9 |
![]() |
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.