此示例显示如何使用符号数学工具箱™模拟简单摆的运动。导出摆锤的运动方程,然后在数值上分析地求解方程,以便以任何角度进行数字。GydF4y2Ba
摆是一个遵循微分方程的简单机械系统。钟摆最初是在垂直位置静止的。当钟摆移动一个角度时GydF4y2Ba 释放后,重力将它拉回静止位置。它的动量使它超冲并形成一个角度GydF4y2Ba (如果没有摩擦力)等等。由于重力,沿摆运动的恢复力为GydF4y2Ba .因此,根据牛顿第二定律,质量乘以加速度一定等于GydF4y2Ba .GydF4y2Ba
Syms.GydF4y2BamGydF4y2Ba一种GydF4y2BaGGydF4y2Baθ(t)GydF4y2BaEqn = m * a == -m * g * sin(θ)GydF4y2Ba
EQN(T)=GydF4y2Ba
对于一个有长度的摆GydF4y2Ba ,摆动轴的加速度等于角度加速时间GydF4y2Ba .GydF4y2Ba
.GydF4y2Ba
代替GydF4y2Ba
通过使用GydF4y2BasubsGydF4y2Ba
.GydF4y2Ba
Syms.GydF4y2BaR.GydF4y2Baeqn = subs(eqn,a,r * diff(theta,2))GydF4y2Ba
EQN(T)=GydF4y2Ba
隔离角度加速度GydF4y2BaeqnGydF4y2Ba
通过使用GydF4y2Ba隔离GydF4y2Ba
.GydF4y2Ba
EQN =孤立(EQN,Diff(Theta,2))GydF4y2Ba
eqn =GydF4y2Ba
收集常数GydF4y2Ba 和GydF4y2Ba 进入一个参数,这也被称为GydF4y2Ba固有频率GydF4y2Ba.GydF4y2Ba
.GydF4y2Ba
Syms.GydF4y2Baomega_0GydF4y2Baeqn =潜艇(eqn, g / r, omega_0 ^ 2)GydF4y2Ba
eqn =GydF4y2Ba
运动方程是非线性的,因此难以分析解决。假设角度小并且通过使用泰勒膨胀来线性化方程式GydF4y2Ba .GydF4y2Ba
Syms.GydF4y2BaXGydF4y2Ba约=泰勒(sin (x), x,GydF4y2Ba“秩序”GydF4y2Ba2);约=潜艇(大约x,θ(t))GydF4y2Ba
约=GydF4y2Ba
运动方程变为线性方程。GydF4y2Ba
EQNLINEAR =潜艇(EQN,SIN(THETA(T)),约)GydF4y2Ba
eqnLinear =GydF4y2Ba
解决方程GydF4y2Baeqnlinear.GydF4y2Ba
通过使用GydF4y2BadsolveGydF4y2Ba
.将初始条件指定为第二个参数。假设简化了解决方案GydF4y2Ba
是真实的使用GydF4y2Ba认为GydF4y2Ba
.GydF4y2Ba
Syms.GydF4y2Batheta_0GydF4y2Batheta_t0GydF4y2Batheta_t = diff(θ);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.cos和sin函数每次都重复GydF4y2Ba .需要时间来改变GydF4y2Ba 经过GydF4y2Ba 叫做时间段。GydF4y2Ba
.GydF4y2Ba
的时间段GydF4y2Ba 与钟摆长度的平方根成正比它与质量无关。对于线性运动方程,时间周期不依赖于初始条件。GydF4y2Ba
用小角度近似画出钟摆的运动曲线。GydF4y2Ba
定义物理参数:GydF4y2Ba
引力加速度GydF4y2Ba
摆的长度GydF4y2Ba
gValue = 9.81;右值= 1;omega_0Value =√gValue /右值);T = 2 *π/ omega_0Value;GydF4y2Ba
设置初始条件。GydF4y2Ba
theta_0Value = 0.1 *π;GydF4y2Ba%解决方案仅对小角度有效。GydF4y2Batheta_t0value = 0;GydF4y2Ba最初休息的%。GydF4y2Ba
将物理参数和初始条件替换为一般解决方案。GydF4y2Ba
vars = [omega_0 theta_0 theta_t0];值= [omega_0value theta_0value theta_t0value];thetasolplot = subs(θ,var,值);GydF4y2Ba
绘制谐波摆动运动。GydF4y2Ba
fplot(Thetasolplot(t * t)/ pi,[0 5]);网格GydF4y2Ba在GydF4y2Ba;标题(GydF4y2Ba'谐波摆动运动'GydF4y2Ba);Xlabel(GydF4y2Ba't / t'GydF4y2Ba);ylabel(GydF4y2Ba'\ theta / \ pi'GydF4y2Ba);GydF4y2Ba
求出解后GydF4y2Ba ,可视化摆动的运动。GydF4y2Ba
x_pos =罪(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;Fanimator(@(t)绘图([0 x_pos(t)],[0y_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
.使用以下方法可视化这些路径GydF4y2BafcontourGydF4y2Ba
.GydF4y2Ba
Syms.GydF4y2Baθ.GydF4y2Batheta_t.GydF4y2Baomega_0GydF4y2BaE(θ,theta_t omega_0) = (1/2) * (theta_t ^ 2 + (2 * omega_0 * sin(θ/ 2))^ 2);Eplot(theta, theta_t) = sub (E,omega_0,omega_0Value);图;= fcontour(Eplot(pi*theta, 2*omega_0Value*theta_t), 2*[-1 1 -1],GydF4y2Ba......GydF4y2Ba“线宽”GydF4y2Ba2,GydF4y2Ba“LevelList”GydF4y2Ba0:5:50,GydF4y2Ba“MeshDensity”GydF4y2Ba1 + 2 ^ 8);网格GydF4y2Ba在GydF4y2Ba;标题(GydF4y2Ba相空间中的能量等高线(\theta vs. \theta_t)GydF4y2Ba);Xlabel(GydF4y2Ba'\ theta / \ pi'GydF4y2Ba);ylabel(GydF4y2Ba“\ theta_t / 2 \ omega_0”GydF4y2Ba);GydF4y2Ba
能量等高线是对称的GydF4y2Ba 轴和GydF4y2Ba 轴,并且是周期性的GydF4y2Ba 轴。图中显示了两个截然不同的行为区域。GydF4y2Ba
等高线图上较低的能量靠近它们自己。钟摆在两个最大角度和速度之间来回摆动。摆的动能不足以克服引力能,使摆作一个完整的回路。GydF4y2Ba
轮廓图的较高能量不靠近自己。摆锤总是在一个角度方向上移动。摆锤的动能足以克服重力能量并使摆锤能够制造全环。GydF4y2Ba
运动的非线性方程是二阶微分方程。用使用的数字地解决这些方程GydF4y2Ba数值GydF4y2Ba
解算器。因为GydF4y2Ba数值GydF4y2Ba
只接受一阶系统,将系统简化为一阶系统。然后,生成作为输入的函数句柄GydF4y2Ba数值GydF4y2Ba
.GydF4y2Ba
把二阶ODE写成一阶ODE的方程组。GydF4y2Ba
Syms.GydF4y2Baθ(t)GydF4y2Batheta_t(t)GydF4y2Baomega_0GydF4y2Baeqs = [diff(theta)== theta_t;差异(theta_t)== -omega_0 ^ 2 * sin(θ)]GydF4y2Ba
eqs(t)=GydF4y2Ba
eqs = subs(eqs,omega_0,omega_0value);vars =θ,theta_t];GydF4y2Ba
找到质量矩阵GydF4y2BamGydF4y2Ba
方程组和方程的右边GydF4y2BaFGydF4y2Ba
.GydF4y2Ba
[M F] = massMatrixForm(方程式一样,var)GydF4y2Ba
M =GydF4y2Ba
f =GydF4y2Ba
mGydF4y2Ba
和GydF4y2BaFGydF4y2Ba
请参阅此表格。GydF4y2Ba
为了简化进一步的计算,以这种形式重写系统GydF4y2Ba .GydF4y2Ba
f = m \ fGydF4y2Ba
f =GydF4y2Ba
转变GydF4y2BaFGydF4y2Ba
来一个MATLAB函数的处理用GydF4y2Ba助手GydF4y2Ba
.生成的函数句柄是MATLAB ode求解器的输入GydF4y2Ba数值GydF4y2Ba
.GydF4y2Ba
f = odeFunction(f, var)GydF4y2Ba
f =GydF4y2Bafunction_handle具有值:GydF4y2Ba@ (t, in2) [in2(2:);罪(in2(1:))。* 2./1.0 (-9.81 e + e + 2))GydF4y2Ba
通过使用来解决闭合能量轮廓的odeGydF4y2Ba数值GydF4y2Ba
.GydF4y2Ba
从能量轮廓图,封闭轮廓满足条件GydF4y2Ba
那GydF4y2Ba
.存储初始条件GydF4y2Ba
和GydF4y2Ba
在变量GydF4y2BaX0.GydF4y2Ba
.GydF4y2Ba
x0 = [0;1.99 * omega_0Value];GydF4y2Ba
指定一个0 ~ 10秒的时间间隔,用于查找解决方案。这个间隔允许钟摆经过两个完整的周期。GydF4y2Ba
tinit = 0;tfinal = 10;GydF4y2Ba
解决ODE。GydF4y2Ba
溶胶= ode45(f,[tinit tfinal],x0)GydF4y2Ba
Sols =.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] data: [1x1 struct]GydF4y2Ba
sols.y(1,:)GydF4y2Ba
为角位移GydF4y2Ba
和GydF4y2Basols.y(2,:)GydF4y2Ba
表示角速度GydF4y2Ba
.GydF4y2Ba
绘制闭路径解。GydF4y2Ba
图;yyaxis.GydF4y2Ba剩下GydF4y2Ba;绘图(Sols.x,Sols.y(1,:),GydF4y2Ba'-O'GydF4y2Ba);ylabel(GydF4y2Ba“\θ(rad)”GydF4y2Ba);yyaxis.GydF4y2Ba对GydF4y2Ba;plot(sols.x,sols.y(2,:),GydF4y2Ba'-O'GydF4y2Ba);ylabel(GydF4y2Ba'\ theta_t(rad / s)'GydF4y2Ba);网格GydF4y2Ba在GydF4y2Ba;标题(GydF4y2Ba“相空间中的闭合路径”GydF4y2Ba);Xlabel(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;Fanimator(@(t)绘图([0 x_pos(t)],[0y_pos(t)],GydF4y2Ba“k -”GydF4y2Ba));Fanimator(@(t)文本(-0.3,1.5,GydF4y2Ba计时器:“GydF4y2Ba+ num2str (t, 2) +GydF4y2Ba“S”GydF4y2Ba));GydF4y2Ba
输入的命令GydF4y2Ba那里GydF4y2Ba
播放摆动行动的动画。GydF4y2Ba
用,求解开能轮廓的ODEGydF4y2Ba数值GydF4y2Ba
.从能量轮廓图中,开放式轮廓满足条件GydF4y2Ba
那GydF4y2Ba
.GydF4y2Ba
x0 = [0;2.01 * omega_0Value];sols = ode45(f, [tInit, tFinal], x0);GydF4y2Ba
绘制开放能量等高线的解。GydF4y2Ba
图;yyaxis.GydF4y2Ba剩下GydF4y2Ba;绘图(Sols.x,Sols.y(1,:),GydF4y2Ba'-O'GydF4y2Ba);ylabel(GydF4y2Ba“\θ(rad)”GydF4y2Ba);yyaxis.GydF4y2Ba对GydF4y2Ba;plot(sols.x,sols.y(2,:),GydF4y2Ba'-O'GydF4y2Ba);ylabel(GydF4y2Ba'\ theta_t(rad / s)'GydF4y2Ba);网格GydF4y2Ba在GydF4y2Ba;标题(GydF4y2Ba“阶段空间中的开放路径”GydF4y2Ba);Xlabel(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;Fanimator(@(t)绘图([0 x_pos(t)],[0y_pos(t)],GydF4y2Ba“k -”GydF4y2Ba));Fanimator(@(t)文本(-0.3,1.5,GydF4y2Ba计时器:“GydF4y2Ba+ num2str (t, 2) +GydF4y2Ba“S”GydF4y2Ba));GydF4y2Ba
输入的命令GydF4y2Ba那里GydF4y2Ba
播放摆动行动的动画。GydF4y2Ba