Решите нелинейное уравнение с помощью функции ODE45 в matlab для разных значений начальных условий

Я написал сценарий для вычисления и решения простой перевернутой маятниковой системы. Теперь предположим, что я хочу решить нелинейное динамическое уравнение системы с помощью функции ODE45 с разными значениями начальных условий. Как я могу использовать цикл for для определения состояния вектор X для разных значений начальных условий? Я написал для этого цикл for, но не смог получить нужный мне ответ. Помогите мне, пожалуйста. Вот моя функция и mfile:

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

xDot = zeros(2,1);

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

end

И это мой основной код:

    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

Также обратите внимание, что мне нужен первый столбец вектора X, который представляет собой угловые смещения маятника на каждой итерации, потому что второй столбец вектора X в ODE45 всегда является производной основного вектора состояния.

1 ответ

Вы можете сохранить все результаты интеграции для различных начальных условий в трехмерном массиве.

Количество рядов Xout будет равно количеству временных шагов, на которых вы хотите оценить свое решение, поэтому numel(t). Количество столбцов - это количество состояний, а третье измерение - это количество начальных условий, которые вы хотите проверить.

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
Другие вопросы по тегам