2016-11-25 37 views
5

I (bu, söz konusu yeniden üretilebilir, örneğin uğruna) böyle Sympy girilir buNeden Sympy kodum, Taylor dizisi yaklaşımı ilk sırasını hatalı hesaplıyor?

sympy expression

gibi bir ifade

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

bu ifadeyi eyeballing, birinci dereceden sahip Herhangi bir değişken için Taylor yaklaşımı, örn. k1, bazı sıfırdan farklı bir değer sıfırdan farklı olabilir, ama

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

sadece 0 döndüren bu kod gerekir etrafında. Bu bir problem çünkü (sonuçta) çok değişkenli bir Taylor serisi yaklaşımı, this answer'a benzer bir şekilde hesaplamaya çalışıyorum ve seri genişletmelerden biri yanlışlıkla sıfır olarak değerlendirilirse, her şey bozuluyor.

Yanlış bir kod yazdım mı, yoksa temel matematiğim mi bu kötü ve bu aslında sıfır olarak değerlendiriliyor? documentation on series'dan itibaren, numaralı telefon numaramdan numaralı telefonu düzgün kullanıyorum.

cevap

4

Bu, ekleme işleminin Emirleri işleme biçimiyle ilgili bir hata olduğunu düşünüyorum.

Bu hata, yalnızca Taylor serisinin sıfır sırasını (n = 1) hesaplıyorsanız geçerlidir. Bunu önlemek için, burada

expression.subs(k1, x0=x) 

eşdeğerdir

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

basit Bu hata açıklamasıdır yapabilirsiniz: in

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

Sonuçlar

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

Ancak

cos(1) + O(x - 1, (x, 1)) yerine O(x - 1, (x, 1)) sonuçları. Bir böcekten elde

Bu hata sonucu yerine 1 + O(x - 1, (x, 1)) arasında, O(x - 1, (x, 1)) içinde

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

Sonuçları ekleyin.

+0

Bu hata SymPy'nin git ana sürümünde düzeltildi gibi görünüyor. Orada, O (x) .subs (x, x-1) + 1 ''1 + O (x - 1, (x, 1))' verir ve söz konusu dizi 'O (k₁ - x; k₁ → x) '. – asmeurer