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.
Matlab, Biseksjon
Moderators: Vektormannen, espen180, Aleks855, Solar Plexsus, Gustav, Nebuchadnezzar, Janhaa
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
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
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.).