You are on page 1of 5

Metody Numeryczne

Znajdywanie pierwiastków funkcji


Lidia Łuczkiewicz

1 Metoda bisekcji
W celu wyznaczenia pierwiastka startujemy z przedziału początkowego [a0 , b0 ], w którym podejrze-
wamy istnienie pierwiastka. Jeśli przedział jest dostatecznie mały, warunkiem koniecznym istnienia
pierwiastka funkcji f (x) jest f (a0 ) · f (b0 ) < 0 (wartośći funkcji na krańcach przedziału mają różne
znaki). W n-tej iteracji:
1. Wyznaczamy punkt środkowy cn przedziału [an , bn ]

an + bn
cn =
2

2. Badamy znaki iloczynów wartości na końcach przedziałów

f (an ) · f (cn ) oraz f (an ) · f (cn )

i wybieramy ten przedział, dla którego iloczyn jest mniejszy od zera (warunek konieczny
istnienia pierwiastka).
3. Kroki powtarzamy aż do osiągnięcia porządanej dokładności. W implementacji algorytmu
przyjęto jako warunek stopu f (cn ) <= 1e − 15. Początkowy warunek f (cn ) <= eps, gdzie
eps jest zmienną systemową Matlaba (eps ≈ 2.2204e − 16) nie prowadził do zakończenia
wykonywania się kodu.
Implementacja algorytmu w Matlabie, gdzie xf - znaleziony pierwiastek funkcji, pk - wartość
funkcji w punkcie końcowym, iter - liczba wykonanych iteracji.
function [ xf , iter , pk ] = bisekcja (f , a0 , b0 )

an = a0 ;
bn = b0 ;
cn = ( an + bn ) /2;
iter = 1;
while abs ( f ( cn ) ) > 1e -15
if f ( cn ) * f ( an ) < 0
bn = cn ;
end

if f ( bn ) * f ( cn ) < 0
an = cn ;
end
cn = ( an + bn ) /2;
xf = cn ;
iter = iter + 1;
end

pk = f ( xf ) ;
Do znalezienia wszystkich pierwiastków w danym przedziale należy najpierw oszacować przedziały
ich izolacji. W tym celu zastosowano następujący prosty algorytm.
function [a , b ] = section (f , a0 , b0 )
k = ( b0 - a0 ) / 10;

1
a = a0 ;
b = a0 + k ;

while f ( a ) * f ( b ) > 0
b=b+k;
end
, gdzie [a0 , b0 ] jest przedziałem, z którego szacujemy przedział izolacji. Sposób działania algorytmu:
1
1. Wyznaczany jest krok k jako 10 długości przedziału początkowego.
2. Jako krańce przedziału izolacji przyjmujemy [a0 , a0 + k].
3. Długość przedziału jest zwiększana o k dopóki nie zostanie spełniony warunek istnienia pier-
wiastka (różne znaki funkcji na krańcach przedziału).
Uwaga! Algorytm znajduje przedział o początku w a0 i o DOWOLNYM spełniającym warunki
końcu. Należy zatem po zastosowaniu metody bisekcji zweryfikować należenie pierwiastka do żą-
danego przedziału.
Automatyczne przesuwanie przedziału izolacji zaimplementowano w Matlabie w następujący spo-
sób.
function [x , izolacje , iters , pks ] = pierwiastki (f , a , b )

i = 1;
[ x1 , x2 ] = section (f , a , b ) ;
izolacje (i , 1) = x1 ;
izolacje (i , 2) = x2 ;

while true
[ xf , iter , pk ] = bisekcja (f , x1 , x2 ) ;
if x2 >= b
break
end
iters ( i ) = iter ;
x ( i ) = xf ;
pks ( i ) = pk ;
izolacje (i , 1) = x1 ;
izolacje (i , 2) = x2 ;
i = i + 1;
a = x2 ;
[ x1 , x2 ] = section (f , a , b ) ;
end

2 Porównanie metody bisekcji oraz Newtona


Dla funkcji
f (x) = f (x) = 1.15sin(x) + 2ln(x + 2) − 5.5
szukano pierwiastków w przedziale [5, 11] metodą bisekcji oraz Newtona. Dla metody Newtona
przyjęto delta = 1e − 15. Wyniki przedstawiono w tabelach 1. i 2. oraz zaznaczono na wykresie
funkcji znalezione pierwiastki.

przedział izolacji [a, b] pierwiastek (pk) f (a) f (b) f (pk) liczba iteracji
[5, 7.4] 7.3795 −2.7109 0.0149 0.8882e − 15 48
[7.4, 8.84] 8.7043 0.0149 −0.0987 0 45

Tabela 1: wyniki metody bisekcji

Obie metody są skuteczne z dobrym przybliżeniem znajdują pierwiastki funkcji. Warto zauwa-
żyć, że wartości funkcji dla pierwiastka pk = 8.7043 są co do modułu w niewielkim przybliżeniu
równe, ale mają różne znaki. Wynika z tego, że znalezione wartości są tak naprawdę różne. Me-
toda Newtona jest dużo szybsza - już po kilku iteracjach zwraca szukane wartości, metoda bisekcji
potrzebuje ich kilkadziesiąt, żeby osiągnąć taką samą dokładność.

2
punkt początkowy (pp) pierwiastek (pk) f (pp) f (pk) liczba iteracji
5 8.7043 −2.7109 0 6
7.4 7.3795 0.0149 −8.8818e − 16 4

Tabela 2: wyniki metody Newtona

(a) metoda bisekcji (b) metoda Newtona

Rysunek 1: porównanie metod

3 Znajdywanie pierwiastków wielomianu metodą Laguerre’a


Metoda polega na iteracyjnym przybliżaniu rozwiązania zgodnie ze wzorem
nf (xk )
xk+1 = xk − p
f ′ (x k) ± (n − 1)[(n − 1)(f ′ (xk ))2 − nf (xk )f ′′ (xk )]

,gdzie punkt początkowy jest dowolny. Aby wyznaczyć wszystkie pierwiastki należy wielomian
podzielić przez wyrażenie (x−α), gdzie α to znaleziony pierwiastek, a następnie zastosować metodę
jeszcze raz.
Do deflacji liniowej użyto sklejanego schematu Hornera. Dla współczynników qk+1 , · · · , qn według
prostego schematu Hornera zgodnie ze wzorem

qn+1 = 0

qi = ai + qi α , i = n, n − 1, · · · , 0
, dla pozostałych według odwrotnego schematu Hornera zgodnie ze wzorem

q0 = 0
qi − ai
qi+1 = , i = 0, 1, · · · , n − 1
α
Implementacja w Matlabie, gdzie a-współczynniki wielomianu od najwyższej potęgi, alf a-czynnik
liniowy, q-współczynniki wielomianu po deflacji od najwyższej potęgi.
function [ q ] = lindef (a , alfa )
n = numel ( a ) ;
if mod (n , 2) == 1
k = ( n + 1) /2;
else
k = n /2;
end

a = flip ( a ) ;
q1 = zeros ( n + 1 , 1) ;

for i = n : -1:1
q1 ( i ) = a ( i ) + q1 ( i + 1) * alfa ;
end

3
q2 = zeros ( n + 1 , 1) ;

for i = 1: n
q2 ( i + 1) = ( q2 ( i ) - a ( i ) ) / alfa ;
end

q1 = q1 ';
q2 = q2 ';
q = [ q2 (: ,2: k ) , q1 (: , k +1: n ) ];
q = flip ( q ) ;
Całość metody Laguerre’a zaimplementowana w Matlabie z użyciem funkcji lindef , gdzie xf -
pierwiastki funkcji, a-współczynniki wielomianu od najwyższej potęgi, pp-punkt początkowy.
function [ xf ] = laguerre (a , pp )

n = numel ( a ) - 1;
xf = zeros (n , 1) ;
f = a;

for i = 1: n
df = polyder ( f ) ;
d2f = polyder ( df ) ;

while abs ( polyval (f , pp ) ) > 1e -15


m1 = polyval ( df , pp ) + sqrt (( n -1) *(( n -1) * polyval ( df , pp ) ^2
- n * polyval (f , pp ) * polyval ( d2f , pp ) ) ) ;
m2 = polyval ( df , pp ) - sqrt (( n -1) *(( n -1) * polyval ( df , pp ) ^2
- n * polyval (f , pp ) * polyval ( d2f , pp ) ) ) ;
if abs ( m1 ) > abs ( m2 )
m = m1 ;
else
m = m2 ;
end
pp = pp - n * polyval (f , pp ) / m ;
end

xf ( i ) = pp ;
f = lindef (f , xf ( i ) ) ;
n = n - 1;
end
Znalezione pierwiastki dla wielomianu

f (x) = 2x4 + 3x3 − 5x2 + 2x + 1

,zaczynając z punktu pp = 0

x1 = −0.2790, x2 = 0.6829 − 0.4759i, x3 = 0.6829 − 0.4759i, x4 = −2.5869

Spodziewanym wynikiem byłoby uzyskanie pierwiastków zespolonych sprzężonych, zamiast tego


algorytm zwraca dwa te same pierwiastki zespolone, co przy rzeczywistych współczynnikach jest
niemożliwe. Może to wynikać z błędów przy deflacji wielomianu. Poza tym faktem przybliżenia
pierwiastków są dobre, a metoda jest dość szybka.
Na wykresie zaznaczono pierwiastki na tle wielomianu. Dla pierwiastka zaspolonego osie należy
potraktować jako część rzeczywistą i urojoną.

4
Rysunek 2: pierwiastki znalezione metodą Laguerre’a

You might also like