sympy:dsolve用于微分方程组

时间:2017-01-13 17:14:53

标签: syntax sympy calculus

如何解决颂歌系统?

那是我尝试过的:

from sympy import *;
init_printing()

Ex,Ey,Ez,Bx,By,Bz,c,m0,t,u,we,wb,q=symbols('E_x E_y E_z B_x B_y B_z c m_0 t u omega_E omega_B q')
tau=dynamicsymbols('tau')

u0=Function('u^0')(tau) 
u1=Function('u^1')(tau)
u2=Function('u^2')(tau)
u3=Function('u^3')(tau) # edit

u=Matrix([u0,u1,u2,u3])
Emat=Matrix([[0,Ex/c,Ey/c,Ez/c],[Ex/c,0,Bz,-By],[Ey/c,-Bz,0,Bx],[Ez/c,By,-Bx,0]])
RHS=q/m0*Emat*u

odesys=[Eq(u0.diff(),RHS[0]),Eq(u1.diff(),RHS[1]),Eq(u2.diff(),RHS[2]),Eq(u3.diff(),RHS[3])]
odesys
dsolve(odesys,[u0(tau),u1(tau),u2(tau),u3(tau)])

不幸的是它给了我一个TypeError:

TypeError                                 Traceback (most recent call last)
<ipython-input-94-f4af1f7e485c> in <module>()
     16 odesys=[Eq(u0.diff(),RHS[0]),Eq(u1.diff(),RHS[1]),Eq(u2.diff(),RHS[2]),Eq(u3.diff(),RHS[3])]
     17 odesys
---> 18 dsolve(odesys,[u0(tau),u1(tau),u2(tau),u3(tau)])

TypeError: 'u^0' object is not callable

我已经尝试了很多东西,但我无法弄清楚这个工作的正确语法。 有什么想法吗?

顺便说一句:如果我使用的是动态符号而不是函数,它没有任何帮助:

...
u0,u1,u2,u3=dynamicsymbols('u^0 u^1 u^2 u^3')
...
dsolve(odesys,[u0(t),u1(t),u2(t),u3(t)])

- &GT;相同的TypeError

编辑: 我让dsolve更容易一点,只是要求它解决第一个等式(满分为4),同时保持我的函数定义:

dsolve(Eq(u0.diff(),RHS[0]))  

- &GT;这实际上有效。

下一步:求解第一和第二个等式:

dsolve([Eq(u0.diff(),RHS[0]),Eq(u1.diff(),RHS[1])])  

- &GT; &#34; ...未实施错误&#34;

对于物理学家来说,这是一种日常问题。更好地坚持使用Mathematica

1 个答案:

答案 0 :(得分:3)

你写u0=Function('u^0')(tau)这意味着u0是带有符号“u ^ 0”且带有“tau”作为参数传入的函数。然后u0(t)没有意义;你已经说过函数的论点了。这就像写u ^ 0(tau)(t),没有意义。

因此,要么u0=Function('u^0')没有参数(然后在公式中提供),要么将u0(t)更改为u0

u3的定义中也有拼写错误,使其与u0相同。

最后,tau的一个函数是t的函数,而且微分方程中未知函数的参数也是模糊的。你在功能方面有所区别,这对于人们来说很难理解,更不用说计算机了。

我建议说明系统,以便清楚自变量是什么,以及衍生物是否在该变量中。

在SymPy中解决简单ODE系统的示例

from sympy import *
t = symbols('t')
x = Function('x')(t)
y = Function('y')(t)
sol = dsolve([x.diff() - y, y.diff() + x])

获取[Eq(x(t), C1*sin(t) + C2*cos(t)), Eq(y(t), C1*cos(t) - C2*sin(t))]