2016-11-25 3 views
5

J'ai une expression comme cellePourquoi mon code Sympy calcule-t-il incorrectement l'approximation de la série Taylor du premier ordre?

sympy expression

qui est entré en sympy comme celui-ci (pour l'amour d'un exemple reproductible dans cette question)

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))) 

Eyeballing cette expression, le premier ordre Approximation de Taylor pour l'une quelconque des variables, p.ex. k1, autour d'une valeur non nulle doit être différente de zéro, mais ce code

x = symbol("x") 
expression.series(k1, x0 = x, n = 1) 

juste retourne 0. C'est un problème parce que j'essaie de (éventuellement) calculer une approximation de la série de Taylor multivariée, dans la même veine que this answer, et si l'une des expansions de la série est erronée, l'ensemble s'effondre. Est-ce que j'ai codé quelque chose de mal, ou est-ce que mon calcul de base est si mauvais et que cela revient à zéro? De la documentation on series, je suis assez certain que je l'utilise correctement.

Répondre

4

Je pense que c'est un bug lié à la façon dont l'opération d'addition gère les commandes.

Ce bug ne s'applique que si vous calculez l'ordre zéro (n = 1) de la série Taylor. Pour éviter cela, vous pouvez le faire

next(expression.series(k1, x0=x, n=None)) 

qui équivaut à

expression.subs(k1, x0=x) 

Voici une description simple de ce bug:

from sympy import cos 
from sympy.abc import x 
cos(x).series(x, x0=1, n=2) 

Résultats dans

cos(1) - (x - 1)*sin(1) + O((x - 1)**2, (x, 1)) 

Mais

cos(x).series(x, x0=1, n=1) 

Résultats dans O(x - 1, (x, 1)), au lieu de cos(1) + O(x - 1, (x, 1)).

Ce bug résulte d'un bug dans Ajouter

O(x).subs(x,x-1) + 1 

Résultats dans O(x - 1, (x, 1)), au lieu de 1 + O(x - 1, (x, 1)).

+0

On dirait que ce bogue est corrigé dans la version git master de SymPy. Là, 'O (x) .subs (x, x-1) + 1' donne' 1 + O (x - 1, (x, 1)) ', et la série en question donne' O (k₁ - x; k₁ → x) '. – asmeurer