[我看到sympy的问题已经回答,但是我正试图在没有第三方库的玩具项目上出于教育目的编写链式规则的实现。
基本链规则为k'(x) = f'(g(x)) * g'(x) where k(x) = f(g(x))
我具有以下功能:
def g(x):
return x**3 + 2
def f(x):
return x**2 + 7
def de(fn, x, step):
t1 = fn(x)
t2 = fn(x+step)
return (t2 - t1) / step
def chain(x):
return f(g(x))
def de_chain(x, step):
d_g = de(g, x, step)
gres = g(x)
d_f_g = de(f, gres, step)
return d_g * d_f_g
问题是当我对de_chain
和de(chain)
评估x=1.2
和step=2.6
时,我得到de(chain) = 205.5446...
和de_chain = 1238.6639...
。
这里有些错误,因为像k'(x) = g'(x) + f'(x) where k(x) = g(x) + f(x)
中一样,将相同的方法应用于加法和减法结果非常接近。我在做什么错?
谢谢
您的代码看起来正确。问题在于,仅凭一个差值进行导数估算通常并不十分准确,并且此处步长很大。请记住,导数是您的de
函数,但当step
变为0时,它就是函数的limit。
仅考虑您的g(x)
。其在x=1
的实际导数为3*x^2 = 3 * 1^2 = 3
。但是,如果您的步长为2.6,那么您将获得4.6的估算值,这与实际目标相去甚远。
您可以在此处阅读有关估计导数的更准确方法的更多信息:https://en.wikipedia.org/wiki/Numerical_differentiation