用Matlab ODE45函数求解二阶ODE集

时间:2017-01-25 08:44:59

标签: matlab ode

简介

在代码和讨论中注意:

单个d是一阶导数A双d是二阶导数

我使用Matlab通过数值求解控制LaGrange方程来模拟一些动态系统。基本上是一组二阶常微分方程。我正在使用ODE45。我在Mathworks(下面的教程链接)中找到了一个很棒的教程,介绍如何求解一组二阶常微分方程。

https://www.mathworks.com/academia/student_center/tutorials/source/computational-math/solving-ordinary-diff-equations/player.html

根据教程,我通过获得两个二阶常微分方程(一个用于角度θ,另一个用于弹簧伸长)来模拟弹性摆锤的运动,如下所示:

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以类似于第一个例子的方式解决第二个例子中的常微分方程组?

谢谢!

1 个答案:

答案 0 :(得分:0)

这个问题可以通过手工编制一些数学来解决。方程在xddydd中是线性的,因此它应该很容易解决。

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函数。