Gå til innhold

Anbefalte innlegg

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
Videoannonse
Annonse

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 av etse
Lenke til kommentar

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

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 av etse
Lenke til kommentar

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 av Djn
Lenke til kommentar

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

 

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

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

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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...