2016-11-25 25 views
5

mam ekspresji jak toDlaczego mój kod Sympy niepoprawnie oblicza aproksymację serii Taylor pierwszego rzędu?

sympy expression

wpisanego w Sympy tak (ze względu na powtarzalny przykład w tej kwestii)

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

na oko to wyrażenie, pierwszego rzędu Przybliżenie Taylora dla dowolnej zmiennej, np k1, wokół niektórych niezerową wartość powinna być różna od zera, ale ten kod

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

prostu zwraca 0. Jest to problem, ponieważ próbuję (ostatecznie) obliczyć przybliżoną serię Taylora z serii, w podobnym stylu, co this answer, a jeśli jedna z ekspansji serii błędnie oceni na zero, wszystko się psuje.

Czy napisałem coś niedobrego, czy też jest to mój podstawowy rachunek tylko TAK, który jest zły, a to faktycznie oznacza zero? Od documentation on series, jestem dość pewna, że ​​używam go poprawnie.

Odpowiedz

4

Myślę, że jest to błąd związany ze sposobem, w jaki operacja dodawania obsługuje Zamówienia.

Ten błąd dotyczy tylko obliczania rzędu zerowego (n = 1) z serii Taylor. Aby tego uniknąć, można zrobić

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

co jest równoważne

expression.subs(k1, x0=x) 

Oto prosty opis tego błędu:

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

wyników w

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

Ale

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

Wyniki w O(x - 1, (x, 1)), zamiast cos(1) + O(x - 1, (x, 1)).

Wyniki tego błędu z błędem w Dodaj

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

wyników w O(x - 1, (x, 1)) zamiast 1 + O(x - 1, (x, 1)).

+0

Wygląda na to, że ten błąd został naprawiony w głównej wersji programu SymPy git master. Tam, 'O (x) .subs (x, x-1) + 1' daje' 1 + O (x - 1, (x, 1)) ', a seria, o której mowa, podaje' O (k₁ - x; k₁ → x) '. – asmeurer