Matlab bisekcja

0

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?

1
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.

0

Po zastapieniu w skrypcie petli for petla while feval(fun,xm) < 10e-9 wyskakuje blad. Czy zle konstruuje petle?

0

Takie cos sie pojawia

Undefined function or variable "xm".

Error in demoBisect (line 15)
while feval(fun,xm) < 10e-9

0
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.

0

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.

0

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.

0

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.

1

Zamien else if na elseif

0

Dzieki wielkie za pomoc i cierpliwosc juz wszystko hasa :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1