Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

Autor artykułu: mgr Jerzy Wałaszek

©2019 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Pierwiastki funkcji

Metoda siecznych

SPIS TREŚCI
Podrozdziały

Warunki początkowe

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:

Funkcja jest określona w przedziale [a,b]

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ę.

Funkcja jest ciągła w przedziale [a,b]

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.

Na krańcach przedziału [a,b] funkcja ma różne znaki

Ten warunek wraz z poprzednim gwarantuje, że w przedziale [a,b] istnieje taki argument x0, 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]:

obrazek

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.

Na początek:  podrozdziału   strony 

Algorytm i program

W przedziale [a,b] spełniającym warunki początkowe metody wybieramy dwa punkty początkowe x1 i x2, które leżą w tym przedziale. Będą to dwa pierwsze przybliżenia pierwiastka:

obrazek

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

obrazek

Do wyznaczenia punktu x3 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 x3. Jeśli nie, to za nowe przybliżenia przyjmujemy dwa ostatnie x2 i x3 i kontynuujemy obliczenia wg tej samej metody:

obrazek

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ń:

  1. Gdy wartość funkcji w wyznaczonym punkcie xn jest dostatecznie bliska zeru.
  2. Gdy odległość dwóch ostatnio wyliczonych przybliżeń pierwiastka jest mniejsza od założonej dokładności wyznaczania pierwiastka.

Algorytm metody siecznych

Dane wejściowe:

εx dokładność przybliżenia pierwiastka
εy dokładność przybliżenia do zera
x1,x2 początkowe przybliżenia pierwiastka
f() funkcja, której pierwiastek będzie obliczany
n maksymalna liczba aproksymacji

Dane wyjściowe

xn przybliżony pierwiastek funkcji

Zmienne pomocnicze

f1,f2 wartości funkcji w punktach x1 i x2
fn wartość funkcji w punkcie xn

Lista kroków

K01: f1 ← f(x1)
f2 ← f(x2)
Obliczamy wartości funkcji w podanych punktach startowych
K02: Jeśli n = 0, to zakończ z błędem
Inaczej n ← n - 1
Sprawdzamy licznik obiegów
K03: Wyznaczamy punkt przecięcia siecznej z osią OX
K04: fn  ← f(xn) Obliczamy wartość funkcji w wyznaczonym punkcie przecięcia
K05: Jeśli (|fn| < εy) lub (|xn - x2| < εx), to zakończ Sprawdzamy warunek zakończenia
K06: x1 ← x2, f1 ← f2
x2 ←xn, f2 ← fn
Uaktualniamy dwa ostatnie przybliżenia
K07: Idź do kroku K02 Kontynuujemy obliczenia w następnym obiegu pętli.

Poniższy program jest przykładową realizacją algorytmu siecznych. Program oblicza pierwiastek funkcji:

obrazek

Wykres tej funkcji w przedziale [-3,1] jest następujący:

obrazek

Z wykresu wynika, iż pierwiastek znajduje się w przedziale [-1,1 , -1]. Jako przybliżenia początkowe wybieramy krańce tego przedziału.

Przykładowy program w języku C++
// Pierwiastek funkcji - metoda siecznych
// (C)2019 mgr Jerzy Wałaszek
// Metody numeryczne
//------------------------------------------

#include <iostream>
#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

double epsx = 1e-14; // Dokładność wyznaczania pierwiastka
double epsy = 1e-14; // Dokładność wyznaczania zera
double x1   = -1.1;  // Punkty startowe
double x2   = -1.0;
int n       = 64;    // Maksymalna liczba obiegów

// Program główny
//---------------

int main()
{
    // Zmienne

    double f1,f2,fn,xn;
    bool result = false; // Zmienna informująca o poprawnym zakończeniu metody

    setlocale(LC_ALL,"");

    cout << setprecision(15) << fixed;
    cout << "Obliczanie przybliżonego pierwiastka funkcji metodą siecznych" << endl
         << "-------------------------------------------------------------" << endl << endl;

    // 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 !!!" << endl << endl;

    cout << "Pierwiastek        xn = " << setw(18) << xn << endl
         << "Wartość funkcji f(xn) = " << setw(18) << fn << endl
         << "Dokładność dla x epsx = " << setw(18) << epsx << endl
         << "Dokładność dla y epsy = " << setw(18) << epsy << endl
         << "Liczba obiegów        = " << 64 - n;

    cout << endl << endl;

    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.077713513691339
Wartość funkcji f(x0) =  0.000000000000001
Dokładność dla y epsy =  0.000000000000010
Liczba obiegów        = 9
Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2019 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.