krikol Skrevet 16. oktober 2013 Skrevet 16. oktober 2013 Hei, skulle hatt litt hjelp med en oppgave i Matlab. Oppgaven er som følger: Lag en programkode som finner løsningen av ligningen e2x2 = 3√x med en feil på mindre enn 10−5 vha Newton(-Raphson)s metode Noen her inne som kan hjelpe meg å forstå hvordan eg skal gå fram her?
Selvin Skrevet 16. oktober 2013 Skrevet 16. oktober 2013 (endret) Du skal altså løse likn. vha. Newtons Metode? http://en.wikipedia.org/wiki/Newton's_method Pseudokode blir ca. x0 = .. # Initial guess eps = 10E-5 while f(x0) > eps: x_new = x0 - f(x0)/f'(x0) x0 = x_new Endret 16. oktober 2013 av Selvin
Selvin Skrevet 16. oktober 2013 Skrevet 16. oktober 2013 (endret) Med initial guess x0 = 1. fikk jeg nullpunkt til å være ca. x = 0.67. Med x0 = 0.01 får jeg nullpunkt i x = 0.11741 Så har du resultatene. Stemmer også med Wolfram: http://www.wolframalpha.com/input/?i=e%5E%282*x**2%29+-+3*sqrt%28x%29+%3D+0 EDIT: Sorry, editoren her tuller seg helt, ødela hele forrige innlegget der. Endret 16. oktober 2013 av Selvin
krikol Skrevet 16. oktober 2013 Forfatter Skrevet 16. oktober 2013 x_new = x0 - f(x0)/f'(x0) Denne linjen får eg feil på Error: Unbalanced or unexpected parenthesis or bracket. Eg er virkelig grønn på Matlab.
Selvin Skrevet 16. oktober 2013 Skrevet 16. oktober 2013 (endret) Den koden jeg har skrevet er ikke Matlab-kode, mer Python-kode egentlig. I Matlab er det bedre å skrive inn funksjonene direkte tror jeg, slik at du får x_new = x0 - (exp(2*x0**2) - 3*sqrt(x0))/(4*x0*exp(2*x0**2) - 3./(2*sqrt(x0)) x0 = x_new Det kan være en idè å få en grei forståelse matlab-syntax før man implementerer Newtons metode. Endret 16. oktober 2013 av Selvin
Han Far Skrevet 16. oktober 2013 Skrevet 16. oktober 2013 x_new = x0 - f(x0)/f'(x0) Denne linjen får eg feil på Error: Unbalanced or unexpected parenthesis or bracket. Eg er virkelig grønn på Matlab. Det går ikke an å bruke ' for å få den deriverte av en funksjon i matlab. Du må skrive inn både funksjonen din og den deriverte. Hvis du vil gjøre dette litt mer avansert kan du lage to matlabfunksjoner for dette, men hvis du er helt grønn anbefaler jeg at du bare skriver uttrykkene rett inn i koden. 2
Nebuchadnezzar Skrevet 16. oktober 2013 Skrevet 16. oktober 2013 (endret) Helt enig, bare skriv rett inn om ikke du er så dreven. For fun er det fullt mulig å få til om en tillater symboler. Da må en først skrive syms x for å vise at x skal nå bli behandlet som et symbol.Deretter så kan begynnelsen av koden din eksempelvis se slik ut function x1 = Newton(f,x0,Max,err) format long G = inline(char(f)); Gx = inline(char(diff(f))); for i = 1:Max x1 = x0 - G(x0)/Gx(x0); . . . Med input Newton(x^3-3,-1,100,10^(-5)) Endret 16. oktober 2013 av Nebuchadnezzar
krikol Skrevet 16. oktober 2013 Forfatter Skrevet 16. oktober 2013 Har kommet fram til denne koden: syms x; e = 10e-5; dx = e + 1; f = (exp(2*x^2)-3*sqrt(x)); x = 0.5; count = 0; p = zeros(1,1); while (abs(dx) > e) dx = eval(f/(diff(f))); x = x - dx count = count + 1; p(count) = x; end % plot(abs(p)); if (count < 300) fprintf('Løsningen er = '); %printing the result x fprintf('\nAntall initieringer = %d\n',count); end Ligningen har jo to løsninger, korleis kan eg få skriptet til å finne den andre løsningen? Eller må ein prøve seg fram?
Selvin Skrevet 16. oktober 2013 Skrevet 16. oktober 2013 Prøve seg frem ja, sett opp flere initial guesses.
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå