0

我写了一个脚本来计算和求解一个简单的倒立摆系统。现在假设我想用不同初始条件值的 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 向量的第一列,它是每次迭代中摆的角位移,因为 ODE45 中 X 向量的第二列始终是主状态向量的导数。

4

1 回答 1

1

您可以将不同初始条件的所有积分输出存储在 3D 数组中。

的行数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
于 2020-12-04T12:06:28.177 回答