📄 gpc_step.cpp
字号:
// F(j,m)=a1-a2*a3;
//
mclMline(72);
F(mwVv(j, "j"), mwVv(m, "m"))
= mwVv(a1, "a1") - mwVv(a2, "a2") * mwVv(a3, "a3");
//
// end
//
mclMline(73);
}
//
// F(j,na+1)=A(na+1)*E(j,j);
//
mclMline(74);
F(mwVv(j, "j"), mwVv(na, "na") + 1)
= mwVv(A, "A")(mwVv(na, "na") + 1)
* mwVv(E, "E")(mwVv(j, "j"), mwVv(j, "j"));
//
// else %%表示F的第一列存在0的情况,使用改进的算法
//
mclMline(75);
} else {
mwForLoopIterator viter__3;
//
// for m=i:na
//
mclMline(76);
for (viter__3.Start(mwVv(i, "i"), mwVv(na, "na"), mwArray::DIN);
viter__3.Next(&m);
) {
//
// % F(j,m)=F(j-1,m+1)-(A(m+2-i)-A(m+1-i))*E(j,j);
// a1=F(j-1,m+1);
//
mclMline(78);
a1 = mwVv(F, "F")(mwVv(j, "j") - 1, mwVv(m, "m") + 1);
//
// a2=A(m+2-i)-A(m+1-i);
//
mclMline(79);
a2
= mwVv(A, "A")(mwVv(m, "m") + 2 - mwVv(i, "i"))
- mwVv(A, "A")(mwVv(m, "m") + 1 - mwVv(i, "i"));
//
// a3=E(j,j);
//
mclMline(80);
a3 = mwVv(E, "E")(mwVv(j, "j"), mwVv(j, "j"));
//
// F(j,m)=a1-a2*a3;
//
mclMline(81);
F(mwVv(j, "j"), mwVv(m, "m"))
= mwVv(a1, "a1") - mwVv(a2, "a2") * mwVv(a3, "a3");
//
// end
//
mclMline(82);
}
//
// F(j,1+na)=A(na+1)*E(j,j);
//
mclMline(83);
F(mwVv(j, "j"), 1 + mwVv(na, "na"))
= mwVv(A, "A")(mwVv(na, "na") + 1)
* mwVv(E, "E")(mwVv(j, "j"), mwVv(j, "j"));
//
// end
//
mclMline(84);
}
//
// end
//
mclMline(85);
}
}
//
// Gj=zeros(1,P);
//
mclMline(86);
Gj = zeros(mwVarargin(1, mwVa(P, "P")));
//
// G=zeros(P,M);
//
mclMline(87);
G = zeros(mwVarargin(mwVa(P, "P"), mwVa(M, "M")));
//
// H=zeros(P,nb);
//
mclMline(88);
H = zeros(mwVarargin(mwVa(P, "P"), mwVv(nb, "nb")));
//
// for j=1:P
//
mclMline(89);
{
mwForLoopIterator viter__;
for (viter__.Start(1, mwVa(P, "P"), mwArray::DIN); viter__.Next(&j); ) {
//
// clear temp;
//
mclMline(90);
clear(&temp, NULL);
//
// temp=[];
//
mclMline(91);
temp = empty();
//
// temp=conv(E(j,1:j),B);
//
mclMline(92);
temp
= conv(
mwVv(E, "E")(mwVv(j, "j"), colon(1, mwVv(j, "j"))),
mwVv(B, "B"));
//
// Gj(j)=temp(j);
//
mclMline(93);
Gj(mwVv(j, "j")) = mwVv(temp, "temp")(mwVv(j, "j"));
//
// H(j,:)=temp(end-nb+1:end);
//
mclMline(94);
H(mwVv(j, "j"), colon())
= mwVv(temp, "temp")(
colon(
end(mwVv(temp, "temp"), 1, 1) - mwVv(nb, "nb") + 1,
end(mwVv(temp, "temp"), 1, 1)));
//
// end
//
mclMline(95);
}
}
//
// for j=1:M
//
mclMline(96);
{
mwForLoopIterator viter__;
for (viter__.Start(1, mwVa(M, "M"), mwArray::DIN); viter__.Next(&j); ) {
//
// t=1;
//
mclMline(97);
t = 1;
//
// for i=j:P
//
mclMline(98);
{
mwForLoopIterator viter__4;
for (viter__4.Start(mwVv(j, "j"), mwVa(P, "P"), mwArray::DIN);
viter__4.Next(&i);
) {
//
// G(i,j)=Gj(t);
//
mclMline(99);
G(mwVv(i, "i"), mwVv(j, "j"))
= mwVv(Gj, "Gj")(mwVv(t, "t"));
//
// t=t+1;
//
mclMline(100);
t = mwVv(t, "t") + 1;
//
// end
//
mclMline(101);
}
}
//
// end %赋值矩阵G
//
mclMline(102);
}
}
//
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// YY=zeros(TT,1); %初始时刻之前输出为0
//
mclMline(104);
YY = zeros(mwVarargin(mwVa(TT, "TT"), 1));
//
// UU=zeros(TT,1); %初始时刻之前输入为0
//
mclMline(105);
UU = zeros(mwVarargin(mwVa(TT, "TT"), 1));
//
// DUU=zeros(TT,1); %初始时刻之前Δu为0
//
mclMline(106);
DUU = zeros(mwVarargin(mwVa(TT, "TT"), 1));
//
// Y=0;
//
mclMline(107);
Y = 0;
//
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// for t=1:TT
//
mclMline(109);
{
mwForLoopIterator viter__;
for (viter__.Start(1, mwVa(TT, "TT"), mwArray::DIN);
viter__.Next(&t);
) {
//
// %%%%%%%%%%%%%%%%%%%%%%%%%%%
// YD=zeros(P,1);
//
mclMline(111);
YD = zeros(mwVarargin(mwVa(P, "P"), 1));
//
// for i=1:P
//
mclMline(112);
{
mwForLoopIterator viter__5;
for (viter__5.Start(1, mwVa(P, "P"), mwArray::DIN);
viter__5.Next(&i);
) {
//
// YD(i)=a^i*Y+(1-a^i)*c;
//
mclMline(113);
YD(mwVv(i, "i"))
= (mwVa(a, "a") ^ mwVv(i, "i")) * mwVv(Y, "Y")
+ (1 - (mwVa(a, "a") ^ mwVv(i, "i"))) * mwVa(c, "c");
//
// end %计算期望值
//
mclMline(114);
}
}
//
// ZZZ(t)=YD(1); %ZZZ向量记录期望值
//
mclMline(115);
(*ZZZ)(mwVv(t, "t")) = mwVv(YD, "YD")(1);
//
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// temp=(G'*Q*G+R)\G'*Q;
//
mclMline(117);
temp
= mldivide(
_times_transpose(mwVv(G, "G"), mwVv(Q, "Q"), _mxarray2_)
* mwVv(G, "G")
+ mwVv(R, "R"),
ctranspose(mwVv(G, "G")))
* mwVv(Q, "Q");
//
// du=temp(1,:)*(YD-F*YY(1:na+1)-H*DUU(1:nb));
//
mclMline(118);
du
= mwVv(temp, "temp")(1, colon())
* (mwVv(YD, "YD")
- mwVv(F, "F")
* mwVv(YY, "YY")(colon(1, mwVv(na, "na") + 1))
- mwVv(H, "H")
* mwVv(DUU, "DUU")(colon(1, mwVv(nb, "nb"))));
//
// %du取DeltaU的第一项 %计算Δu
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// if nb>=1
//
mclMline(121);
if (tobool(mwVv(nb, "nb") >= 1)) {
//
// DUU(2:end)=DUU(1:end-1);
//
mclMline(122);
DUU(colon(2, end(mwVv(DUU, "DUU"), 1, 1)))
= mwVv(DUU, "DUU")(colon(1, end(mwVv(DUU, "DUU"), 1, 1) - 1));
//
// UU(2:end)=UU(1:end-1);
//
mclMline(123);
UU(colon(2, end(mwVv(UU, "UU"), 1, 1)))
= mwVv(UU, "UU")(colon(1, end(mwVv(UU, "UU"), 1, 1) - 1));
//
// end %将DUU的第i项移到i+1项
//
mclMline(124);
}
//
// DUU(1)=du;
//
mclMline(125);
DUU(1) = mwVv(du, "du");
//
// UU(1)=UU(2)+du; %UU向量记录当前输入
//
mclMline(126);
UU(1) = mwVv(UU, "UU")(2) + mwVv(du, "du");
//
// UUU(t)=UU(1);
//
mclMline(127);
(*UUU)(mwVv(t, "t")) = mwVv(UU, "UU")(1);
//
// Y=RB*UU(1:nu+1)-RA(2:ny+1)*YY(1:ny); %计算实际对象输出 Y
//
mclMline(128);
Y
= mwVv(RB, "RB") * mwVv(UU, "UU")(colon(1, mwVv(nu, "nu") + 1))
- mwVv(RA, "RA")(colon(2, mwVv(ny, "ny") + 1))
* mwVv(YY, "YY")(colon(1, mwVv(ny, "ny")));
//
// if na>=1
//
mclMline(129);
if (tobool(mwVv(na, "na") >= 1)) {
//
// YY(2:end)=YY(1:end-1);
//
mclMline(130);
YY(colon(2, end(mwVv(YY, "YY"), 1, 1)))
= mwVv(YY, "YY")(colon(1, end(mwVv(YY, "YY"), 1, 1) - 1));
//
// end %将YY的第i项移到i+1项
//
mclMline(131);
}
//
// YY(1)=Y; %YY(1)保存加入Δu后对象实际输出
//
mclMline(132);
YY(1) = mwVv(Y, "Y");
//
// YYY(t)=Y; %YYY向量记录当前输出
//
mclMline(133);
YYY(mwVv(t, "t")) = mwVv(Y, "Y");
//
// end
//
mclMline(134);
}
}
//
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// E;
//
mclMline(136);
mwVv(E, "E");
//
// F;
//
mclMline(137);
mwVv(F, "F");
//
// G;
//
mclMline(138);
mwVv(G, "G");
//
// H;
//
mclMline(139);
mwVv(H, "H");
//
// TT1=TT;
//
mclMline(140);
TT1 = mwVa(TT, "TT");
//
// TT=1:TT1;
//
mclMline(141);
TT = colon(1, mwVv(TT1, "TT1"));
//
// sample_time=1;
//
mclMline(142);
sample_time = 1;
//
// TT=sample_time*TT;
//
mclMline(143);
TT = mwVv(sample_time, "sample_time") * mwVa(TT, "TT");
//
// figure,
//
mclMline(144);
ans.EqPrintAns(Nfigure(0, mwVarargin()));
//
// plot([0,TT],[0,YYY],'r','LineWidth',2),hold on
//
mclMline(145);
ans.EqPrintAns(
Nplot(
0,
mwVarargin(
horzcat(mwVarargin(0, mwVa(TT, "TT"))),
horzcat(mwVarargin(0, mwVv(YYY, "YYY"))),
"r",
"LineWidth",
2)));
hold(mwArray("on"));
//
// plot([0,TT],[0,ZZZ],'--b')
//
mclMline(146);
ans.EqPrintAns(
Nplot(
0,
mwVarargin(
horzcat(mwVarargin(0, mwVa(TT, "TT"))),
horzcat(mwVarargin(0, mwVv(*ZZZ, "ZZZ"))),
"--b")));
//
// legend('output','expectation')%,'input')
//
mclMline(147);
ans.EqPrintAns(
Nlegend(0, NULL, mwVarargin(mwArray("output"), mwArray("expectation"))));
//
// xlabel('t/ms')
//
mclMline(148);
ans.EqPrintAns(Nxlabel(0, mwArray("t/ms"), mwVarargin()));
//
// grid on
//
mclMline(149);
grid(mwArray("on"));
//
//
// figure,
//
mclMline(151);
ans.EqPrintAns(Nfigure(0, mwVarargin()));
//
// plot([0,TT],[0,UUU],'k')
//
mclMline(152);
ans.EqPrintAns(
Nplot(
0,
mwVarargin(
horzcat(mwVarargin(0, mwVa(TT, "TT"))),
horzcat(mwVarargin(0, mwVv(*UUU, "UUU"))),
"k")));
//
// legend('input')
//
mclMline(153);
ans.EqPrintAns(Nlegend(0, NULL, mwVarargin(mwArray("input"))));
//
// xlabel('t/ms')
//
mclMline(154);
ans.EqPrintAns(Nxlabel(0, mwArray("t/ms"), mwVarargin()));
//
// grid on
//
mclMline(155);
grid(mwArray("on"));
mwValidateOutput(YYY, 1, nargout_, "YYY", "gpc_step");
mwValidateOutput(*ZZZ, 2, nargout_, "ZZZ", "gpc_step");
mwValidateOutput(*UUU, 3, nargout_, "UUU", "gpc_step");
mclMlineFunctionReturn()
return YYY;
//
// %set(gca,'Ytick',[0:c])
//
//
//
//
mclMlineExitFunctionReturn();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -