【问题标题】:Chain Rule in plain python普通python中的链式法则
【发布时间】:2019-12-26 21:10:21
【问题描述】:

我看到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

问题是当我为x=1.2step=2.6 评估de_chainde(chain) 时,我得到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】:

    您的代码看起来不错。问题在于,通常只用一个差异进行导数估计并不是非常准确,而且您的步长非常大。请记住,导数是您的 de 函数,但它是它的 limit,因为 step 变为 0。

    只考虑您的g(x)。它在x=1 的实际导数是3*x^2 = 3 * 1^2 = 3。但是,如果您的步长为 2.6,您会得到 4.6 的估计值,这与标准相差甚远。

    您可以在此处阅读有关估算导数的更准确方法:https://en.wikipedia.org/wiki/Numerical_differentiation

    【讨论】:

      猜你喜欢
      • 2021-04-19
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-13
      • 2011-04-21
      相关资源
      最近更新 更多