Jennious Skrevet 23. oktober 2012 Del Skrevet 23. oktober 2012 Hei! Har som oppgave å lage Newtons metode i Python. Har prøvd lenge nå, men får det visst ikke helt til. Noen som kan hjelpe? Oppgaven er som følger: a) Lag en funksjon "polynom", som tar inn ett argument x, og returnerer utregningen av polynomet f(x) = x^5 - 4x^3 + 10x^2 - 10. Lag også en funksjon "polynom_derivative" som tar inn ett argument x, og returnerer 5x^4 - 12x^2 + 20x; mao. den deriverte av f(x). b) Implementer newtons metode som en funksjon med navn "newton". Funksjonen skal ta inn en generell funksjon "func", og dens deriverte deriv, en startverdi (gjettet nullpunkt) "start", en feiltoleranse "threshold", og et maksimalt antall iterasjoner "max_iterations". Funksjonen skal returnere et estimat på et nullpunkt innenfor feiltoleransen. Hvis et estimat ikke kan finnes innenfor feiltoleransen i løpet av det maksimale antall iterasjoner, returnerer False. Test implementasjonen din slik (riktig output står som kommentar): print ( newton ( polynom , polynom_derivative , 1 , 0. 000001 , 20 ) ) # 1.201384 print ( newton ( polynom , polynom_derivative , -3 , 0 . 000001 , 20 ) ) # -2.684766 print ( newton ( polynom , polynom_derivative , -1 , 0 . 000001 , 20 ) ) # -0.882417 print ( newton ( polynom , polynom_derivative , 0 . 01 , 0 . 000001 , 20 ) ) # False print ( newton ( polynom , polynom_derivative , -2 . 08 , 0 . 000001 , 20 ) ) # False Oppgave a er jo enkel, men får ikke b helt til. Noen som kan hjelpe? http://en.wikipedia.org/wiki/Newton's_method Lenke til kommentar
etse Skrevet 23. oktober 2012 Del Skrevet 23. oktober 2012 (endret) Siden du sikkert er ute etter å lære velger jeg å ikke gjøre oppgaven for deg, men heller prøve å gi deg et dytt i riktig retning: Gitt at du har laget funksjonene polynom og "polynom_derivative", lignende dette: def polynom(x): x = float(x) return (x**5) - (4*(x**3)) + (10*(x**2)) - 10 def polynom_derivative(x): x = float(x) return (5*(x**4)) - (12*(x**2)) + (20*x) Så skal du bruke disse i funksjonen din, starter derfor med å lage et skjelett for funksjonen: def newton(func1, func2, guess, treshhold, max_iterations): return False Her kan man enkelt regne ut neste gjett ved hjelp av newtons metode. Legg merke til at jeg bruker funksjonene gitt til meg som argument. def newton(func1, func2, guess, treshhold, max_iterations): new_guess = guess - (func1(guess) / func2(guess)) return False Treshhold er gitt enkelt ved følgende formel: treshhold = abs(new_guess - guess) Håper dette får deg på sport, ga deg også masse gratis. Endret 23. oktober 2012 av etse Lenke til kommentar
Jennious Skrevet 23. oktober 2012 Forfatter Del Skrevet 23. oktober 2012 Håper dette får deg på sport, ga deg også masse gratis. Takk for hjelpen. Jeg er med så langt, men er man ikke nødt til å lage en løkke slik at funksjonen går gjennom hver iterasjon? Jeg kan se for meg at dette kan gjøres ved en for løkke på denne måten for num in range(start, start + max_iterations + 1): new_guess = guess - (func1(guess) / func2(guess)) men hvordan får jeg den nye verdien new_guess med videre slik at den blir satt inn som guess når løkka begynner på ny? Eller tenker jeg helt feil her? Lenke til kommentar
etse Skrevet 23. oktober 2012 Del Skrevet 23. oktober 2012 (endret) du er på riktig vei, men har litt feil i for-loopen din. Den skal ikke starte på "start", men på 0. Siden du skal gå gjennom den "max_iterations" antall ganger. Ville så utvidet slik som dette. for num in range(0, max_iterations): new_guess = guess - (func1(guess) / func2(guess)) // Legg til en sjekk for om treshhold er bra nok, hvis det returner svaret guess = new_guess return False Vil og legge til at du burde venne deg til å bruke xrange i stede for range når du skal lage "for-løkker". Det er betydelig mye raskere. Altså: for num in xrange(0, max_iterations): Endret 23. oktober 2012 av etse Lenke til kommentar
Djn Skrevet 24. oktober 2012 Del Skrevet 24. oktober 2012 Og bare for å være ytterst pirkete, er ikke range(0, 100) akkurat det samme som range(100) ? Lenke til kommentar
etse Skrevet 24. oktober 2012 Del Skrevet 24. oktober 2012 Og bare for å være ytterst pirkete, er ikke range(0, 100) akkurat det samme som range(100) ? jo, men også mindre intuitivt for nybegynnere. Lenke til kommentar
Djn Skrevet 24. oktober 2012 Del Skrevet 24. oktober 2012 (endret) Og bare for å være ytterst pirkete, er ikke range(0, 100) akkurat det samme som range(100) ? jo, men også mindre intuitivt for nybegynnere. Forsåvidt sant. Personlig synes jeg R sin 0:100 er penere uansett, og hadde likt om python kunne stjålet den notasjonen - men det hadde vel blitt rotete å kombinere med array slicing. Endret 24. oktober 2012 av Djn Lenke til kommentar
Jennious Skrevet 24. oktober 2012 Forfatter Del Skrevet 24. oktober 2012 Vil og legge til at du burde venne deg til å bruke xrange i stede for range når du skal lage "for-løkker". Det er betydelig mye raskere. Altså: for num in xrange(0, max_iterations): Fikk til oppgaven nå Hittil har vi ikke kommet inn på xrange funksjonen, men takk for tipset! Lenke til kommentar
Han Far Skrevet 24. oktober 2012 Del Skrevet 24. oktober 2012 Forsåvidt sant. Personlig synes jeg R sin 0:100 er penere uansett, og hadde likt om python kunne stjålet den notasjonen - men det hadde vel blitt rotete å kombinere med array slicing. MATLAB har både 0:100-notasjonen og slicing, så det skal la seg forene. Lenke til kommentar
etse Skrevet 24. oktober 2012 Del Skrevet 24. oktober 2012 Forsåvidt sant. Personlig synes jeg R sin 0:100 er penere uansett, og hadde likt om python kunne stjålet den notasjonen - men det hadde vel blitt rotete å kombinere med array slicing. MATLAB har både 0:100-notasjonen og slicing, så det skal la seg forene. Det går nok litt i mot "The zen of python", med å være veldig konsekvent på slikt ting. Range er en funksjon og skal dermed ta inn argumenter på vanlig måte. "Special cases aren't special enough to break the rules." Lenke til kommentar
andybb Skrevet 24. oktober 2012 Del Skrevet 24. oktober 2012 Vil og legge til at du burde venne deg til å bruke xrange i stede for range når du skal lage "for-løkker". Det er betydelig mye raskere. Altså: for num in xrange(0, max_iterations): Det brukes Python 3 i IT Grunnkurs på NTNU nå. Nytt av året. Lenke til kommentar
etse Skrevet 24. oktober 2012 Del Skrevet 24. oktober 2012 Vil og legge til at du burde venne deg til å bruke xrange i stede for range når du skal lage "for-løkker". Det er betydelig mye raskere. Altså: for num in xrange(0, max_iterations): Det brukes Python 3 i IT Grunnkurs på NTNU nå. Nytt av året. Om du bruker Python 3, og ikke python 2.7, så vil jeg bemerke at i python 3 så er range det samme som xrange var i 2.7. Så med andre ord, bruk range() i 3.0. Lenke til kommentar
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å