Matlab, Biseksjon

Her kan du stille spørsmål vedrørende problemer og oppgaver i matematikk på høyskolenivå. Alle som har kunnskapen er velkommen med et svar. Men, ikke forvent at admin i matematikk.net er spesielt aktive her.

Moderators: Vektormannen, espen180, Aleks855, Solar Plexsus, Gustav, Nebuchadnezzar, Janhaa

Post Reply
hauge1
Pytagoras
Pytagoras
Posts: 17
Joined: 08/10-2015 12:58

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.
zell
Guru
Guru
Posts: 1777
Joined: 09/02-2007 15:46
Location: Trondheim

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
hauge1
Pytagoras
Pytagoras
Posts: 17
Joined: 08/10-2015 12:58

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 :)
zell
Guru
Guru
Posts: 1777
Joined: 09/02-2007 15:46
Location: Trondheim

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.).
hauge1
Pytagoras
Pytagoras
Posts: 17
Joined: 08/10-2015 12:58

Tusen takk for hjelpen!

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