Jak w Metodzie Bisekcji zakłada się, że funkcja \(\displaystyle{ f }\) jest ciągła w przedziale \(\displaystyle{ [x_{1}, x_{2}] }\) i spełnia warunek \(\displaystyle{ f(x_{1})\cdot f(x{2}) < 0.}\)
Pierwszy punkt aproksymujący \(\displaystyle{ x_{3} }\) znajdujemy jako punkt przecięcia prostej łączącej punkty \(\displaystyle{ (x_{1},f(x_{1}), \ \ (x_{2}, f(x_{2}) }\) z osią \(\displaystyle{ Ox.}\)
Z równania siecznej wynika, że współrzędną \(\displaystyle{ x_{3} }\) określamy ze wzoru:
\(\displaystyle{ x_{3} = x_{2}-f(x_{2})\cdot \frac{x_{2}-x_{1}}{f(x_{2})-f(x_{1})} \ \ (1) }\)
Mając wartość \(\displaystyle{ x_{3} }\), możemy obliczyć wartość funkcji \(\displaystyle{ f(x_{3}).}\)
Następnie sprawdzamy warunek \(\displaystyle{ f(x_{1})\cdot f(x_{3}) <0. }\)
Jeśli ten warunek zachodzi, kładziemy \(\displaystyle{ x_{2}=x_{3} }\) w przeciwnym przypadku przyjmujemy \(\displaystyle{ x_{1}= x_{3}. }\)
W ten sposób w każdym kroku Reguły Falsi generujemy nowy przedział, który zawiera poszukiwany pierwiastek \(\displaystyle{ \alpha }\) funkcji \(\displaystyle{ f }\)
Główną wadą tej metody, jest to, że ciąg punktów generowanych przez algorytm jest jednostronny, co spowalnia jego zbieżność.
Dotyczy to funkcji, których wykresy są krzywymi wypukłymi lub wklęsłymi w danym przedziale \(\displaystyle{ [a_{0}, b_{0}]. }\)
Kończymy iteracje, jeśli spełniony jest jeden z warunków:
\(\displaystyle{ |f(x_{n})|\leq \varepsilon }\) lub \(\displaystyle{ |x_{n-1}-x_{n}| \leq \varepsilon. }\)
Program w OCTAVE
Kod: Zaznacz cały
function falsi(f,a,b,tol,n)
a0=a;
b0=b;
iter=0;
u=feval(f,a);
v=feval(f,b);
c=(v*a-u*b)/(v-u);
w=feval(f,c);
disp('_______________________________________________________________')
disp(' iter a b c f(c) |b-a| ')
disp('_______________________________________________________________')
fprintf('\n')
if (u*v<=0)
while (abs(w)>tol)&(abs(b-a)>tol)&(iter<=n)&((v-u)~=0)
w =feval(f,c);
fprintf('%2.0f %12.4f %12.4f %12.6f %10.6f %10.6f\n',iter,a,
b,c,w,abs(b-a))
if(w*u<0)
b=c;
v=w;
end;
if (w*u>0)
a=c;
u=w;
end;
iter = iter+1;
c=(v*a-u*b)/(v-u);
end;
if (iter>n)
disp('Metoda nie jest zbieżna')
end;
if (v-u==0)
disp('Dzielenie pzez zero')
end;
else
disp('Metoda nie moze byc stosowana f(a)f(b)>0')
end;
function f=f1(x)
f=x.^3-x.^2-1;
>> falsi('f1',1,2,10^(-4),40)
_______________________________________________________________
iter a b c f(c) |b-a|
_______________________________________________________________
0 1.0000 2.0000 1.250000 -0.609375 1.000000
1 1.2500 2.0000 1.376623 -0.286264 0.750000
2 1.3766 2.0000 1.430925 -0.117660 0.623377
3 1.4309 2.0000 1.452402 -0.045671 0.569075
4 1.4524 2.0000 1.460613 -0.017331 0.547598
5 1.4606 2.0000 1.463712 -0.006520 0.539387
6 1.4637 2.0000 1.464875 -0.002445 0.536288
7 1.4649 2.0000 1.465310 -0.000916 0.535125
8 1.4653 2.0000 1.465474 -0.000343 0.534690
9 1.4655 2.0000 1.465535 -0.000128 0.534526
10 1.4655 2.0000 1.465558 -0.000048 0.534465