为什么我的 Sympy 代码会错误地计算一阶泰勒级数近似值?
Why does my Sympy code calculate the first order Taylor series approximation incorrectly?
我有这样的表情
像这样进入 Sympy(为了这个问题中的可重现示例)
from sympy import *
expression = Add(Mul(Integer(-1), Float('0.9926375361451395', prec=2), Add(Mul(Float('0.33167082639756074', prec=2), Pow(Symbol('k1'), Float('-0.66666666666666674', prec=2)), Pow(Symbol('n1'), Float('0.66666666666666674', prec=2))), Mul(Float('0.97999999999999998', prec=2), exp(Mul(Integer(-1), Symbol('mu1'))))), Pow(Add(Mul(Float('0.97999999999999998', prec=2), Symbol('k1'), exp(Mul(Integer(-1), Symbol('mu1')))), Mul(Integer(-1), Symbol('k2')), Mul(Pow(Symbol('n1'), Float('0.66666666666666674', prec=2)), Pow(Mul(Symbol('k1'), exp(Mul(Integer(-1), Symbol('mu1')))), Float('0.33333333333333331', prec=2)))), Integer(-1))), Pow(Add(Mul(Float('0.97999999999999998', prec=2), Symbol('k0'), exp(Mul(Integer(-1), Symbol('mu0')))), Mul(Integer(-1), Symbol('k1')), Mul(Pow(Symbol('n0'), Float('0.66666666666666674', prec=2)), Pow(Mul(Symbol('k0'), exp(Mul(Integer(-1), Symbol('mu0')))), Float('0.33333333333333331', prec=2)))), Integer(-1)))
观察这个表达式,任何变量的一阶泰勒近似,例如k1
,周围一些非零值应该是非零的,但是这段代码
x = symbol("x")
expression.series(k1, x0 = x, n = 1)
只是 returns 0
。这是一个问题,因为我试图(最终)计算多元泰勒级数近似值,与 this answer 类似,如果其中一个级数展开式错误地计算为零,整个事情就会崩溃。
我是不是编码有误,还是我的基本微积分太差了,结果实际上为零?从 documentation on series
来看,我相当 确定我使用的是正确的。
我认为这是一个与加法操作处理订单的方式有关的错误。
此错误仅在计算泰勒级数的零阶 (n=1) 时适用。为了避免它,你可以做
next(expression.series(k1, x0=x, n=None))
相当于
expression.subs(k1, x0=x)
这里是这个错误的简单描述:
from sympy import cos
from sympy.abc import x
cos(x).series(x, x0=1, n=2)
结果
cos(1) - (x - 1)*sin(1) + O((x - 1)**2, (x, 1))
但是
cos(x).series(x, x0=1, n=1)
结果为 O(x - 1, (x, 1))
,而不是 cos(1) + O(x - 1, (x, 1))
。
此错误是由 Add
中的错误引起的
O(x).subs(x,x-1) + 1
结果为 O(x - 1, (x, 1))
,而不是 1 + O(x - 1, (x, 1))
。
我有这样的表情
像这样进入 Sympy(为了这个问题中的可重现示例)
from sympy import *
expression = Add(Mul(Integer(-1), Float('0.9926375361451395', prec=2), Add(Mul(Float('0.33167082639756074', prec=2), Pow(Symbol('k1'), Float('-0.66666666666666674', prec=2)), Pow(Symbol('n1'), Float('0.66666666666666674', prec=2))), Mul(Float('0.97999999999999998', prec=2), exp(Mul(Integer(-1), Symbol('mu1'))))), Pow(Add(Mul(Float('0.97999999999999998', prec=2), Symbol('k1'), exp(Mul(Integer(-1), Symbol('mu1')))), Mul(Integer(-1), Symbol('k2')), Mul(Pow(Symbol('n1'), Float('0.66666666666666674', prec=2)), Pow(Mul(Symbol('k1'), exp(Mul(Integer(-1), Symbol('mu1')))), Float('0.33333333333333331', prec=2)))), Integer(-1))), Pow(Add(Mul(Float('0.97999999999999998', prec=2), Symbol('k0'), exp(Mul(Integer(-1), Symbol('mu0')))), Mul(Integer(-1), Symbol('k1')), Mul(Pow(Symbol('n0'), Float('0.66666666666666674', prec=2)), Pow(Mul(Symbol('k0'), exp(Mul(Integer(-1), Symbol('mu0')))), Float('0.33333333333333331', prec=2)))), Integer(-1)))
观察这个表达式,任何变量的一阶泰勒近似,例如k1
,周围一些非零值应该是非零的,但是这段代码
x = symbol("x")
expression.series(k1, x0 = x, n = 1)
只是 returns 0
。这是一个问题,因为我试图(最终)计算多元泰勒级数近似值,与 this answer 类似,如果其中一个级数展开式错误地计算为零,整个事情就会崩溃。
我是不是编码有误,还是我的基本微积分太差了,结果实际上为零?从 documentation on series
来看,我相当 确定我使用的是正确的。
我认为这是一个与加法操作处理订单的方式有关的错误。
此错误仅在计算泰勒级数的零阶 (n=1) 时适用。为了避免它,你可以做
next(expression.series(k1, x0=x, n=None))
相当于
expression.subs(k1, x0=x)
这里是这个错误的简单描述:
from sympy import cos
from sympy.abc import x
cos(x).series(x, x0=1, n=2)
结果
cos(1) - (x - 1)*sin(1) + O((x - 1)**2, (x, 1))
但是
cos(x).series(x, x0=1, n=1)
结果为 O(x - 1, (x, 1))
,而不是 cos(1) + O(x - 1, (x, 1))
。
此错误是由 Add
中的错误引起的O(x).subs(x,x-1) + 1
结果为 O(x - 1, (x, 1))
,而不是 1 + O(x - 1, (x, 1))
。