普通python中的链规则

问题描述 投票:0回答:1

[我看到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)中一样,将相同的方法应用于加法和减法结果非常接近。我在做什么错?

谢谢

python math derivative chain calculus
1个回答
1
投票

您的代码看起来正确。问题在于,仅凭一个差值进行导数估算通常并不十分准确,并且此处步长很大。请记住,导数是您的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

© www.soinside.com 2019 - 2024. All rights reserved.