Derivata och beräkningar i Python

Permalänk
Medlem

Derivata och beräkningar i Python

Jag använder python 2.7.2

Jag är välldigt osäker på vad dom menar med uppgifterna 5a och 5b ock kan inte fråga min lärare fören tisdag.

Uppgiften är 5a och 5b från http://www.sm.luth.se/csee/courses/d0009e/labbar/lab2.html

och här är det jag har codat
problemet är att den retunerar 0 när den ska retunera ca 0.9911

import math def derivative(f, x, h): t=float((1/(2*h))*(f(x+h)-f(x-h))) print t raw_input() return t def solve(f, x0, h): ''' x0 är startvärdet f är den funktion vars nollställe söks h är nogranheten ''' f=float(f) x0=float(x0) t=0 z=float(h/h/(10**h)) while round(t, h)!= round(f, h): #t = (f-((f**2-x0)/(2*f))) #Det här är formeln jag får att fungera utan att anropa derivative() om jag har förstått uppgiften rätt t = (f-((f**2-x0)/(derivative(math.sin,x0,h)))) print t raw_input() if round(t, h)!= round(f, h): #f = (t-((t**2-x0)/(2*t))) #Det här är formeln jag får att fungera utan att anropa derivative() om jag har förstått uppgiften rätt f = (t-((t**2-x0)/(derivative(math.sin,x0,h)))) print f raw_input() print round(t,h)

Fråga görna om jag har förklarat dåligt eller om ni undrar hur jag tengt.

Visa signatur
Permalänk
Medlem

funktionen derivate ser fin ut.

solve däremot är skum.
Anledning till att du får t=0 är för att du sätter t=0, sedan kollar om t !=f, vilket är falskt då f är en funktion.
Sedan skriver du ut t.

EDIT:
Kanske lite hjälp också...
Varför behöver man x0 (startvärde) som inparameter?
Loopen ska avslutas när resultatet av f(x) är tillräckligt nära 0; där x = f(x)/f'(x).

Någon som kan python bra får gärna säga varför inte round kraschar när den får en funktion som argument. Det borde den ju inte ta?

Permalänk
Medlem

det är derivative(math.sin,x0,h) som returnar 0 när jag skickar solve(12, 1395, 5)
dock om jag använder funktionen derivative(math.sin,1395,0.00001) så får jag tillbaka 0.9911868435075187

Anledningen till att round inte kraschar är för att round(t, h) har ett värde som första gången den testar är 0.00000 och round(f, h) har ett värde som första gången den testar är 1395.00000

-EDIT-

Nu har jag hittat det felet

z=float(h/h/(10**h))
retunerar 0.0

p=float(h)
z=(p/p/(10**p))
retunerar 0.00001

dock så får jag ett annat fel

Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
solve(12,1395,5)
File "G:\Dropbox\Pyton 2.7\Testprogram\Loop.py", line 86, in solve
f = (t-((t**2-x0)/(derivative(math.sin,x0,z))))
OverflowError: (34, 'Result too large')

där line 86 är f = (t-((t**2-x0)/(derivative(math.sin,x0,z))))

Visa signatur
Permalänk
Medlem

Nu förstår jag inte alls vad du gör. f ska vara en funktion beroende på en variabel. Hur kan du skicka in 12 som f?
Kommer bli rätt svårt att hitta nollstället till 12...

Och varför räknar du ut derivatan av sinus? Sinus är ju helt ointressant om nu inte f=sinus...

Permalänk
Medlem

Ändra formeln till t=(1.0/(2*h))*(f(x+h)-f(x-h))

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Jag kollade på http://sv.wikipedia.org/wiki/Newtons_metod för att försöka förstå formeln och det är därifrån jag tagit 12 och 1395.
Som sagt så förstår jag inte rigtigt uppgiften så jag har fått göra som jag tror att dom menar. Om någon kan läsa uppgiften 5a och 5b och förklara i lite andra ord så att jag förstår så skulle det kanske gå bättre.

Sen om jag ska skicka in en formel tex x**2=1395 så får jag felmedelandet att x inte är definerat.

Visa signatur
Permalänk
Medlem

5a har du löst redan.

Kan försöka förklara lite runt 5b:
Du har tre indata (f, x0, h).
h anger noggrannheten för resultatet. (h är ett tal)
x0 är en gissning på en lösning, eller startvärde. (x0 är ett tal)
f är funktionen som ska lösas. (f är en funktion)

Din funktion solve ska returnera ett värde (kallar det resultat) som uppfyller f(resultat) = 0.
resultat är ett tal.

Newton-raphson funkar så att den tar ett startvärde (x0) och för varje iteration förbättrar detta så att resultatet kommer närmare en lösning av funktionen.
I din kod motsvarar det din while loop.
Du ska iterera tills dess att resultatet avviker från noll med mindre än h. Alltså |f(resultat)| < h.

Ett exempel på f som dom använder i uppgiften (x^2-1) borde i python se ut något liknande så här:
def f (x):
return x*x-1