Hubert Ciszewski Kamil Cyrkler |
Laboratorium Metod Numerycznych | 11.02.2012 |
---|---|---|
ED.3.1 | Ćwiczenie numer: 5 |
METODA BIJEKCJI
Skrypt Scilab’a :
xdel;
clc; //wyczyszczenie konsoli
clear; // wyczyszczenie pamięci
function f=nieliniowa(x);
f=-0.26*x^3-25*cos(x)-60;
endfunction
S=input("Podaj punkt startowy: S=");
K=input("Podaj punkt końcowy: K=");
delt=input("Podaj oczekiwana dokładność obliczeń: delt=");
t2=linspace(S,K);
subplot(121);
plot2d(t2,nieliniowa(t2));
t=1;
x1=nieliniowa(S);
x2=nieliniowa(K);
D=x1*x2;
P=(K-S)/2+S;
ex=P-S;
if D<0 then
Z(t)=(K-S)/2+S;
while abs(x1+x2)>delt & abs(ex)>delt
t=t+1;
P=(K-S)/2+S;
x2=nieliniowa(P);
D=x1*x2;
if D<0 then
K=P;
Z(t)=(K-S)/2+S;
ex=P-S;
else
x2=nieliniowa(K);
x1=nieliniowa(P);
S=P;
Z(t)=(K-S)/2+S;
ex=K-P;
end;
end;
else;
disp("Źle dobrany przedział");
end
disp(Z(t));
disp(t);
subplot(122);
t2=linspace(1,t,t);
plot2d(t2,Z');
Wykresy otrzymane na przedziale <-10,10> z dokładnością 0,001 :
REGUŁA FALSI
Skrypt scilab’a:
xdel;
clc; //wyczyszczenie konsoli
clear; // wyczyszczenie pamięci
function f=nieliniowa(x) // Okreslamy funkcje
f=-0.26*x^3-25*cos(x)-60;
endfunction
disp("Regula Falsi") // Wczytujemy przedział
a=input("Punkt startowy: a=");
b=input("Punkt koncowy: b=");
t2=linspace(a,b,500);
subplot(121);
plot2d(t2,nieliniowa(t2)); // Wykres funkcji
D=(nieliniowa(a)*nieliniowa(b));
disp("Szukamy f(x)=0")
if D<0 then // Sprawdzenie zalozenia metody, obliczamy wartosc pierwszego argumentu
x0=(a*nieliniowa(b)-b*nieliniowa(a))/(nieliniowa(a)-nieliniowa(b))
while nieliniowa(x0)==0
disp("x0 jest szukanym pierwiastkiem funkcji")
end
E=nieliniowa(a)*nieliniowa(x0);
if E<0 then // Sprawdzenie zalozenia metody, obliczamy
x1=((x0*nieliniowa(a)-a*nieliniowa(x0))/(nieliniowa(a)-nieliniowa(x0)))
else
x1=((x0*nieliniowa(b)-b*nieliniowa(x0))/(nieliniowa(b)-nieliniowa(x0)))
end
end
if nieliniowa(x1)==0 then
disp("x1 jest szukanym pierwiastkiem funkcji")
else // obliczamy wartosc drugiego argumentu
disp(nieliniowa(x0),'f(x0)=',nieliniowa(x1),'f(x1)=')
disp("Miejsce zerowe znajduje sie w przedziale od<x1,x0>. Obliczamy ten przedzial‚")
G=nieliniowa(x0)*nieliniowa(x1);
if G<0 then // Sprawdzamy zalozenia metody
x2=((x1*nieliniowa(x0)-x0*nieliniowa(x1))/(nieliniowa(x0)-nieliniowa(x1)))
else
if G<>0 then
disp("Funkcja nie posiaa miejsca zerowego lub metoda nie jest zbiezna dla tej funkcji")
abort
end
end
disp (nieliniowa(x2),'f(x2)=')
H=nieliniowa(x1)*nieliniowa(x2);
if H<0 then // Sprawdzamy zalozenia metody
x3=((x1*nieliniowa(x2)-x2*nieliniowa(x1))/(nieliniowa(x1)-nieliniowa(x2)))
else
x3=((x2*nieliniowa(x0)-x0*nieliniowa(x2))/(nieliniowa(x0)-nieliniowa(x2)))
end
if nieliniowa(x3)==0 then
disp("x4 jest pierwiastkiem funkcji")
else
disp(nieliniowa(x3),'f(x3)=')
end
J=nieliniowa(x1)*nieliniowa(x3);
if J<0 then // Sprawdzamy zalozenia metody
x4=((x3*nieliniowa(x0)-x0*nieliniowa(x3))/(nieliniowa(x0)-nieliniowa(x3))) // Obliczamy 4 argument
end
if nielinowa(x4)==0 then
disp("x5 jest pierwiastkiem funkcji")
else
disp(nieliniowa(x4),'f(x4)=')
end
plot2d(t2,nieliniowa(t2));
end
Otrzymane wyniki:
Reguła Falsi
Punkt startowy: a=-->-10
Punkt końcowy: b=-->10
Szukamy f(x)=0
x0 =
1.5008928
x1 =
- 1.0387439
f(x1)=
- 72.391171
f(x0)=
- 62.625234
Miejsce zerowe znajduje sie w przedziale od<x1,x0>. Obliczamy ten przedział‚
Funkcja nie posiada miejsca zerowego lub metoda nie jest zbieżna dla tej funkcji
Uzyskany wykres