Reguła Falsi

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

Reguła Falsi

Post autor: janusz47 »

Reguła Falsi jest metodą podobną do Metody Bisekcji - szybciej zbieżną do poszukiwanego miejsca zerowego \(\displaystyle{ \alpha }\) funkcji \(\displaystyle{ f.}\)

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
  
 
ODPOWIEDZ