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

©2026 mgr Jerzy Wałaszek

obrazek

Pierwiastki funkcji

Metoda siecznych

SPIS TREŚCI REMANENT
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 \(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]}\):

\[
\begin{array}{l}
f(x_0) = 0 \\
f(a) < 0 < f(b) \Rightarrow f(a) < f(x_0) < f(b) \\
f(a) > 0 > f(b) \Rightarrow f(a) > f(x_0) > f(b)
\end{array}
\]

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.


do podrozdziału  do strony 

Algorytm i program

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:

obrazek

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:

obrazek

Do wyznaczenia punktu \(x_3\) stosujemy ten sam wzór, co w metodzie regula falsi:

\[x_3 = \dfrac{f(x_1)x_2 - f(x_2)x_1}{f(x_1) - f(x_2)}\]

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:

obrazek
\[x_4 = \dfrac{f(x_2)x_3 - f(x_3)x_2}{f(x_2) - f(x_3)}\]

Wzory możemy uogólnić:

\(x_1\),\(x_2\) : przybliżenia wstępne, \(x_1,x_2 \in [a;b]\)
\[x_n = \dfrac{f(x_{n-2})x_{n-1} - f(x_{n-1})x_{n-2}}{f(x_{n-2}) - f(x_{n-1})}, \; n > 2\]

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 \(x_n\) 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:

\(\varepsilon_x\) dokładność przybliżenia pierwiastka
\(\varepsilon_y\) dokładność przybliżenia do zera
\(x_1,x_2\) początkowe przybliżenia pierwiastka
\(f( \;)\) funkcja, której pierwiastek będzie obliczany
\(n\) maksymalna liczba aproksymacji

Dane wyjściowe

\(x_n\) przybliżony pierwiastek funkcji

Zmienne pomocnicze

\(f_1,f_2\) wartości funkcji w punktach \(x_1\) i \(x_2\)
\(f_n\) wartość funkcji w punkcie \(x_n\)

Lista kroków

K01: \(f_1 \leftarrow f(x_1) \quad f_2 \leftarrow f(x_2)\) Obliczamy wartości funkcji w podanych punktach startowych
K02: Jeśli \(n = 0\),
to zakończbłędem
inaczej \(n \leftarrow n - 1\)
Sprawdzamy licznik obiegów
K03: \(x_n \leftarrow \dfrac{f_1 \cdot x_2 - f_2 \cdot x_1}{f_1 - f_2}\) Wyznaczamy punkt przecięcia siecznej z osią OX
K04: \(f_n \leftarrow f(x_n)\) Obliczamy wartość funkcji w wyznaczonym punkcie przecięcia
K05: Jeśli \(|f_n| < \varepsilon_y\)
lub
\(|x_n - x_2| < \varepsilon_x\),
to zakończ
Sprawdzamy warunek zakończenia
K06: \(x_1 \leftarrow x_2 \quad f_1 \leftarrow f_2\)
\(x_2 \leftarrow x_n \quad f_2 ← f_n\)
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:

\[f(x) = \sin \left( x^2 - x + \dfrac{1}{3} \right) + \dfrac{x}{2}\]

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.

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
Python (dodatek)
# Pierwiastek funkcji: metoda siecznych
# (c)2026 mgr Jerzy Wałaszek
# Metody numeryczne 0034
#--------------------------------------

from math import sin

# Tutaj definiujemy funkcję,
# której pierwiastek jest wyliczany
#----------------------------------
def f(x):
    return (sin(x * x - x + 1 / 3.0)
            + 0.5 * x)

# Tutaj definiujemy
# parametry początkowe

# Dokładność wyznaczania pierwiastka
EPSX = 1e-14
# Dokładność wyznaczania zera
EPSY = 1e-14
# Punkty startowe
x1 = -1.1
x2 = -1.0
# Maksymalna liczba obiegów
n = 64

# Program główny
#---------------
   
# Zmienna informująca o poprawnym
# zakończeniu metody
result = False
    
print("Obliczanie przybliżonego "
      "pierwiastka funkcji "
      "metodą siecznych\n"
      "-------------------------"
      "--------------------"
      "----------------\n")
    
# Obliczamy i zapamiętujemy
# wartości funkcji na krańcach
f1 = f(x1)
f2 = f(x2)
    
while n > 1:
    n -= 1
        
    # 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 ((abs(fn) < EPSY) or
       (abs(xn - x2) < EPSX)):
        result = True
        break
            
    # Uaktualniamy przybliżenia
    x1 = x2
    f1 = f2
    x2 = xn
    f2 = fn
        
if not result:
    print(
    "Przekroczono liczbę obiegów !!!\n")
        
print(
f"Pierwiastek        xn = {xn:20.15f}\n"
f"Wartość funkcji f(xn) = {fn:20.15f}\n"
f"Dokładność dla x EPSX = {EPSX:20.15f}\n"
f"Dokładność dla y EPSY = {EPSY:20.15f}\n"
f"Liczba obiegów        = {64 - n:4}\n")
input("Naciśnij Enter...")

do podrozdziału  do strony 

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: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.