为什么我的Sympy代码错误地计算了一阶泰勒级数近似?

时间:2016-11-25 05:07:58

标签: python sympy derivative taylor-series

我有一个像这样的表达

sympy expression

这样进入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)

只返回0。这是一个问题,因为我试图(最终)计算多元泰勒级数近似,与this answer类似,如果其中一个系列扩展错误地评估为零,整个事情就会崩溃

我是否编写了错误的代码,或者我的基本微积分是不是很糟糕,这实际上是评估为零?从documentation on series,我相当确定我正确使用它。

1 个答案:

答案 0 :(得分:4)

我认为这是与添加操作处理订单的方式相关的错误。

仅当您计算泰勒级数的零级(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))

此错误是由添加

中的错误引起的
O(x).subs(x,x-1) + 1

结果为O(x - 1, (x, 1)),而不是1 + O(x - 1, (x, 1))