📄 fun_dmcsim.cpp
字号:
// 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 + -