请高手帮忙把这个matlab程序转换成C程序。非常感谢!

请高手帮忙把这个matlab程序转换成C程序。非常感谢!MATLAB的水箱液位控制程序,主程序:watertanklearall;clcts=2;%采样时间可更改P=12... 请高手帮忙把这个matlab程序转换成C程序。非常感谢!
MATLAB的水箱液位控制程序,
主程序:watertank
lear all;
clc
ts = 2;%采样时间 可更改
P = 12;
M = 8;
alpha = 0.96;
SP = 10;%输出设定值 可更改
lmd = 1.3;%输出跟踪与控制增量权系数
Ksim=400;

z = [];
p = [-1/72,-1/144];
k = 0.291;
sys = zpk(z,p,k);
sys = tf(sys);
sys.ioDelay = 10;

dsys = c2d(sys,ts);%离散化
delay = dsys.ioDelay;
[num den] = tfdata(dsys,'v');
%-----先进行一次辨识,以便能使GPC启动
na=2;
nb=2;
nk=delay+1;

it=ts:ts:31*ts;
au=idinput(31,'PRBS');
ay=lsim(sys,au,it);
iUU=iddata(ay,au,ts);
mysys=arx(iUU,[na nb nk]);
[A,B]=arxdata(mysys);
A=A(2:length(A));
B=B(2:length(B));%
na=length(A);%
nb=length(B)-1;
AA=A;
BB=B;

Y=zeros(na+1,1);
delt_Y=zeros(na+1,1);
U=zeros(nb+1,1);
delt_U=zeros(nb+1,1);

y_k = 0;
u_k = 0;
miu = 0.97;
Pt=10000*eye(na+nb+1);

theta=[A,B]';%theta的初始值若不为0,则Y,delt_Y,U,delt_U初始值可设为0;

%仿真开始,先计算当前输出
for i=1:Ksim%仿真时域设为400
time(i,1) = i;

%求输出
y_k=0;
for k=1:length(AA)
y_k=y_k-AA(k)*Y(k);
end
for k=1:length(BB)
y_k=y_k+BB(k)*U(k);
end

yy(i) = y_k;
Y = [y_k;Y(1:na)];
delt_Y=[Y(1)-Y(2);delt_Y(1:na)];

fai=[-delt_Y(2:na+1);delt_U];
Kt=Pt*fai/(fai'*Pt*fai+miu);
theta=theta+Kt*(delt_Y(1)-fai'*theta);
Pt=((eye(na+nb+1)-Kt*fai')*Pt)/miu;

A = theta(1:na)';
B = theta(na+1:na+nb+1)';

%设定参考轨迹
for k=1:P;
Yr(k,1) = alpha^k*y_k + (1-alpha^k)*SP;
end

[E F G H] = my_diophantine(A,B,P,M);
R = inv(G'*G+lmd*eye(M))*G';
du = R*(Yr-F'*Y-H'*delt_U(1:nb));
delt_uk = du(1);
u_k = u_k +delt_uk;
uu(i) = u_k;

delt_U = [delt_uk;delt_U(1:nb)];
U = [u_k;U(1:nb)];

end

plot(time,yy,time,uu);
legend('输出响应曲线','控制输入变量')
副程序 my_diophantine
function [E F G H] = my_diophantine(A,B,P,M)%P为预测时域 E:P*1 F:(na+1)*P G:P*M H:nb*P
%A=[a1,a2,...,ana]'
%B=[b0,b1,b2,...,bnb]'

na = length(A);
nb = length(B)-1;

%--------递推矩阵FT(na+1)*(na+1)的输入--------------
FT = zeros(na+1);
for i = 1:na
FT(i,i+1) = 1;
end
for i = 2:na
FT(i,1) = A(i-1)-A(i);
end
FT(1,1) = 1-A(1);
FT(na+1,1) = A(na);
%---------FT是用于计算序列F时的递推矩阵--------------

E=zeros(P,1);
F=zeros(na+1,P);
E(1,1)=1;
F(:,1)=FT(:,1);

for i=2:P
E(i,1)=F(1,i-1);
F(:,i)=FT*F(:,i-1);
end

%-------------递推矩阵HTnb*nb的输入-----------------
HT = zeros(nb,nb);
for i=1:(nb-1)
HT(i,i+1) = 1;
end
%-------HT是用于计算序列H时的递推矩阵---------------
g = zeros(P,1);
H = zeros(nb,P);
g(1) = E(1)*B(1);
H(:,1) = B(2:nb+1)';

for i=2:P
g(i) = E(i)*B(1) + H(1,i-1);
H(:,i) = HT*H(:,i-1)+E(i)*H(:,1);
end

for i=1:P
for j=1:M
if (j>i)
G(i,j) = 0;
else G(i,j) = g(i-j+1);
end
end
end
展开
 我来答
不知详解
2012-03-13 · 知道合伙人软件行家
不知详解
知道合伙人软件行家
采纳数:609 获赞数:2257
自学计算机。

向TA提问 私信TA
展开全部
用mcc命令转换为C/C++代码,命令行参数如下
生成C文件
mcc -t -L C matsum.m
生成C++文件
mcc -t -L Cpp matsum.m
生成动态链接库函数
mcc -t -W lib:sum -T link:lib matsum.m
追问
对于这个MATLAB转化为C的方法可以细聊吗?我那样命令不行哎。
mcc-t-L C watertank.m
??? mcc-t-L C watertank.m
|
Error: Missing MATLAB operator.
我QQ:1029609557,谢谢

参考资料: http://blog.sina.com.cn/s/blog_5919e4d40100l74w.html

意法半导体(中国)投资有限公司
2023-06-12 广告
单片机汇编程序是用汇编语言编写的程序,用于控制单片机的操作。汇编语言是一种比较接近计算机硬件语言的低级语言,相对于高级语言来说更容易理解和实现。下面是单片机汇编程序的基本步骤:1. 将代码和数据汇编到规定的段中。2. 在存储器中用未初始化的... 点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式