scipy模块计算导数方法(central_diff_weights)

scipy中计算导数有两种方式:

  1. central_diff_weights
  2. derivative

其中第一种方式在scipy帮助中,没有写很清楚,这里重点讲一下。

就举一个例子: 计算下列函数在 x = 1 x=1 x=1处的2阶导数
f ( x ) = 3 x + x 3 f(x) = 3^{x} + x^{3} f(x)=3x+x3
利用求导公式,我们很容易得到这个值:9.620846882437746

要利用第一种方法,需要有若干个(N)在求导点附近的函数值,并且需要均匀。N还需要满足两个条件

  1. N为奇数
  2. N大于导数的阶数;比如要计算1阶导数,N>1;计算2阶导数, N>2

我们取N=5, 计算在 x = 1 x=1 x=1的附近的5个函数值,左右对称
f ( 0.8 ) , f ( 0.9 ) , f ( 1 ) , f ( 1.1 ) , f ( 1.2 ) f(0.8) ,f(0.9), f(1), f(1.1), f(1.2) f(0.8),f(0.9),f(1),f(1.1),f(1.2)

central_diff_weights(5,2), 返回的是计算2阶导数的各个值的权重,把这5个值和以上5个函数值相乘,并且除以间隔值0.1两次,即为导数

from scipy.misc import central_diff_weights
from scipy.misc import derivative
import numpy as np

def f(x):
    return 3**x + x**3

x = np.r_[0.8:1.2:5j]
y = np.vectorize(f)(x)

w = central_diff_weights(5, 2)
print(np.sum(y*w) / 0.1 / 0.1)    

计算的值为:9.620841015472953 与理论值很接近了

下面用另一种方法derivative 计算导数,这种方法比较直观

derivative(f, x0=1, dx=0.0001, n=2)

计算的值为:9.620846874724975

你可能感兴趣的:(python,scipy,导数,derivative,求导,weight)