⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpc_step.cpp

📁 广义预测控制的COM接口程序 VBheVC可调用 实现联合编程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                    // 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 + -