模拟钟摆周期性摆动的运动gydF4y2Ba
这个例子展示了如何使用符号数学工具箱™来模拟一个简单的摆的运动。推导出摆的运动方程,对小角度进行解析求解,对任意角度进行数值求解。gydF4y2Ba
第一步:推导运动方程gydF4y2Ba
摆是一个遵循微分方程的简单机械系统。钟摆最初处于垂直静止状态。当钟摆移动一个角度时gydF4y2Ba 释放后,重力会把它拉回静止位置。它的动量使它超越并形成一个角度gydF4y2Ba (如果没有摩擦力),以此类推。由重力引起的沿摆运动方向的恢复力为gydF4y2Ba .因此,根据牛顿第二定律,质量乘以加速度必须相等gydF4y2Ba .gydF4y2Ba
信谊gydF4y2Ba米gydF4y2Ba一个gydF4y2BaggydF4y2Baθ(t)gydF4y2BaEqn = m*a == -m*g*sin(theta)gydF4y2Ba
eqn (t) =gydF4y2Ba
对于有长度的钟摆gydF4y2Ba ,摆鲍勃的加速度等于角加速度乘以gydF4y2Ba .gydF4y2Ba
.gydF4y2Ba
代替gydF4y2Ba
通过使用gydF4y2Ba潜艇gydF4y2Ba
.gydF4y2Ba
信谊gydF4y2BargydF4y2BaEqn = subs(Eqn,a,r*diff(theta,2))gydF4y2Ba
eqn (t) =gydF4y2Ba
孤立角加速度gydF4y2BaeqngydF4y2Ba
通过使用gydF4y2Ba隔离gydF4y2Ba
.gydF4y2Ba
Eqn = isolate(Eqn,diff(theta,2))gydF4y2Ba
eqn =gydF4y2Ba
收集常量gydF4y2Ba 而且gydF4y2Ba 转换为单个参数,也称为gydF4y2Ba固有频率gydF4y2Ba.gydF4y2Ba
.gydF4y2Ba
信谊gydF4y2Baomega_0gydF4y2BaEqn = s(Eqn,g/r, 0^2)gydF4y2Ba
eqn =gydF4y2Ba
步骤2:线性化运动方程gydF4y2Ba
运动方程是非线性的,因此很难解析求解。假设角很小,用泰勒展开将方程线性化gydF4y2Ba .gydF4y2Ba
信谊gydF4y2BaxgydF4y2Ba近似= taylor(sin(x) x,gydF4y2Ba“秩序”gydF4y2Ba2);近似= subs(近似,x, (t))gydF4y2Ba
约=gydF4y2Ba
运动方程变成了线性方程。gydF4y2Ba
eqnLinear = subs(eqn,sin((t)),近似)gydF4y2Ba
eqnLinear =gydF4y2Ba
第三步:解析求解运动方程gydF4y2Ba
解方程gydF4y2BaeqnLineargydF4y2Ba
通过使用gydF4y2BadsolvegydF4y2Ba
.指定初始条件作为第二个参数。通过假设简化解决方案gydF4y2Ba
是真正的使用gydF4y2Ba假设gydF4y2Ba
.gydF4y2Ba
信谊gydF4y2Batheta_0gydF4y2Batheta_t0gydF4y2BaTheta_t = diff(theta);Cond = [theta(0) == theta_0, theta_t(0) == theta_t0];假设(omega_0gydF4y2Ba“真实”的gydF4y2Ba) thetaSol(t) = dsolve(eqnLinear,cond)gydF4y2Ba
thetaSol (t) =gydF4y2Ba
第四步:物理意义gydF4y2Ba
这个词gydF4y2Ba 叫做gydF4y2Ba阶段gydF4y2Ba.cos和sin函数每次都重复gydF4y2Ba .时间需要改变gydF4y2Ba 通过gydF4y2Ba 称为时间段。gydF4y2Ba
.gydF4y2Ba
时间段gydF4y2Ba 正比于钟摆长度的平方根它与质量无关。对于线性运动方程,时间周期与初始条件无关。gydF4y2Ba
第五步:绘制钟摆运动图gydF4y2Ba
为小角度近似画出钟摆的运动。gydF4y2Ba
定义物理参数:gydF4y2Ba
重力加速度gydF4y2Ba
摆长gydF4y2Ba
gValue = 9.81;rValue = 1;omega_0Value = sqrt(gValue/rValue);T = 2*pi/omega_0Value;gydF4y2Ba
设置初始条件。gydF4y2Ba
theta_0Value = 0.1*pi;gydF4y2Ba%解只适用于小角度。gydF4y2Batheta_t0Value = 0;gydF4y2Ba最初处于静止状态。gydF4y2Ba
将物理参数和初始条件代入通解。gydF4y2Ba
Vars = [omega_0 theta_0 theta_t0];values = [omega_0Value theta_0Value theta_t0Value];thetaSolPlot = subs(thetaSol,vars,values);gydF4y2Ba
画出谐摆运动。gydF4y2Ba
fplot(thetaSolPlot(t* t)/pi, [0 5]);网格gydF4y2Ba在gydF4y2Ba;标题(gydF4y2Ba“谐摆运动”gydF4y2Ba);包含(gydF4y2Ba“电汇”gydF4y2Ba);ylabel (gydF4y2Ba“θ/ \ \π”gydF4y2Ba);gydF4y2Ba
在找到解之后gydF4y2Ba ,想象一下钟摆的运动。gydF4y2Ba
x_pos = sin(thetaSolPlot);y_pos = -cos(thetaSolPlot);fanimator (@fplot x_pos y_pos,gydF4y2Ba“柯”gydF4y2Ba,gydF4y2Ba“MarkerFaceColor”gydF4y2Ba,gydF4y2Ba“k”gydF4y2Ba,gydF4y2Ba“AnimationRange”gydF4y2Ba[0 5 * T]);持有gydF4y2Ba在gydF4y2Ba;fananimator (@(t) plot([0 x_pos(t)],[0 y_pos(t)],gydF4y2Ba“k -”gydF4y2Ba),gydF4y2Ba“AnimationRange”gydF4y2Ba[0 5 * T]);fanimator (@ (t)文本(-0.3,0.3,gydF4y2Ba计时器:“gydF4y2Ba+ num2str (t, 2) +gydF4y2Ba“s”gydF4y2Ba),gydF4y2Ba“AnimationRange”gydF4y2Ba[0 5 * T]);gydF4y2Ba
输入命令gydF4y2Ba那里gydF4y2Ba
播放钟摆运动的动画。gydF4y2Ba
第六步:用恒定能量路径确定非线性摆运动gydF4y2Ba
为了理解摆的非线性运动,可以利用总能量方程来可视化摆的路径。总能量是守恒的。gydF4y2Ba
用三角恒等式gydF4y2Ba 以及这个关系gydF4y2Ba 重写能量的比例。gydF4y2Ba
由于能量是守恒的,所以摆的运动可以用相空间中的常能量路径来描述。相空间是一个具有坐标的抽象空间gydF4y2Ba
而且gydF4y2Ba
.使用以下命令可视化这些路径gydF4y2BafcontourgydF4y2Ba
.gydF4y2Ba
信谊gydF4y2BaθgydF4y2Batheta_tgydF4y2Baomega_0gydF4y2BaE(θ,theta_t omega_0) = (1/2) * (theta_t ^ 2 + (2 * omega_0 * sin(θ/ 2))^ 2);Eplot(, theta_t) = subs(E,omega_0,omega_0Value);图;fc = fcontour(Eplot(pi*theta, 2*omega_0Value*theta_t), 2*[-1 1 -1 1],gydF4y2Ba...gydF4y2Ba“线宽”gydF4y2Ba2,gydF4y2Ba“LevelList”gydF4y2Ba0:5:50,gydF4y2Ba“MeshDensity”gydF4y2Ba1 + 2 ^ 8);网格gydF4y2Ba在gydF4y2Ba;标题(gydF4y2Ba相空间中的恒能量等高线(\theta vs \theta_t)gydF4y2Ba);包含(gydF4y2Ba“θ/ \ \π”gydF4y2Ba);ylabel (gydF4y2Ba“\ theta_t / 2 \ omega_0”gydF4y2Ba);gydF4y2Ba
能量等高线是对称的gydF4y2Ba 轴和gydF4y2Ba 轴,它们是周期性的gydF4y2Ba 轴。该图显示了两个不同行为的区域。gydF4y2Ba
等高线图中较低的能量会自我闭合。钟摆在两个最大角度和速度之间来回摆动。钟摆的动能不足以克服引力能,使钟摆完成一个完整的循环。gydF4y2Ba
等高线图中较高的能量不会自行闭合。钟摆总是沿一个角度方向运动。钟摆的动能足以克服引力能,使钟摆能绕一个完整的圈。gydF4y2Ba
第七步:求解非线性运动方程gydF4y2Ba
非线性运动方程是二阶微分方程。用数值方法求解这些方程gydF4y2Ba数值gydF4y2Ba
解算器。因为gydF4y2Ba数值gydF4y2Ba
只接受一阶系统,将系统简化为一阶系统。然后,生成作为输入的函数句柄gydF4y2Ba数值gydF4y2Ba
.gydF4y2Ba
将二阶ODE重写为一阶ODE的系统。gydF4y2Ba
信谊gydF4y2Baθ(t)gydF4y2Batheta_t (t)gydF4y2Baomega_0gydF4y2Ba= [diff(theta) == theta_t;Diff (theta_t) == -omega_0^2*sin(theta)]gydF4y2Ba
方程式(t) =gydF4y2Ba
eqs = subs(eqs,omega_0,omega_0Value);Vars = [theta, theta_t];gydF4y2Ba
求质量矩阵gydF4y2Ba米gydF4y2Ba
和方程的右边gydF4y2BaFgydF4y2Ba
.gydF4y2Ba
[M,F] = massMatrixForm(eqs,vars)gydF4y2Ba
M =gydF4y2Ba
F =gydF4y2Ba
米gydF4y2Ba
而且gydF4y2BaFgydF4y2Ba
请参阅此表格。gydF4y2Ba
为了进一步简化计算,将系统改写为以下形式gydF4y2Ba .gydF4y2Ba
f = M\ fgydF4y2Ba
f =gydF4y2Ba
转换gydF4y2BafgydF4y2Ba
对MATLAB函数句柄进行使用gydF4y2BaodeFunctiongydF4y2Ba
.得到的函数句柄是MATLAB ODE求解器的输入gydF4y2Ba数值gydF4y2Ba
.gydF4y2Ba
f = odeFunction(f, vars)gydF4y2Ba
f =gydF4y2BaFunction_handle with value:gydF4y2Ba@ (t, in2) [in2(2:);罪(in2(1:))。* 2./1.0 (-9.81 e + e + 2))gydF4y2Ba
第八步:求解闭合能量轮廓的运动方程gydF4y2Ba
用求解封闭能量轮廓的ODEgydF4y2Ba数值gydF4y2Ba
.gydF4y2Ba
从能量等高线图上看,封闭等高线满足条件gydF4y2Ba
,gydF4y2Ba
.的初始条件gydF4y2Ba
而且gydF4y2Ba
在变量中gydF4y2Bax0gydF4y2Ba
.gydF4y2Ba
X0 = [0;1.99 * omega_0Value];gydF4y2Ba
指定0 ~ 10秒的时间间隔。这个间隔使钟摆可以走两个完整的周期。gydF4y2Ba
tInit = 0;tFinal = 10;gydF4y2Ba
求解ODE。gydF4y2Ba
sols = ode45(f,[tInit tFinal],x0)gydF4y2Ba
溶胶=gydF4y2Ba带字段的结构:gydF4y2Ba求解器:'ode45' extdata: [1x1 struct] x: [0 3.2241e-05 1.9344e-04 9.9946e-04 0.0050 0.0252 0.1259…[y: [2x45 double] stats: [1x1 struct] idata: [1x1 struct]gydF4y2Ba
: sols.y (1)gydF4y2Ba
表示角位移gydF4y2Ba
而且gydF4y2Ba: sols.y (2)gydF4y2Ba
表示角速度。gydF4y2Ba
.gydF4y2Ba
画出封闭路径解。gydF4y2Ba
图;yyaxisgydF4y2Ba左gydF4y2Ba;情节(溶胶。x,: sols.y (1),gydF4y2Ba“o”gydF4y2Ba);ylabel (gydF4y2Ba“\θ(rad)”gydF4y2Ba);yyaxisgydF4y2Ba正确的gydF4y2Ba;情节(溶胶。x,: sols.y (2),gydF4y2Ba“o”gydF4y2Ba);ylabel (gydF4y2Ba' \ theta_t (rad / s) 'gydF4y2Ba);网格gydF4y2Ba在gydF4y2Ba;标题(gydF4y2Ba“相空间中的闭合路径”gydF4y2Ba);包含(gydF4y2Ba“t (s)”gydF4y2Ba);gydF4y2Ba
想象一下钟摆的运动。gydF4y2Ba
X_pos = @(t) sin(deval(sols,t,1));Y_pos = @(t) -cos(deval(sols,t,1));图;fanimator (@ (t)情节(x_pos (t) y_pos (t)gydF4y2Ba“柯”gydF4y2Ba,gydF4y2Ba“MarkerFaceColor”gydF4y2Ba,gydF4y2Ba“k”gydF4y2Ba));持有gydF4y2Ba在gydF4y2Ba;fananimator (@(t) plot([0 x_pos(t)],[0 y_pos(t)],gydF4y2Ba“k -”gydF4y2Ba));fanimator (@ (t)文本(-0.3,1.5,gydF4y2Ba计时器:“gydF4y2Ba+ num2str (t, 2) +gydF4y2Ba“s”gydF4y2Ba));gydF4y2Ba
输入命令gydF4y2Ba那里gydF4y2Ba
播放钟摆运动的动画。gydF4y2Ba
步骤9:开放能量轮廓的解决方案gydF4y2Ba
用求解开放能轮廓的ODEgydF4y2Ba数值gydF4y2Ba
.从能量等高线图上看,开放等高线满足条件gydF4y2Ba
,gydF4y2Ba
.gydF4y2Ba
X0 = [0;2.01 * omega_0Value];sols = ode45(f, [tInit, tFinal], x0);gydF4y2Ba
画出开放能量等高线的解。gydF4y2Ba
图;yyaxisgydF4y2Ba左gydF4y2Ba;情节(溶胶。x,: sols.y (1),gydF4y2Ba“o”gydF4y2Ba);ylabel (gydF4y2Ba“\θ(rad)”gydF4y2Ba);yyaxisgydF4y2Ba正确的gydF4y2Ba;情节(溶胶。x,: sols.y (2),gydF4y2Ba“o”gydF4y2Ba);ylabel (gydF4y2Ba' \ theta_t (rad / s) 'gydF4y2Ba);网格gydF4y2Ba在gydF4y2Ba;标题(gydF4y2Ba“相空间中的开放路径”gydF4y2Ba);包含(gydF4y2Ba“t (s)”gydF4y2Ba);gydF4y2Ba
想象一下钟摆的运动。gydF4y2Ba
X_pos = @(t) sin(deval(sols,t,1));Y_pos = @(t) -cos(deval(sols,t,1));图;fanimator (@ (t)情节(x_pos (t) y_pos (t)gydF4y2Ba“柯”gydF4y2Ba,gydF4y2Ba“MarkerFaceColor”gydF4y2Ba,gydF4y2Ba“k”gydF4y2Ba));持有gydF4y2Ba在gydF4y2Ba;fananimator (@(t) plot([0 x_pos(t)],[0 y_pos(t)],gydF4y2Ba“k -”gydF4y2Ba));fanimator (@ (t)文本(-0.3,1.5,gydF4y2Ba计时器:“gydF4y2Ba+ num2str (t, 2) +gydF4y2Ba“s”gydF4y2Ba));gydF4y2Ba
输入命令gydF4y2Ba那里gydF4y2Ba
播放钟摆运动的动画。gydF4y2Ba