Professional Documents
Culture Documents
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
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
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
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
,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 ) ;
xf ( i ) = pp ;
f = lindef (f , xf ( i ) ) ;
n = n - 1;
end
Znalezione pierwiastki dla wielomianu
,zaczynając z punktu pp = 0
4
Rysunek 2: pierwiastki znalezione metodą Laguerre’a