Siema skorzystalem z tego skryptu zeby policzyc miejsce zerowe funkcji http://fluid.itcmp.pwr.wroc.pl/~znmp/dydaktyka/metnum/bisekcja.pdf tylko nie wiem jak ustawic dokadnosc oblcizen (10^-9). Ktos pomoze?
degel123 napisał(a):
Siema skorzystalem z tego skryptu zeby policzyc miejsce zerowe funkcji http://fluid.itcmp.pwr.wroc.pl/~znmp/dydaktyka/metnum/bisekcja.pdf tylko nie wiem jak ustawic dokadnosc oblcizen (10^-9). Ktos pomoze?
W podanym skrypcie zastosowano pętlę mającą n iteracji (n=15). Zamiast tego zastosuje pętlę while
i sprawdzaj w niej czy feval(fun,xm) < epsilon
, gdzie epsilon=10e-9
. Kiedy to nastąpi, wyjdź z pętli.
Po zastapieniu w skrypcie petli for petla while feval(fun,xm) < 10e-9 wyskakuje blad. Czy zle konstruuje petle?
Takie cos sie pojawia
Undefined function or variable "xm".
Error in demoBisect (line 15)
while feval(fun,xm) < 10e-9
degel123 napisał(a):
Takie cos sie pojawia
Undefined function or variable "xm".
Error in demoBisect (line 15)
while feval(fun,xm) < 10e-9
No nic dziwnego, skoro nie wyliczasz xm
. Przyjrzyj się poprzedniemu przykładowi, tam xm
jest wyliczane w każdym przebiegu. Postępuj analogicznie.
Znalazlem lepszy kod
while abs(a - b) > epsilon % dopóki nie uzyskamy zadanej dokładności
x1 = (a + b) / 2;
if fun(x1) <= residuum % jeżeli znaleźliśmy miejsce zerowe mniejsze bądź równe residuum (przybliżeniu zera)
break;
else if fun(x1) * fun(a) < 0
b = x1; % nadpisywanie prawego krańca przedziału
else
a = x1; % nadpisywanie lewego krańca przedziału
end
end
display((a + b) / 2); % zwracanie znalezionego miejsca zerowego
tylko teraz nie wiem gdzie umiescic wartosci a b i funkcje zeby to dzialalo. Poki co mam funkcje taka:
function y = fun(x)
% Oblicza wartosci funkcji w zadanym punkcie
y = ...
Jak dopisuje na samej gorze skrypt jakies wartosci do a i b to wyskakuje blad
This statement is incomplete.
Ten kod nie jest ani lepszy ani gorszy. :)
Przed petla while zdefiniuj poczatkowe wartosci a, b oraz epsilon i residuum. Tu jest pewna niescislosc, bo nie wiadomo czy zadana dokladnosc 10e-9 dotyczy wartosc f(c) (u Ciebie to residuum) czy szerokosci przedzialu (u Ciebie to epsilon). Mozesz ustawic obie wartosci na 10e-9.
Twoja funkcja fun powinna byc zdefiniowana w osobnym skrypcie.
Funkcje fun mam w innym skrypcie
tak wyglada teraz ten skrypt gdy dodalem a b i pozmienialem residum i epsilon
a=-3;
b=3;
while abs(a - b) > 10e-9 % dopóki nie uzyskamy zadanej dokładności
x1 = (a + b) / 2;
if fun(x1) <= 10e-9 % jeżeli znaleźliśmy miejsce zerowe mniejsze bądź równe residuum (przybliżeniu zera)
break;
else if fun(x1) * fun(a) < 0
b = x1; % nadpisywanie prawego krańca przedziału
else
a = x1; % nadpisywanie lewego krańca przedziału
end
end
display((a + b) / 2); % zwracanie znalezionego miejsca zerowego
Niestety co bym nie wpisal to zawsze wyskakuje
a=-3;
|
Error: This statement is incomplete.
Zamien else if
na elseif
Dzieki wielkie za pomoc i cierpliwosc juz wszystko hasa :)