Metoda Newtona jest najczęściej stosowaną metodą, ze wszystkich iteracyjnych metod rozwiązywania równań.
W metodzie tej zamiast siecznej używa się styczną, rozpoczynając od punktu początkowego \(\displaystyle{ x_{0} }\) możliwie bliskiego poszukiwanej wartości \(\displaystyle{ \alpha.}\).
Następną aproksymację \(\displaystyle{ x_{1}}\) otrzymujemy w wyniku przecięcia się stycznej do funkcji \(\displaystyle{ f }\) w punkcie \(\displaystyle{ (x_{0}, f(x_{0}) }\) z osią \(\displaystyle{ Ox. }\)
Jeśli \(\displaystyle{ x_{n+1} }\) jest wartością otrzymaną sukcesywnie przez przecięcie się z osią \(\displaystyle{ Ox }\) stycznej w punkcie \(\displaystyle{
(x_{n}, f(x_{n})) }\) w \(\displaystyle{ (n+1) }\) iteracji, to \(\displaystyle{ x_{n+1}= x_{n} - \frac{f(x_{n})}{f'(x_{n})} , \ \ n\geq 0, \ \ (1)}\)
zakładając , że \(\displaystyle{ f'(x_{n}) \neq 0. }\)
Równanie stycznej do krzywej w punkcie \(\displaystyle{ ( x_{0}, f(x_{0}) }\) ma postać:
\(\displaystyle{ y -f(x_{0}) = f'(x_{0})\cdot (x-x_{0}).}\)
Jeśli przez \(\displaystyle{ x_{1}}\) oznaczymy punkt w którym ta styczna przecina oś \(\displaystyle{ Ox }\) dla \(\displaystyle{ (y=0) }\), to
\(\displaystyle{ -f(x_{0}) = f'(x_{0})(x_{1}-x_{0}). }\)
Wyznaczając z tego równania \(\displaystyle{ x_{1}, }\) otrzymujemy
\(\displaystyle{ x_{1} = x_{0} - \frac{f(x_{0})}{f'(x_{0})} }\)
Powtarzając proces iteracyjny dla stycznej w punkcie \(\displaystyle{ (x_{1}, f(x_{1}) }\) mamy
\(\displaystyle{ x_{2} = x_{1} - \frac{f(x_{1})}{f'(x_{1})}. }\)
I tak dalej, otrzymując \(\displaystyle{ (1).}\)
Przyjmujemy takie same kryteria stopu jak w metodzie siecznych.
Program w OCTAVE
Kod: Zaznacz cały
function newton(f,df,x0,tol,n)
iter=0;
u=feval(f,x0);
v=feval(df,x0);
err=abs(v/u);
disp('__________________________________________________________')
disp(' iter x f(x) df(x) |xn+1-xn|')
disp('__________________________________________________________')
fprintf('%2.0f %12.6f %12.6f %12.6f\n',iter,x0,u,v)
while (err>tol)&(iter<=n)&(v~=0)
x1=x0-u/v;
err=abs(x1-x0);
x0=x1;
u=feval(f,x0);
v=feval(df,x0);
iter=iter+1;
fprintf('%2.0f %12.6f %12.6f %12.6f %12.6f\n',iter,x0,u,v,err)
end
if (v==0)
disp('Dzieleie przez zero')
end
if (iter>n)
disp('Metoda nie jest zbieżna')
end
function f=f1(x)
f=x.^3-x.^2-1;
function f=df1(x)
f=3*x.^2-2*x;
>> newton('f1','df1',1,10^(-4),40)
__________________________________________________________
iter x f(x) df(x) |xn+1-xn|
__________________________________________________________
0 1.000000 -1.000000 1.000000
1 2.000000 3.000000 8.000000 1.000000
2 1.625000 0.650391 4.671875 0.375000
3 1.485786 0.072402 3.651108 0.139214
4 1.465956 0.001352 3.515168 0.019830
5 1.465571 0.000001 3.512556 0.000385
6 1.465571 0.000000 3.512555 0.000000