我试图在x = 0时计算函数的导数,但我一直在用我尝试的所有函数得到奇怪的答案。例如,对于f(x)= x ** 2,我得到所有点的导数为2。我的有限差分系数是正确的,对于x,二阶导数是二阶精确的。
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 :(得分:1)
x ^ 2的二阶导数是常数2,你使用二阶导数的中心差商,你也可以用分母中的平方看到。您的结果绝对正确,您的代码完全按照您的要求执行。
要获得具有对称差商的一阶导数,请使用
df[i] = ( f[i+1] - f[i-1] ) / ( 2*step )
答案 1 :(得分:0)
函数f1的x点的一阶导数(对于f1(x)= x ^ 2的情况)可以得到:
def f1(x):
return (x**2)
def derivative (f, x, step=0.0000000000001):
return ((f(x+step)-f(x))/step)
希望有所帮助