简介
在代码和讨论中注意:
单个d是一阶导数A双d是二阶导数
我使用Matlab通过数值求解控制LaGrange方程来模拟一些动态系统。基本上是一组二阶常微分方程。我正在使用ODE45。我在Mathworks(下面的教程链接)中找到了一个很棒的教程,介绍如何求解一组二阶常微分方程。
根据教程,我通过获得两个二阶常微分方程(一个用于角度θ,另一个用于弹簧伸长)来模拟弹性摆锤的运动,如下所示:
theta double prime equation:
M*thetadd*(L + del)^2 + M*g*sin(theta)*(L + del) + M*deld*thetad*(2*L + 2*del) = 0
del(弹簧伸长率)双素数方程式:
K*del + M*deldd - (M*thetad^2*(2*L + 2*del))/2 - M*g*cos(theta) = 0
上述两个等式都有ydd = f(x, xd, y, yd)
我通过共同约简方法解决了方程组;将列向量z
设置为[theta, thetad, del, deld]
,因此zd = [thetad, thetadd, deld, deldd]
。接下来我使用了两个matlab文件; ode45
的模拟文件和函数句柄文件。请参阅下面的模拟文件和函数句柄文件的代码:
模拟文件
%ElasticPdlmSymMainSim
clc
clear all;
%Define parameters
global M K L g;
M = 1;
K = 25.6;
L = 1;
g = 9.8;
% define initial values for theta, thetad, del, deld
theta_0 = 0;
thetad_0 = .5;
del_0 = 1;
deld_0 = 0;
initialValues = [theta_0, thetad_0, del_0, deld_0];
% Set a timespan
t_initial = 0;
t_final = 36;
dt = .01;
N = (t_final - t_initial)/dt;
timeSpan = linspace(t_final, t_initial, N);
% Run ode45 to get z (theta, thetad, del, deld)
[t, z] = ode45(@OdeFunHndlSpngPdlmSym, timeSpan, initialValues);
这是函数句柄文件:
function dz = OdeFunHndlSpngPdlmSym(~, z)
% Define Global Parameters
global M K L g
% Take output from SymDevFElSpringPdlm.m file for fy1 and fy2 and
% substitute into z2 and z4 respectively
% z1 and z3 are simply z2 and z4
% fy1=thetadd=z(2)= -(M*g*sin(z1)*(L + z3) + M*z2*z4*(2*L + 2*z3))/(M*(L + z3)^2)
% fy2=deldd=z(4)=((M*(2*L + 2*z3)*z2^2)/2 - K*z3 + M*g*cos(z1))/M
% return column vector [thetad; thetadd; deld; deldd]
dz = [z(2);
-(M*g*sin(z(1))*(L + z(3)) + M*z(2)*z(4)*(2*L + 2*z(3)))/(M*(L + z(3))^2);
z(4);
((M*(2*L + 2*z(3))*z(2)^2)/2 - K*z(3) + M*g*cos(z(1)))/M];
问题
然而,我遇到的是方程组,其中变量无法明确求解,就像弹簧摆的例子一样。对于一种情况,我有以下一组常微分方程:
y双素数方程
ydd - .5*L*(xdd*sin(x) + xd^2*cos(x) + (k/m)*y - g = 0
x双素数方程
.33*L^2*xdd - .5*L*ydd*sin(x) - .33*L^2*C*cos(x) + .5*g*L*sin(x) = 0
给出L,g,m,k和C参数。
请注意,x''项出现在y''方程中,y''项出现在x''方程中,因此我无法使用降阶方法。我是否可以使用Matlab ODE45以类似于第一个例子的方式解决第二个例子中的常微分方程组?
谢谢!
答案 0 :(得分:0)
这个问题可以通过手工编制一些数学来解决。方程在xdd
和ydd
中是线性的,因此它应该很容易解决。
ydd - .5*L*(xdd*sin(x) + xd^2*cos(x)) + (k/m)*y - g = 0
.33*L^2*xdd - .5*L*ydd*sin(x) - .33*L^2*C*cos(x) + .5*g*L*sin(x) = 0
可以改写为
-.5*L*sin(x)*xdd + ydd = -.5*L*xd^2*cos(x) - (k/m)*y + g
.33*L^2*xdd - .5*L*sin(x)*ydd = .33*L^2*C*cos(x) - .5*g*L*sin(x)
格式为A*x=b
。
对于更复杂的系统,您可以查看fsolve
函数。