Solve a nonlinear equation using ODE45 function in matlab for different values of initial conditions

509 views Asked by At

I have written a script to compute and solve a simple inverted pendalum system.Now suppose that I want to solve the nonlinear dynamic equation of the system with ODE45 function with different values of initial conditions.How could I use a for loop to solve for state vector of X for different values of initial conditions?I wrote a for loop to do that but I could not get the answer I wanted.Help me please.Here are my function and mfile as follows:

function xDot = of(x,g,L,u)

xDot = zeros(2,1);

xDot(1) = x(2);
xDot(2) = ((g./L)*sin(x(1)))+u;

end

And this is my main code:

    clc;
clear;close all;

    %% Solve The Nonlinear Equation

L = 1;
g = 9.81;

h = 0.25;
t = [0:h:5];
A = [0 1;(g/L) 0];
B =[0 1]';
Ics = [pi,0;pi/2 0;pi/5 0;0.001 0;pi 0.5;pi/2 0.5;pi/5 0.5;0.001 0.5];
[Poles,~] = eig(A);     %Poles Of Closed LOop System
R = 0.01;
Q = eye(2);
K = lqr(A,B,Q,R);

u = @(x)-K*(x);


for i=1:size(Ics,1)
    [~,X] = ode45(@(t,x)of(x,g,L,u(x)),t,Ics(i,:));

end

Also note that I want the first column of X vector which is the angular displacements of the pendulum in each iteration because the second column of X vector in ODE45 is always the Derivative of the main state vector.

1

There are 1 answers

1
rinkert On

You can store all the integration outputs for the different initial conditions in a 3D array.

The number of rows of Xout will equal the number of time steps at which you want to evaluate your solution, so numel(t). The number of columns is the number of states, and then the third dimension will be the number of initial conditions you want to test.

Xout = zeros(numel(t), size(Ics, 2), size(Ics, 1)); % initialize the 3D array 
for k = 1:size(Ics, 1)
    [~, Xout(:, :, k)] = ode45(@(t, x)of(x, g, L, u(x)), t, Ics(k, :));
end