Metody Bisekcji i Reguła Falsi są metodami wolno zbieżnymi do poszukiwanej wartości pierwiastka. Potrzebne są metody znacznie szybsze.
Jedną z tych metod jest Metoda Siecznych.
Metoda Siecznych podobna jest do Metody Reguła Falsi. Polega na aproksymacji funkcji prostymi - siecznymi, łączącymi dwa punkty.
Pierwszy punkt \(\displaystyle{ x_{2}}\) iteracji jest punktem przecięcia się siecznej łączącej dwa punkty startowe \(\displaystyle{ (x_{0}, f(x_{0})) }\) i \(\displaystyle{ (x_{1}. f(x_{1})) }\) z osią \(\displaystyle{ Ox.}\)
Następny punkt \(\displaystyle{ x_{3}}\) jest generowany przez nową sieczną łączącą punkty \(\displaystyle{ (x_{1},f(x_{1}), (x_{2}, f(x_{2}).}\)
Nowy punkt aproksymujący \(\displaystyle{ x_{3} }\) z punktem \(\displaystyle{ x_{2}}\) jest wykorzystany do utworzenia punktu \(\displaystyle{ x_{4} }\) itd.
Wzór dla punktu \(\displaystyle{ x_{n+1} }\) otrzymujemy, podstawiając \(\displaystyle{ x = x_{n+1}}\) i \(\displaystyle{ y = 0 }\) w równaniu siecznej
przechodzącej przez punkty \(\displaystyle{ (x_{n-1}, f(x_{n-1}), ( (x_{n}, f(x_{n})).}\)
\(\displaystyle{ x_{n+1} = x_{n} - f(x_{n})\cdot \left[ \frac{x_{n} - x_{n-1}}{f(x_{n})-f(x_{n-1})} \right] }\)
Jako stop - kryteria algorytmu Metody Siecznych możemy przyjąć:
\(\displaystyle{ |f(x_{n})|\leq \varepsilon, \ \ |x_{n+1}-x_{n}|\leq \varepsilon, \ \ \frac{|x_{n+1}-x_{n}|}{|x_{n+1}|} \leq \varepsilon.}\)
Program w OCTAVE
Kod: Zaznacz cały
function secant(f,x0,x1,tol,n)
iter=0;
u=feval(f,x0);
v=feval(f,x1);
err=abs(x1-x0);
disp('________________________________________________________')
disp(' iter xn f(xn) f(xn+1)-f(xn) |xn+1-xn|')
disp('________________________________________________________')
fprintf('%2.0f %12.6f %12.6f\n',iter,x0,u)
fprintf('%2.0f %12.6f %12.6f %12.6f %12.6f\n',iter,x1,v,v-u,err)
while (err>tol)&(iter<=n)&((v-u)~=0)
x=x1-v*(x1-x0)/(v-u);
x0=x1;
u=v;
x1=x;
v=feval(f,x1);
err=abs(x1-x0);
iter=iter+1;
fprintf('%2.0f %12.6f %12.6f %12.6f %12.6f\n',iter,x1,v,v-u,err)
end
if ((v-u)==0)
disp('Dzielenie przez zero')
end
if (iter>n)
disp('Metoda nie jest zbieżna')
end
function f=f1(x)
f=x.^3-x.^2-1;
>> secant('f1',1,2,10^(-4),40)
_________________________________________________________
iter xn f(xn) f(xn+1)-f(xn) |xn+1-xn|
_________________________________________________________
0 1.000000 -1.000000
1 2.000000 3.000000 4.000000 1.000000
2 1.250000 -0.609375 -3.609375 0.750000
3 1.376623 -0.286264 0.323111 0.126623
4 1.488807 0.083463 0.369727 0.112184
5 1.463482 -0.007322 -0.090786 0.025325
6 1.465525 -0.000163 0.007160 0.002043
7 1.465571 0.000000 0.000163 0.000046