Page 1 of 1

Matlab, Biseksjon

Posted: 02/11-2015 20:13
by hauge1
Hei jeg har innlevering i Matlab. Jeg leverte inn og fikk den tilbake med kommentar på den ene oppgaven.

Vi skal her se på løsninger av likningen: [tex]x^3+5x^2-2x+24= \sin x[/tex] som ligger i området [tex]-5 < x < 5[/tex] 
Lag et program som finner en løsning av likningen med et avvik mindre enn en viss verdi og som lett kan modifiseres til å bruke et annet avvikskrav ved bruk av

a) Newtons metode
b) Biseksjonsmetoden
c) Hvor mange iterasjoner trenger vi for hver metode dersom avvikskravet er 10-4?

Programmet jeg leverte for oppg b)

function [a,b,iterasjoner] = Oppgave3b (a,b,avvik)
c = (a+b)/2;
h = c^3-(5*c^2)-(2*c)+24-sin(c);
iterasjoner=0;
while abs(h) >= avvik
iterasjoner=iterasjoner+1;
n = a^3-(5*a^2)-(2*a)+24-sin(a);
c = (a+b)/2;
h = c^3-(5*c^2)-(2*c)+24-sin(c);
if (n < 0) && (h > 0)
b = c;
elseif (n > 0) && (h < 0)
b = c;
else
a = c;
end
end
end

kommentaren jeg fikk: Programmet ditt er strukturert slik at programmet ditt halverer intervallet én gang mer enn det skal.

Er forholdsvis fersk i matlab, så jeg håper noen mer erfarne ser hva jeg har gjort feil.

Re: Matlab, Biseksjon

Posted: 02/11-2015 20:29
by zell
For det første trenger du vel ikke den første evalueringen, i tillegg er det bedre å legge termineringen til enden av while-løkka, istedet for i starten - en såkalt "do-while"-løkke. Forslag:

function [a,b,iterasjoner] = Oppgave3b (a,b,avvik)
stopp = true;
iterasjoner=0;
while stopp
iterasjoner=iterasjoner+1;
n = a^3-(5*a^2)-(2*a)+24-sin(a);
c = (a+b)/2;
h = c^3-(5*c^2)-(2*c)+24-sin(c);
if (n < 0) && (h > 0)
b = c;
elseif (n > 0) && (h < 0)
b = c;
else
a = c;
end
if (abs(h)<=avvik)
stopp = false;
end
end
end

Re: Matlab, Biseksjon

Posted: 02/11-2015 21:21
by hauge1
forstår ikke helt hvorfor det er bedre å ha termineringen i enden av while-løkka. kan du forklare meg? Dette programmet gir meg eksakt samme svar. Tar det nye programmet hensyn til feilen det gamle gjorde? Takk for hjelpen forresten :)

Re: Matlab, Biseksjon

Posted: 02/11-2015 22:04
by zell
Her har jeg nok vært litt rask på avtrekkern. Som du sier skal det ikke være noen forskjell hvor du legger termineringen, du vil få samme antall iterasjoner med begge fremgangsmåtene. Uansett, det kommentaren pekte på var halveringen du gjorde i forkant av while-løkka di - den er unødvendig. For å starte while-løkka med din metode kan du bare sette h til et høyt tall før while-løkka, resten kan du beholde. Oppsummert: fjern c = (a+b)/2 og h = ... før while-løkka, bytt ut med h=10 (f.eks.).

Re: Matlab, Biseksjon

Posted: 02/11-2015 22:39
by hauge1
Tusen takk for hjelpen!

Jeg byttet med h=avvik slik at løkka alltid starter.