Решите нелинейное уравнение с помощью функции 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