普通python中的链式规则

2024-06-16 12:32:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我看到这个问题已经为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_chainde(chain)x=1.2step=2.6时,我得到de(chain) = 205.5446...de_chain = 1238.6639...。你知道吗

这里有些问题,因为同样的方法也适用于加法和减法,就像k'(x) = g'(x) + f'(x) where k(x) = g(x) + f(x) 结果非常接近。我做错什么了?你知道吗

谢谢


Tags: chainreturn规则defstepdewhere链式
1条回答
网友
1楼 · 发布于 2024-06-16 12:32:18

你的代码看起来不错。问题是,仅仅用一个差来做导数估计,一般来说,并不十分准确,而且这里的步长相当大。记住导数是你的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

相关问题 更多 >