function u_k= fcn(A,B,Q,R,F,x_k)
n=size(A,1); % A 是 n x n 矩阵, 得到 n=15
p=size(B,2); % B 是 n x p 矩阵, 得到 p=4
dt = 0.001;
I=eye(n);
A1 = I+A*dt; %离散化
B1 = dt*B;
N = 10; %预测区间
[E,H]=MPC_Matrices(A1,B1,Q,R,F,N,n,p); %求得E H矩阵
% 计算
u_k = Prediction(x_k,E,H,N,p); %求得此步得uk
function [E,H]=MPC_Matrices(A,B,Q,R,F,N,n,p) %算出E和H矩阵
C=zeros((N+1)*n,N*p); % 初始化 C 矩阵, 这一步令它有 (N+1)n x NP 个 0
%M1 = eye(n);
M1 = zeros((N + 1) * n, n);
M1(1:n, :) = eye(n);
temp =eye(n);
for i =1:N
rows = i*n+(1:n);
C(rows,:)=[temp*B,C(rows-n,1:end-p)]; %temp=A^(i-1)*B, tempt*B并上上一行去除最后一个元素到第n行
temp =A*temp;
M1((i + 1) * n + 1 - n:(i + 1) * n, :) = temp;
end
M = M1;
% 定义Q_ba和R_ba
Q_ba = kron(eye(N),Q);
Q_ba = blkdiag(Q_ba,F);
R_ba = kron(eye(N),R);
% 计算G, E, H
G=M'*Q_ba*M; % G: n x n
E=M'*Q_ba*C; % E: n x NP
H=C'*Q_ba*C+R_ba; % NP x NP
end
function u_k= Prediction(x_k,E,H,N,p) %二次规划求得最优的u_k
opts = optimoptions('quadprog','Algorithm','active-set','Display','iter');
x0 = zeros(N*p,1);
max = 5000;
ub = kron(ones(N*p,1),max);
lb = kron(ones(N*p,1),-max);
U_k = quadprog(H,E'*x_k,[],[],[],[],lb,ub,x0,opts);
u_k = U_k(1:p,1); % 取第一个结果
end
end
运行仿真时出错,仿真终止
原因:
- Index exceeds array dimensions. Index value 82 exceeds valid range [1-81]. Error in quadprog.p
- 'Active_sim_Baseline2/MPC controller/MPC controller' (line 43) 中出现错误
- 'Active_sim_Baseline2/MPC controller/MPC controller' (line 11) 中出现错误
组件:Simulink | 类别:Block 错误
会出现这样的错误,请问有没有大佬会的,我看维度好像是没有问题