2014-12-04 2 views
1

Я недавно начал использовать sympy для выполнения символических вычислений с помощью python. Сейчас я работаю с ОДОЙ и вчера я пытался решить очень SimPE начальной задачи:Sympy не может решить линейную систему ODE

y1' = y1 + 2 y2, 
    y2' = -2 y1 + y2 + 2 exp(t), 

с начальными условиями

y1(0) = y2(0) = 1 

Питон код я написал следующее:

>>> import sympy as sy  
>>> t=sy.symbols('t') 
>>> y1=sy.Function('y1') 
>>> y2=sy.Function('y2') 
>>> eqs=(sy.Eq(y1(t).diff(t),y1(t)+2*y2(t)), sy.Eq(y2(t).diff(t),-2*y1(t)+y2(t)+2*sy.exp(t))) 
>>> s=sy.dsolve(eqs)  # General solution 
>>> s 
[y1(t) == 2*(C1*sin(2*t) + C2*cos(2*t))*exp(t), 
y2(t) == (2*C1*cos(2*t) - 2*C2*sin(2*t))*exp(t)] 
>>> y1g=s[0].args[1] 
>>> y2g=s[1].args[1] 
>>> # Find C1 and C2 so that the initial condition is satisfied 
>>> sol=sy.solve([y1g.subs(t,0)-1,y2g.subs(t,0)-1]) 
>>> sol 
{C1: 1/2, C2: 1/2} 
>>> y1=y1g.subs(sol) 
>>> y2=y2g.subs(sol) 
>>> [y1,y2] 
[2*(sin(2*t)/2 + cos(2*t)/2)*exp(t), (-sin(2*t) + cos(2*t))*exp(t)] 

Но решение неверно! Я допустил ошибку или это ошибка?

+0

Каким должно быть решение? Если это неправильно, сообщите об этом по адресу https://github.com/sympy/sympy/issues/new. – asmeurer

+0

Спасибо, я сообщил об этом. Я надеюсь, что исправление может быть найдено в ближайшее время. Похоже, что модуль sympy для решения ODE не очень надежный на данный момент, по крайней мере, в отношении систем ODE. – rgallego

ответ

0

Отказ от ответственности: Это не ответ, но комментарий нуждаясь плохо быть четко отформатированный

Я скопировал 1-ая часть вашего кода в файле

% cat sy.py 
import sympy as sy  
t=sy.symbols('t') 
y1=sy.Function('y1') 
y2=sy.Function('y2') 
eqs=(sy.Eq(y1(t).diff(t),y1(t)+2*y2(t)), sy.Eq(y2(t).diff(t),-2*y1(t)+y2(t)+2*sy.exp(t))) 
s=sy.dsolve(eqs) 
% 

, а затем я бегу питона на его

% python2.7 sy.py 
Traceback (most recent call last): 
    File "sy.py", line 6, in <module> 
    s=sy.dsolve(eqs) 
    File "/usr/lib/python2.7/dist-packages/sympy/solvers/ode.py", line 525, in dsolve 
    x0=x0, n=n, **kwargs) 
    File "/usr/lib/python2.7/dist-packages/sympy/solvers/deutils.py", line 174, in _desolve 
    eq, func = _preprocess(eq, func) 
    File "/usr/lib/python2.7/dist-packages/sympy/solvers/deutils.py", line 72, in _preprocess 
    derivs = expr.atoms(Derivative) 
AttributeError: 'tuple' object has no attribute 'atoms' 
% 

Существует несоответствие между тем, что вы сказали, что у вас есть, и тем, что я получаю. и, возможно, это моя вина.

+0

Я забыл сказать, что я использую python 3.3.2, извините. – rgallego

+0

Если код работает в python3 и не работает в python2, это ошибка 'sympy'. К счастью, это не проблема для OP. Поскольку тестирование Debian не имеет пакета 'sympy' для python3, я должен уйти в отставку – gboffi

+0

В любом случае, я только что протестировал код с python 2.7.5 и sympy 0.7.3 в Fedora 19 x64 и работает безупречно – rgallego

Смежные вопросы