我看到这个问题已经为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时的极限。你知道吗想想你的
g(x)
。它在x=1
的实际导数是3*x^2 = 3 * 1^2 = 3
。但是如果你的步幅是2.6,你会得到一个4.6的估计值,这是非常离谱的。你知道吗你可以在这里阅读更精确的导数估计方法:https://en.wikipedia.org/wiki/Numerical_differentiation
相关问题 更多 >
编程相关推荐