matlab微分方程数值求解(MATLAB推导钟摆的运动方程)

钟摆模型主要物理参量如下图所示:

matlab微分方程数值求解(MATLAB推导钟摆的运动方程)(1)

钟摆模型

matlab微分方程数值求解(MATLAB推导钟摆的运动方程)(2)

钟摆物理方程

syms m a g theta(t)

eqn = m*a == -m*g*sin(theta)

对于有长度的摆锤,摆锤的加速度:

matlab微分方程数值求解(MATLAB推导钟摆的运动方程)(3)

syms r

eqn = subs(eqn,a,r*diff(theta,2))

使用隔离,隔离方程eqn中的角加速度。得到:

matlab微分方程数值求解(MATLAB推导钟摆的运动方程)(4)

eqn = isolate(eqn,diff(theta,2))

将常数和频率收集到一个参数中,该参数也称为固有频率:

matlab微分方程数值求解(MATLAB推导钟摆的运动方程)(5)

syms omega_0

eqn = subs(eqn,g/r,omega_0^2)

matlab微分方程数值求解(MATLAB推导钟摆的运动方程)(6)

运动方程是非线性的,所以很难解析求解。假设角度很小,用泰勒展开式将方程线性化:

syms x

approx = taylor(sin(x),x,'Order',2);

approx = subs(approx,x,theta(t))

eqnLinear = subs(eqn,sin(theta(t)),approx)

matlab微分方程数值求解(MATLAB推导钟摆的运动方程)(7)

用dsolve解方程组。将初始条件指定为第二个参数。通过使用假设来简化解决方案:

syms theta_0 theta_t0

theta_t = diff(theta);

cond = [theta(0) == theta_0, theta_t(0) == theta_t0];

assume(omega_0,'real')

thetaSol(t) = dsolve(eqnLinear,cond)

matlab微分方程数值求解(MATLAB推导钟摆的运动方程)(8)

钟摆周期:

matlab微分方程数值求解(MATLAB推导钟摆的运动方程)(9)

gValue = 9.81;

rValue = 1;

omega_0Value = sqrt(gValue/rValue);

T = 2*pi/omega_0Value;

theta_0Value = 0.1*pi; % Solution only valid for small angles.

theta_t0Value = 0; % Initially at rest.

vars = [omega_0 theta_0 theta_t0];

values = [omega_0Value theta_0Value theta_t0Value];

thetaSolPlot = subs(thetaSol,vars,values);

matlab微分方程数值求解(MATLAB推导钟摆的运动方程)(10)

画出钟摆运动:

fplot(thetaSolPlot(t*T)/pi, [0 5]);

grid on;

title('Harmonic Pendulum Motion');

xlabel('t/T');

ylabel('\theta/\pi');

钟摆动画:

x_pos = sin(thetaSolPlot);

y_pos = -cos(thetaSolPlot);

fanimator(@fplot,x_pos,y_pos,'ko','MarkerFaceColor','k','AnimationRange',[0 5*T]);

hold on;

fanimator(@(t) plot([0 x_pos(t)],[0 y_pos(t)],'k-'),'AnimationRange',[0 5*T]);

fanimator(@(t) text(-0.3,0.3,"Timer: " num2str(t,2) " s"),'AnimationRange',[0 5*T]);

matlab微分方程数值求解(MATLAB推导钟摆的运动方程)(11)

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页