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

📄 fun_dmcsim.cpp

📁 DMC VC++ 的程序  给大学生毕业用 啦 其它不多说了 用了就知道!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    // 0.1840
    // 0.2362
    // 0.2840
    // 0.3270
    // 0.3650
    // 0.3983
    // 0.4273
    // 0.4522
    // 0.4735
    // 0.4917
    // 0.5071
    // 0.5202
    // 0.5311
    // 0.5403
    // 0.5480
    // 0.5544
    // 0.5597
    // 0.5641
    // 0.5678
    // 0.5708
    // 0.5733
    // 0.5753
    // 0.5770
    // 0.5784
    // 0.5796
    // 0.5805
    // 0.5813
    // 0.5819
    // 0.5824
    // 0.5829
    // 0.5832
    // 0.5835
    // 0.5837
    // 0.5839
    // 0.5840
    // 0.5842
    // 0.5843
    // 0.5843
    // 0.5844
    // 0.5845
    // 0.5845
    // 0.5845
    // 0.5846 ];
    // 
    // 
    // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                         
    // %   plot(s,'o');                               %画响应曲线
    // %   pause;             %暂停,在command窗口中按任意键后运行下面的代码
    // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    // 
    // % generate dynamic matices (both past and future)
    // %
    // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    // % [Sf,Sp,Kmat] = smatgen(s,p,m,n,weight);   %调用之前的函数,产生动态矩阵
    // 
    // w=weight; 
    //
    w = mwVv(weight, "weight");
    //
    // % first, find the dynamic matrix
    // for j=1:m;                                   %给矩阵Sf(p行m列)赋值
    //
    {
        int v_ = mclForIntStart(1);
        int e_ = mclForIntEnd(mwVv(m, "m"));
        if (v_ > e_) {
            j = _mxarray18_;
        } else {
            //
            // Sf(:,j) = [zeros(j-1,1);s(1:p-j+1)];     %Sf的第j列由前j-1个0和s列向量的                                               %前p-j+1个元素组成
            // end
            //
            for (; ; ) {
                mclArrayAssign(
                  &Sf,
                  vertcat(
                    mwVarargin(
                      zeros(mwVarargin(v_ - 1, _mxarray2_)),
                      mclArrayRef(
                        mwVv(s, "s"),
                        colon(_mxarray2_, mwVv(p, "p") - v_ + _mxarray2_)))),
                  colon(),
                  v_);
                if (v_ == e_) {
                    break;
                }
                ++v_;
            }
            j = v_;
        }
    }
    //
    // %
    // % now, find the matrix for past moves
    // %
    // for i=1:p;                                   %给矩阵Sp(p行n列)赋值
    //
    {
        int v_ = mclForIntStart(1);
        int e_ = mclForIntEnd(mwVv(p, "p"));
        if (v_ > e_) {
            i = _mxarray18_;
        } else {
            //
            // Sp(i,:)= [s(i+1:n-1)' zeros(1,i-1)];     %Sp的第i行由s列向量(转置后)的第                                               %i+1至第n-1个元素和i-1个0组成  
            // end
            //
            for (; ; ) {
                mclArrayAssign(
                  &Sp,
                  horzcat(
                    mwVarargin(
                      ctranspose(
                        mclArrayRef(
                          mwVv(s, "s"),
                          colon(v_ + 1, mwVv(n, "n") - _mxarray2_))),
                      zeros(mwVarargin(_mxarray2_, v_ - 1)))),
                  v_,
                  colon());
                if (v_ == e_) {
                    break;
                }
                ++v_;
            }
            i = v_;
        }
    }
    //
    // %
    // % find the feedback gain matrix, Kmat
    // %
    // Kmat = inv(Sf'*Sf+w*eye(m))*Sf';
    //
    Kmat
      = _times_transpose(
          inv(
            _times_transpose(mwVv(Sf, "Sf"), mwVv(Sf, "Sf"), _mxarray5_)
            + mwVv(w, "w") * eye(mwVv(m, "m"))),
          mwVv(Sf, "Sf"),
          _mxarray19_);
    //
    // 
    // 
    // 
    // 
    // % /////////////////////////////////////////////////////////////////
    // %
    // % plant initial conditions         初始化
    // xinit = zeros(size(a,1),1);       %生成一个0列向量,维数是a矩阵的行数
    //
    xinit
      = zeros(
          mwVarargin(
            size(mwValueVarargout(), mwVv(a, "a"), _mxarray2_), _mxarray2_));
    //
    // uinit = 0;
    //
    uinit = _mxarray3_;
    //
    // yinit = 0;
    //
    yinit = _mxarray3_;
    //
    // %
    // %initialize input vector           初始化输入向量
    // u = ones(min(p,kfinal),1)*uinit;  %实际上是0矩阵,行数为p,kfinal中最小者,1列
    //
    *u
      = ones(mwVarargin(min(mwVv(p, "p"), mwVv(kfinal, "kfinal")), _mxarray2_))
        * mwVv(uinit, "uinit");
    //
    // %
    // dup = zeros(n-2,1);               %定义一个n-2行1列的0矩阵
    //
    dup = zeros(mwVarargin(mwVv(n, "n") - _mxarray19_, _mxarray2_));
    //
    // sn = s(n); % last step response coefficient   %取最后一个响应
    //
    sn = mclArrayRef(mwVv(s, "s"), mwVv(n, "n"));
    //
    // x(:,1)=xinit;                     %给一个列向量赋值
    //
    mclArrayAssign(&x, mwVv(xinit, "xinit"), colon(), _mxarray2_);
    //
    // y(1)=yinit;                       %给一个列向量的第一个元素赋值
    //
    mclIntArrayAssign(y, mwVv(yinit, "yinit"), 1);
    //
    // dist(1)=0;                        %同上
    //
    mclIntArrayAssign(&dist, _mxarray3_, 1);
    //
    // %
    // % set-up is done, start simulations
    // for k=1:kfinal;      %这个大的for循环估计是主要程序,也就是那些公式的实现
    //
    {
        int v_ = mclForIntStart(1);
        int e_ = mclForIntEnd(mwVv(kfinal, "kfinal"));
        if (v_ > e_) {
            k = _mxarray18_;
        } else {
            //
            // %我看主要就是一些矩阵的迭代计算
            // %
            // % du(k)=dmccalc(Sp,Kmat,sn,dup,dist(k),r(k),u,k,n);  %调用之前定义的函数,                                                         %具体功能你自己总结,
            // %应该和你做的题目有关
            // 
            // % function [delu] = dmccalc(Sp,Kmat,sn,delup,d,rrr,u,k,n)                                               
            // 
            // delup=dup;
            // d=dist(k);
            // rrr=r(k) ;
            // 
            // [m,p]=size(Kmat);
            // uold = zeros(p,1);
            // for i=1:p;
            // if k-n+i>0
            // uold(i)=u(k-n+i);
            // else
            // uold(i)=0;
            // end
            // end
            // dvec = d*ones(p,1);
            // rvec = rrr*ones(p,1);
            // y_free = Sp*delup+sn*uold+dvec;
            // e_free = rvec-y_free;
            // delu = Kmat(1,:)*e_free;
            // 
            // du(k)=delu;
            // 
            // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                                  
            // 
            // 
            // % perform control calculation
            // if k>1;                               %输入进行迭代,u(1)=uinit+du(1),u                                          %(2)开始迭代
            // u(k)=u(k-1)+du(k); % control input
            // else
            // u(k)=uinit+du(k);
            // end
            // % plant equations                   %进行一些运算,这些你应该能看懂吧:)
            // x(:,k+1) = phi*x(:,k)+gama*u(k);
            // y(k+1) = cd*x(:,k+1);
            // % model prediction
            // if k-n+1>0;            %模型预测,就是一些运算,你那些资料上应该有公式
            // %注意是向量,矩阵还是数就没问题了
            // ymod(k+1) = s(1)*du(k)+Sp(1,:)*dup+sn*u(k-n+1);
            // else
            // ymod(k+1) = s(1)*du(k)+Sp(1,:)*dup;
            // end
            // % disturbance compensation
            // %
            // dist(k+1) = y(k+1)-ymod(k+1);
            // % additive disturbance assumption
            // % put input change into vector of past control moves
            // dup =[du(k);dup(1:n-3)];    %将du的第k个元素和dup的第1至n-3个元素拼成一列
            // end
            //
            for (; ; ) {
                delup = mwVv(dup, "dup");
                d = mclIntArrayRef(mwVv(dist, "dist"), v_);
                rrr = mclIntArrayRef(mwVv(*r, "r"), v_);
                size(mwVarargout(m, p), mwVv(Kmat, "Kmat"));
                uold = zeros(mwVarargin(mwVv(p, "p"), _mxarray2_));
                {
                    int v_0 = mclForIntStart(1);
                    int e_0 = mclForIntEnd(mwVv(p, "p"));
                    if (v_0 > e_0) {
                        i = _mxarray18_;
                    } else {
                        for (; ; ) {
                            if (mclGtBool(
                                  v_ - mwVv(n, "n") + v_0, _mxarray3_)) {
                                mclIntArrayAssign(
                                  &uold,
                                  mclArrayRef(
                                    mwVv(*u, "u"), v_ - mwVv(n, "n") + v_0),
                                  v_0);
                            } else {
                                mclIntArrayAssign(&uold, _mxarray3_, v_0);
                            }
                            if (v_0 == e_0) {
                                break;
                            }
                            ++v_0;
                        }
                        i = v_0;
                    }
                }
                dvec
                  = mwVv(d, "d") * ones(mwVarargin(mwVv(p, "p"), _mxarray2_));
                rvec
                  = mwVv(rrr, "rrr")
                    * ones(mwVarargin(mwVv(p, "p"), _mxarray2_));
                y_free
                  = mwVv(Sp, "Sp") * mwVv(delup, "delup")
                    + mwVv(sn, "sn") * mwVv(uold, "uold")
                    + mwVv(dvec, "dvec");
                e_free = mwVv(rvec, "rvec") - mwVv(y_free, "y_free");
                delu
                  = mclArrayRef(mwVv(Kmat, "Kmat"), _mxarray2_, colon())
                    * mwVv(e_free, "e_free");
                mclIntArrayAssign(&du, mwVv(delu, "delu"), v_);
                if (mclGtBool(v_, _mxarray2_)) {
                    mclIntArrayAssign(
                      u,
                      mclIntArrayRef(mwVv(*u, "u"), v_ - 1)
                      + mclIntArrayRef(mwVv(du, "du"), v_),
                      v_);
                } else {
                    mclIntArrayAssign(
                      u,
                      mwVv(uinit, "uinit") + mclIntArrayRef(mwVv(du, "du"), v_),
                      v_);
                }
                mclArrayAssign(
                  &x,
                  mwVv(phi, "phi") * mclArrayRef(mwVv(x, "x"), colon(), v_)
                  + mwVv(gama, "gama") * mclIntArrayRef(mwVv(*u, "u"), v_),
                  colon(),
                  v_ + 1);
                mclIntArrayAssign(
                  y,
                  mwVv(cd, "cd") * mclArrayRef(mwVv(x, "x"), colon(), v_ + 1),
                  v_ + 1);
                if (mclGtBool(v_ - mwVv(n, "n") + _mxarray2_, _mxarray3_)) {
                    mclIntArrayAssign(
                      &ymod,
                      mclIntArrayRef(mwVv(s, "s"), 1)
                      * mclIntArrayRef(mwVv(du, "du"), v_)
                      + mclArrayRef(mwVv(Sp, "Sp"), _mxarray2_, colon())
                        * mwVv(dup, "dup")
                      + mwVv(sn, "sn")
                        * mclArrayRef(
                            mwVv(*u, "u"), v_ - mwVv(n, "n") + _mxarray2_),
                      v_ + 1);
                } else {
                    mclIntArrayAssign(
                      &ymod,
                      mclIntArrayRef(mwVv(s, "s"), 1)
                      * mclIntArrayRef(mwVv(du, "du"), v_)
                      + mclArrayRef(mwVv(Sp, "Sp"), _mxarray2_, colon())
                        * mwVv(dup, "dup"),
                      v_ + 1);
                }
                mclIntArrayAssign(
                  &dist,
                  mclIntArrayRef(mwVv(*y, "y"), v_ + 1)
                  - mclIntArrayRef(mwVv(ymod, "ymod"), v_ + 1),
                  v_ + 1);
                dup
                  = vertcat(
                      mwVarargin(
                        mclIntArrayRef(mwVv(du, "du"), v_),
                        mclArrayRef(
                          mwVv(dup, "dup"),
                          colon(_mxarray2_, mwVv(n, "n") - _mxarray20_))));
                if (v_ == e_) {
                    break;
                }
                ++v_;
            }
            k = v_;
        }
    }
    mwValidateOutput(s, 1, nargout_, "s", "fun_dmcsim");
    mwValidateOutput(*u, 2, nargout_, "u", "fun_dmcsim");
    mwValidateOutput(*r, 3, nargout_, "r", "fun_dmcsim");
    mwValidateOutput(*y, 4, nargout_, "y", "fun_dmcsim");
    return s;
    //
    // 
    // % [tt,uu]=stairs(t,u);               %图1
    // %  [ttr,rr]=stairs(t,r);              %图2
    //
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -