2016-11-15 9 views
1

Ich versuche, die Ableitung einer Funktion bei x = 0 zu berechnen, aber ich bekomme immer ungerade Antworten mit allen Funktionen, die ich versucht habe. Zum Beispiel mit f (x) = x ** 2 bekomme ich die Ableitung zu 2 an allen Punkten. Meine finiten Differenzkoeffizienten sind korrekt, sie ist für die zweite Ableitung in Bezug auf x genau zweiter Ordnung.Finite-Differenz-Näherungen in Python

from numpy import * 
from matplotlib.pyplot import * 

def f1(x): 
    return x**2 

n = 100 # grid points 

x = zeros(n+1,dtype=float) # array to store values of x 
step = 0.02/float(n) # step size 
f = zeros(n+1,dtype=float) # array to store values of f 
df = zeros(n+1,dtype=float) # array to store values of calulated derivative 

for i in range(0,n+1): # adds values to arrays for x and f(x) 
    x[i] = -0.01 + float(i)*step 
    f[i] = f1(x[i]) 

# have to calculate end points seperately using one sided form 

df[0] = (f[2]-2*f[1]+f[0])/step**2 
df[1] = (f[3]-2*f[2]+f[1])/step**2 
df[n-1] = (f[n-1]-2*f[n-2]+f[n-3])/step**2 
df[n] = (f[n]-2*f[n-1]+f[n-2])/step**2 

for i in range(2,n-1): # add values to array for derivative 
    df[i] = (f[i+1]-2*f[i]+f[i-1])/step**2 

print df # returns an array full of 2... 
+0

Haben Sie Druck-Debugging versucht hilft? (Debugging durch Hinzufügen von Aufrufen zu "print" auf Zwischenwerten) – Danra

+0

@Danra Ich habe versucht und das Problem scheint bei der Berechnung df [i] auftreten. Ich habe keine Ahnung, warum, weil die tatsächliche Berechnung korrekt sein sollte, und ich habe auf einem Rechner versucht, aber ich bekomme die gleiche Antwort. Die Mathematik ist richtig, also habe ich keine Ahnung, was falsch ist. –

+0

@Danra mit dem Debugger ist eine bessere Idee – reuns

Antwort

1

Die zweite Ableitung von x^2 ist die Konstante 2, und Sie den zentralen Differenzenquotient für die zweite Ableitung, wie sie auch durch das Quadrat des Nenners sehen kann. Ihr Ergebnis ist absolut korrekt, Ihr Code tut genau das, was Sie ihm gesagt haben.

Um die erste Ableitung mit einem symmetrischen Differenzquotienten zu erhalten, an der Stelle x der Funktion f1

df[i] = (f[i+1] - f[i-1])/(2*step) 
+0

Ich habe tatsächlich die zweite Ableitung gemeint, aber vergessen, dass ich die zweite Ableitung meinte, also habe ich alle Werte als falsch überprüft. Danke, dass Sie mich in die richtige Richtung weisen. –

0

Ableitung erster Ordnung verwendet werden (für den Fall F1 (x) = x^2) erhalten werden kann:

def f1(x): 

    return (x**2) 

def derivative (f, x, step=0.0000000000001): 

    return ((f(x+step)-f(x))/step) 

Hoffnung, die