草庐IT

解常微分方程

hongbao 2023-04-16 原文

解常微分方程问题

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

解一阶常微分方程:dy/dx=y
Python例程
1 from sympy import *
2 f = symbols('f', cls=Function)#定义函数标识符
3 x = symbols('x')#定义变量
4 eq = Eq(diff(f(x),x,1),f(x))#构造等式,即dy/dx=y
5 #diff(函数,自变量,求导次数)
6 print(dsolve(eq, f(x)))
7 pprint(dsolve(eq, f(x)))#以"pretty"形式打印方程的解

解二阶常微分方程:y"+py'+qy=0
Python例程
1 from sympy import *
2 f = symbols('f', cls=Function)#定义函数标识符
3 x,p,q = symbols('x,p,q')#批量定义变量
4 eq = Eq(diff(f(x),x,2)+p*diff(f(x),x,1)+q*f(x),0)
5 #构造方程,即y"+py'+qy=0
6 #diff(函数,自变量,求导次数)
7 print(dsolve(eq, f(x)))
8 pprint(dsolve(eq, f(x)))#以"pretty"形式打印方程的解

 

常微分方程绘图

Python例程
 1 #绘图
 2 import numpy as np
 3 import matplotlib.pyplot as plt
 4 from scipy.integrate import odeint
 5 
 6 def diff(y, x):
 7    return np.array(1/x)
 8    # 上面定义的函数在odeint里面体现的就是dy/dx =1/x    #定义常微分方程
 9 x = np.linspace(1, 10, 100)  # 给出x范围,(起始,终值,分割段数)
10 y = odeint(diff, 0, x)  # 设函数初值为0,即f(1)=0
11 plt.xlabel('x')
12 plt.ylabel('y')
13 plt.title("y=ln(x)")    #定义图的标题
14 plt.grid()#绘制网格
15 plt.plot(x, y)  # 将x,y两个数组进行绘图
16 plt.show()

 

单摆运动:y"+gsin(y)/l=0,g为重力加速度,l为摆长

Python例程
 1 from scipy.integrate import odeint
 2 import matplotlib.pyplot as plt
 3 import numpy as np
 4 
 5 g = 9.8
 6 l = 1
 7 #重力加速度为9.8m/s,摆长为1m,y"+gsin(y)/l=0,g为重力加速度,l为摆长
 8 def diff(d_list, t):#我们可以将一个二阶常微分方程分解为含有两个方程的一阶常微分方程组
 9    omega, theta = d_list
10    return np.array([-g/l*np.sin(theta), omega])
11 '''
12 深入剖析diff函数:diff的左边代表dω/dt和dθ/dt,由于函数返回的是数组类型,我们
13 可以用这种方式构建一个微分方程组:dθ/dt=ω,dω/dt=-gsin(θ)/l
14 '''
15 t = np.linspace(0, 10, 1000)
16 result = odeint(diff, [0, 30/180*np.pi], t)
17 # odeint中第二个是初始单摆角度30度,无法采用小角近似
18 plt.xlabel('x')
19 plt.ylabel('y')
20 plt.title("dθ/dt=ω,dω/dt=-gsin(θ)/l")
21 plt.plot(t, result)  # 输出ω和θ随时变化曲线,即方程解
22 plt.show()

 

洛伦兹曲线:
  以下方程组代表曲线在xyz三个方向上的速度,给定一个初始点,可以画出相应的洛伦兹曲线。

Python例程
 1 import numpy as np
 2 from scipy.integrate import odeint
 3 from mpl_toolkits.mplot3d import Axes3D
 4 import matplotlib.pyplot as plt
 5 
 6 def dmove(Point, t, sets):
 7     """
 8     point:present location index
 9     sets:super parameters
10     """
11     p, r, b = sets
12     x, y, z = Point
13     return np.array([p * (y - x), x * (r - z), x * y - b * z])
14 
15 t = np.arange(0, 30, 0.001)
16 P1 = odeint(dmove, (0., 1., 0.), t, args=([10., 28., 3.],))  #
17 ## (0.,1.,0.) is the initial point; args is the set for super parameters
18 P2 = odeint(dmove, (0., 1.01, 0.), t, args=([10., 28., 3.],))
19 ## slightly change the initial point from y = 1.0 to be y = 1.01
20 
21 fig = plt.figure()
22 ax = Axes3D(fig)
23 ax.plot(P1[:, 0], P1[:, 1], P1[:, 2])
24 ax.plot(P2[:, 0], P2[:, 1], P2[:, 2])
25 plt.show()

有关解常微分方程的更多相关文章

  1. ruby-on-rails - ruby 日期方程不返回预期的真值 - 2

    为什么以下不同?Time.now.end_of_day==Time.now.end_of_day-0.days#falseTime.now.end_of_day.to_s==Time.now.end_of_day-0.days.to_s#true 最佳答案 因为纳秒数不同:ruby-1.9.2-p180:014>(Time.now.end_of_day-0.days).nsec=>999999000ruby-1.9.2-p180:015>Time.now.end_of_day.nsec=>999999998

  2. ruby - 如何从 Sass 混合方程中删除测量单位? - 2

    我编写了一个非常简单的Sassmixin,用于将像素值转换为rem值(请参阅JonathanSnook的articleonthebenefitsofusingrems)。这是代码://MixinCode$base_font_size:10;//10px@mixinrem($key,$px){#{$key}:#{$px}px;#{$key}:#{$px/$base_font_size}rem;}//Includesyntaxp{@includerem(font-size,14);}//RenderedCSSp{font-size:14px;font-size:1.4rem;}这个mixi

  3. 脑电数据集提取微分熵特征(以SEED数据集为例) - 2

    前言SEED数据集是常用的脑电信号情绪识别数据集,在该数据集的Preprocessed_EEG文件夹中是原始的脑电数据,在ExtractedFeatures文件夹中是官方提取特征后的数据(提取了多种特征可直接使用)。既然官方已经把特征提取好了为什么还要自己做特征提取?官方并没有开源提取特征的代码。为了处理其他数据集或者自己的数据。微分熵(de)作为脑电中非常好的脑电特征目前在网上却很难找到实现的放发,收费的代码大多也是错的或者是不完整的。带通滤波器人类的脑电图中脑波频率可以在0.5到几十赫兹,通常按照频率进行分类以表示各种成分:δ波(0.5-4Hz),θ波(4-8Hz),α波(8-13Hz),

  4. javascript/threejs - 围绕中心 y 轴(在 3D 空间中)在圆中移动对象的方程式 - 2

    我正在试验threeJS,我已经定位了一个相机并查看场景的原点(0,0,0)。我想以设定的距离(半径)围绕y轴绕一圈移动该相机,同时保持其对原点的关注,但我不确定如何设置方程式。目前,我只是在旋转对象本身,但我想改为旋转相机。这是我移动网格的代码:functioncheckRotation(){if(keyboard.pressed("left")){mesh.rotation.y+=.05;}if(keyboard.pressed("right")){mesh.rotation.y-=.05;}}下面是一些移动相机的例子:camera.position.x=???(移动其x位置的一些

  5. javascript - 如何编写正则表达式从字符串方程中拆分两个连续的数学运算符( "/-"、 "*-")? - 2

    我正在尝试解决需要将字符串方程式转换为数字和运算符数组的问题。但我做不到。我编写的用于将字符串方程式转换为数组的正则表达式。Input:'1+2-33/45*78'.split(/([\\+\-\\*\\/]+)/)Output:["1","+","2","-","33","/","45","*","78"]但是当你有两个连续的运算符-(*-)时,上面的正则表达式并不适用。有关更多说明,请参见下文。Input:'1+2-33/-45*-78'.split(/([\\+\-\\*\\/]+)/)Output:["1","+","2","-","33","/-","45","*-","78

  6. javascript - 在 Javascript 中使用随机数和运算符生成随机数学方程式 - 2

    我想创建一个程序,它应该使用Randomno打印出最简单形式的数学表达式,例如(21+13)*56。1到100,程序必须带一个level参数,level决定生成方程的长度,例如:游戏必须生成包含加法+和乘法*运算符的方程式,例如(21+13)*56。(使用括号)----level275-54=2162+15=7788/22=493+22=11590*11=990--level3(21+13)*56=190482-19+16=7951*(68-2)=3366输入将是表单:例如level3输出应该是:(21+13)*56//SimpleexpressionusingRandomno.s到目

  7. javascript - 获取鼠标相对于饼图的位置(方程式) - 2

    我已经从一组数据创建了一个Canvas饼图,我现在试图定位鼠标相对于饼图的位置,以检测悬停在哪个数据部分。我快到了,但我被一个等式困住了。我的逻辑运行良好,所以我认为这更像是一道数学题,但我会看看其他人对我的方法有何看法。这是我的饼图和我正在使用的变量:图像上列出的变量是我必须使用的变量(mouseX、mouseY、距中心的距离、半径、圆周率(圆周率)和数据点在圆周上相对于圆周率的部分)。图表的起始部分从右边开始,从pi*2的0开始到pi*2的100%,然后灰色部分的起始位置为1.34...相对于pie*2和结束2.228的位置...我目前的主要问题是使用像素测量来计算它相对于pi的位

  8. javascript - Mathjax 多线方程渲染问题 - 2

    我正在使用MathJax在网页中显示数学。我的MathJax代码如下所示:MathJax.Hub.Config({tex2jax:{inlineMath:[['$','$'],["\\(","\\)"]],processEscapes:true}});MathJax似乎工作得很好,但我就是想不通究竟如何编写多线方程。例如,此多线方程无法正确呈现。整个等式在一行而不是3行:$$\begin{eqnarray}y&=&x^4+4\nonumber\\&=&(x^2+2)^2-4x^2\nonumber\\&\le&(x^2+2)^2\nonumber\end{eqnarray}$$

  9. javascript - 3d 三 Angular 方程 - 2

    我正在尝试编写一个小型“透视”javascript应用程序,它允许我飞过位于3d空间中的一组x、y、z点。我有一个相机的概念,它改变它的旋转和xyz位置,而每个点保持一个恒定的xyz点。然后我有一组方程式可以计算出应该如何调整相机的x、y、z坐标以直接向前飞行。x、y、z调整显然取决于相机的旋转。它几乎可以工作,但在某些“姿态”下,相机位置调整出错,飞行路径不会直线前进,而是以一定Angular偏离,甚至倒退。计算投影的方程式如下:vardirectionFactor=1;if(direction=='backward')directionFactor=-1;sx=Math.sin(c

  10. javascript - Mathjax - 当有顶部固定菜单时,为方程的目标 "\eqref"链接添加偏移量 - 2

    我尝试使用“纯”CSS解决方案或使用Javascript来实现为等式上的Matjaxanchor链接添加偏移量。当我在页面上向下滚动时,会出现一个固定的顶部菜单。我用这样的Javascript处理这种行为:$(window).bind("load",function(){$('a[href*="#"]').click(function(event){event.preventDefault();if(location.pathname.replace(/^\//,'')==this.pathname.replace(/^\//,'')&&location.hostname==this.

随机推荐