Metoda Siecznych

Przestrzenie wektorowe, bazy, liniowa niezależność, macierze.... Formy kwadratowe, twierdzenia o klasyfikacji...
janusz47
Użytkownik
Użytkownik
Posty: 7917
Rejestracja: 18 mar 2009, o 16:24
Płeć: Mężczyzna
Podziękował: 30 razy
Pomógł: 1671 razy

Metoda Siecznych

Post autor: janusz47 »

Metoda Siecznych

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
 
ODPOWIEDZ