2016-11-25 19 views
5

Tôi có một biểu hiện như thế nàyTại sao mã Sympy của tôi tính toán chuỗi lệnh Taylor đầu tiên xấp xỉ không chính xác?

sympy expression

mà được nhập vào Sympy như thế này (vì lợi ích của một ví dụ tái sản xuất trong câu hỏi này)

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 biểu thức này, thứ tự đầu tiên Taylor xấp xỉ cho bất kỳ biến nào, ví dụ k1, xung quanh một số giá trị khác không nên có khác không, nhưng mã này

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

chỉ trả 0. Đây là một vấn đề bởi vì tôi đang cố gắng (cuối cùng) tính toán một chuỗi Taylor xấp xỉ đa biến, trong một tĩnh mạch tương tự như this answer, và nếu một trong những mở rộng chuỗi đánh giá nhầm 0, toàn bộ điều bị phá vỡ.

Tôi đã viết sai điều gì đó, hoặc là tính toán cơ bản của tôi chỉ là xấu và điều này thực sự đánh giá bằng không? Từ số documentation on series, tôi là khá nhất định rằng tôi đang sử dụng chính xác.

Trả lời

4

Tôi nghĩ đây là lỗi liên quan đến cách hoạt động bổ sung xử lý Đơn đặt hàng.

Lỗi này chỉ áp dụng nếu bạn đang tính toán thứ tự bằng không (n = 1) của chuỗi Taylor. Để tránh điều đó, bạn có thể làm

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

tương đương với

expression.subs(k1, x0=x) 

Đây là một mô tả đơn giản của lỗi này:

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

Kết quả trong

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

Nhưng

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

Kết quả trong O(x - 1, (x, 1)), thay vì cos(1) + O(x - 1, (x, 1)).

kết quả lỗi này từ một lỗi trong Thêm

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

Kết quả trong O(x - 1, (x, 1)), thay vì 1 + O(x - 1, (x, 1)).

+0

Dường như lỗi này được sửa trong phiên bản chính của git master của SymPy. Ở đó, 'O (x) .subs (x, x-1) + 1' cho' 1 + O (x - 1, (x, 1)) ', và chuỗi được đề cập cho' O (k₁ - x; k₁ → x) '. – asmeurer

Các vấn đề liên quan