Не так давно я обнаружил scipy.misc.derivative
.
def derivative(func, x0, dx=1.0, n=1, args=(), order=3)
Невероятно, насколько это быстро и точно.Итак, я решил выяснить, как это работает.Но я не до конца понимаю код этой функции, который используется в derivative
:
def central_diff_weights(Np, ndiv=1)
Насколько я понимаю, функция находит коэффициенты в разложении производной высшего порядка,но как это сделать?
Источник: https://github.com/scipy/scipy/blob/v0.18.0/scipy/misc/common.py#L179-L249
Код:
def central_diff_weights(Np, ndiv=1):
"""
Return weights for an Np-point central derivative.
Assumes equally-spaced function points.
If weights are in the vector w, then
derivative is w[0] * f(x-ho*dx) + ... + w[-1] * f(x+h0*dx)
Parameters
----------
Np : int
Number of points for the central derivative.
ndiv : int, optional
Number of divisions. Default is 1.
Notes
-----
Can be inaccurate for large number of points.
"""
if Np < ndiv + 1:
raise ValueError("Number of points must be at least the derivative order
+ 1.")
if Np % 2 == 0:
raise ValueError("The number of points must be odd.")
from scipy import linalg
ho = Np >> 1
x = arange(-ho,ho+1.0)
x = x[:,newaxis]
X = x**0.0
for k in range(1,Np):
X = hstack([X,x**k])
w = product(arange(1,ndiv+1),axis=0)*linalg.inv(X)[ndiv]
return w