Solving System of Second Order Ordinary Differential Equation in Matlab

筅森魡賤 提交于 2019-12-23 04:03:10

问题


Introduction

I am using Matlab to simulate some dynamic systems through numerically solving systems of Second Order Ordinary Differential Equations using ODE45. I found a great tutorial from Mathworks (link for tutorial at end) on how to do this.

In the tutorial the system of equations is explicit in x and y as shown below:

x''=-D(y) * x' * sqrt(x'^2 + y'^2)
y''=-D(y) * y' * sqrt(x'^2 + y'^2) + g(y)

Both equations above have form y'' = f(x, x', y, y')


Question

However, I am coming across systems of equations where the variables can not be solved for explicitly as shown in the example. For example one of the systems has the following set of 3 second order ordinary differential equations:

y double prime equation

y'' - .5*L*(x''*sin(x) + x'^2*cos(x) + (k/m)*y - g = 0

x double prime equation

.33*L^2*x'' - .5*L*y''sin(x) - .33*L^2*C*cos(x) + .5*g*L*sin(x) = 0

A single prime is first derivative A double prime is second derivative L, g, m, k, and C are given parameters.

How can Matlab be used to numerically solve a set of second order ordinary differential equations where second order can not be explicitly solved for?

Thanks!


回答1:


Your second system has the form

a11*x'' + a12*y'' = f1(x,y,x',y')
a21*x'' + a22*y'' = f2(x,y,x',y')

which you can solve as a linear system

[x'', y''] = A\f

or in this case explicitly using Cramer's rule

x'' = ( a22*f1 - a12*f2 ) / (a11*a22 - a12*a21)

y'' accordingly.

I would strongly recommend leaving the intermediate variables in the code to reduce chances for typing errors and avoid multiple computation of the same expressions.

Code could look like this (untested)

function dz = odefunc(t,z)
    x=z(1); dx=z(2); y=z(3); dy=z(4);
    A = [  [-.5*L*sin(x),  1] ;  [.33*L^2,  -0.5*L*sin(x)]  ]
    b = [ [dx^2*cos(x) + (k/m)*y-g]; [-.33*L^2*C*cos(x) + .5*g*L*sin(x)] ]

    d2 = A\b

    dz = [ dx, d2(1), dy, d2(2) ]
end



回答2:


Yes your method is correct! I post the following code below:

%Rotating Pendulum Sym Main
clc
clear all;

%Define parameters

global M K L g C;
M = 1;
K = 25.6;
L = 1;
C = 1;
g = 9.8;


% define initial values for theta, thetad, del, deld
e_0 = 1;
ed_0 = 0;
theta_0 = 0;
thetad_0 = .5;
initialValues = [e_0, ed_0, theta_0, thetad_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(@RotSpngHndl, timeSpan, initialValues);

%initialize variables
e = zeros(N,1);
ed = zeros(N,1);
theta = zeros(N,1);
thetad = zeros(N,1);
T = zeros(N,1);
V = zeros(N,1);
x = zeros(N,1);
y = zeros(N,1);

for i = 1:N
    e(i) = z(i, 1);
    ed(i) = z(i, 2);
    theta(i) = z(i, 3);
    thetad(i) = z(i, 4);
    T(i) = .5*M*(ed(i)^2 + (1/3)*L^2*C*sin(theta(i)) + (1/3)*L^2*thetad(i)^2 - L*ed(i)*thetad(i)*sin(theta(i)));
    V(i) = -M*g*(e(i) + .5*L*cos(theta(i)));
    E(i) = T(i) + V(i);
end

figure(1)
plot(t, T,'r');
hold on;
plot(t, V,'b');
plot(t,E,'y');
title('Energy');
xlabel('time(sec)');
legend('Kinetic Energy', 'Potential Energy', 'Total Energy');

Here is function handle file for ode45:

function dz = RotSpngHndl(~, z)
% Define Global Parameters
global M K L g C

A = [1, -.5*L*sin(z(3));
    -.5*L*sin(z(3)), (1/3)*L^2];

b = [.5*L*z(4)^2*cos(z(3)) - (K/M)*z(1) + g;
    (1/3)*L^2*C*cos(z(3)) + .5*g*L*sin(z(3))];

X = A\b;

% return column vector [ed; edd; ed; edd]
dz = [z(2);
    X(1);
    z(4);
    X(2)];


来源:https://stackoverflow.com/questions/41825370/solving-system-of-second-order-ordinary-differential-equation-in-matlab

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!