Simulink运行仿真出现无穷值
操作环境Win10家庭版、软件版本MatlabR2020b
[参考补偿扩张状态观测器(SCESO)文献]
LIU Chenguang, NEGENBORN R R, ZHENG Huarong,et al. A state-compensation extended state observer for model predictive control[J]. European Journal of Control,2017,36:1-9.
function u = fcn(xo,xf)
%预测模型建立
%获取当前状态
x1 = xf(1);
x2 = xf(2);
x = [x1;x2];%当前状态X0
d = xf(3);%扩张状态,不可测扰动
fd = exp(x1)+d;%集总扰动,系统非线性部分+外部不可测扰动
% 设置参数
Tp = 0.05;%时间步长
Np = 20;%预测时域
Nc = 20;%控制时域
% 设置权重
qx = [100 0.01];%系统输出权重
qu = [0.1];%系统控制权重
% 线性化离散化
%线性化
A = [0 1;-2 -1];
B = [0;1];
C = [1 0];
D = [1;0];
[a_s,~] = size(A);%a_s系统进行迭代状态量X维度
[~,b_s] = size(B);%b_s系统控制量U维度
[~,d_s] = size(D);%d_s系统扰动维度
% 生成权矩阵
Q = kron(eye(Np),diag(qx));
R = kron(eye(Nc),diag(qu));
%离散化
Ac = Tp*A+eye(a_s);
Bc = Tp*B;
Dc = Tp*D;
%构建迭代矩阵
%构建Psi
Psi = zeros(a_s*Np,a_s); %Psi
for i=1:1:Np
Psi(1+(i-1)*a_s:i*a_s,1:a_s)=Ac^i;
end
%构建Theta
Theta = zeros(a_s*Np,b_s*Nc); %Theta
for i=1:1:Np
for j=1:1:min(i,Nc)
Theta(1+(i-1)*a_s:i*a_s,1+(j-1)*b_s:j*b_s)=Ac^(i-j)*Bc;
end
end
%构建Fai
Fai = zeros(a_s*Np,d_s); %Theta
for i=1:1:Np
Fai(1+(i-1)*a_s:i*a_s,1:d_s)=Ac^(i-1)*Dc;
end
%构建优化函数
E = Psi*x-kron(ones(Np,1),xo);
Fd = Fai*fd;
H_k = 2*(Theta'*Q*Theta+R);
G_k = 2*Theta'*Q*(E+Fd);
%约束条件 quadprog(H,f,A,b,Aeq,beq,lb,ub)
%非线性不等式约束 A*x <= b
%在满足 lb ≤ x ≤ ub 的限制条件下求解上述问题。输入 lb 和 ub 是由双精度值组成的向量,这些限制适用于每个 x 分量。如果不存在等式,请设置 Aeq = [] 和 beq = []。
coder.extrinsic('quadprog');
Tk=quadprog(H_k,G_k,[],[],[],[],-30,30);
u = 0.0;
u = Tk(1);
希望能指出模型中对SCESO与MPC控制理解有误的地方,实现示例仿真结果
[文中参考文献链接]
(https://doi.org/10.1016/j.ejcon.2017.05.002)
这里有一个相同问题: 请查看是否对问题有帮助~
https://ask.csdn.net/questions/7601760