解常微分方程

解常微分方程问题

1假设在平面内有一带电粒子q,质量为m。空间内存在匀强磁场B,方向垂直于平面向内即沿z轴负半轴,以及一个沿y轴负半轴的重力场。带电粒子从磁场内O点释放。

则可直接列出粒子的运动方程,将这个方程分解成x和y两个方向,联立即可求得该方程组的解。

 

sympy中的dsolve方法

Python例程

 1 #导入
 2 from sympy import *
 3 import numpy as np
 4 import matplotlib.pyplot as plt
 5 init_printing()
 6 
 7 ###首先声明符号x,y,q,m,B,g
 8 #参量
 9 q,m,B,t,g = symbols("q m B t g",real=True,nonzero=True,positive=True)
10 #函数
11 x,y = symbols("x y",real=True,nonzero=True,positive=True,cls=Function)
12 
13 ###再将微分方程表示出来
14 eq1 = Eq(x(t).diff(t,t),-q*B*y(t).diff(t)/m)
15 eq2 = Eq(y(t).diff(t,t),-g+q*B*x(t).diff(t)/m)
16 sol = dsolve([eq1,eq2])
17 print("微分方程:",sol)   #现在打印出sol
18 
19 ###这个式子非常冗杂,用trigsimp()方法化简
20 x = trigsimp(sol[0].rhs)
21 y = trigsimp(sol[1].rhs)
22 print("化简:",x,y)
23 
24 ###将里面的积分常数算出
25 #定义积分变量,避免报错,观察上式输出式子中有几个C这里就定义几个
26 var("C1 C2 C3 C4")
27 #x(0)=0
28 e1 = Eq(x.subs({t:0}),0)
29 #x"(0)=0,要将subs放在diff后面
30 e2 = Eq(x.diff(t).subs({t:0}),0)
31 #y(0)=0
32 e3 = Eq(y.subs({t:0}),0)
33 #y"(0)=0
34 e4 = Eq(y.diff(t).subs({t:0}),0)
35 l = solve([e1,e2,e3,e4],[C1,C2,C3,C4])
36 print("积分常数:",l)
37 
38 ###将积分常量替换到x和y里面,我们就得到了解的最终形式
39 x = x.subs(l)
40 y = y.subs(l)
41 print("最终形式:",x,y)
42 
43 #作图
44 ts = np.linspace(0,15,1000)
45 consts = {q:1,B:1,g:9.8,m:1}
46 fx = lambdify(t,x.subs(consts),"numpy")
47 fy = lambdify(t,y.subs(consts),"numpy")
48 plt.plot(fx(ts),fy(ts))
49 plt.grid()
50 plt.show()
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 解常微分方程