使用MATLAB计算ISE指标时报错:维度参数需为索引范围内正整数标量
Matlab计算误差平方积分ISE报错排查及解决方案
报错原因
- trapz函数输入维度不匹配:循环内定义的
e=1-y(k-1)为单值标量,调用trapz(tt,e.^2)时,tt是长度为1500的时间向量,二者维度完全不一致,直接触发Dimension argument must be a positive integer scalar within indexing range报错。同时对单值标量调用trapz(e)也不符合函数的输入参数要求。 - 未存储历史计算值:ISE是从仿真启动到当前时刻的误差平方累积积分,需要存储每个时刻的误差才能计算积分结果;同时要绘制ISE随时间变化的曲线,也需要将每一步的ISE计算结果存储为数组,不能每次循环都覆盖为单值。
- 参数赋值语法错误:代码中
kp=12,97;的逗号为Matlab语句分隔符,运行后kp仅会被赋值为12,属于参数赋值错误。
解决方法
- 预初始化误差数组和ISE数组,存储每一步的计算结果
- 修正kp的小数点写法,将逗号替换为英文点号
- 调用trapz时仅传入从仿真起始到当前时刻的时间片段、误差片段,保证二者长度一致
- 调整PI控制器积分项的计算逻辑,使用历史误差序列计算积分值
修正后可运行代码
A=[0 1; -8.6207 -10.0682]; B=[0 ; 1]; C=[34.4827 0]; D=0; sys=ss(A,B,C,D); Tp=0.01; I=eye(2); Ad=I+A*Tp; Bd=B*Tp; Cd=C; Dd=D; M=15/Tp; y=zeros(1, M); e=zeros(1, M); % 预存误差序列 ise=zeros(1, M); % 预存ISE序列 x= [0;0]; kp=12.97; % 修正小数点写法 Ti=0.567; tt=(1:M)*Tp; for k = 2:M % regulator e(k)=1-y(k-1); % 计算到当前时刻的误差积分 integral_e = trapz(tt(1:k), e(1:k)); u=kp*(e(k)+(1/Ti)*integral_e); % obiekt x=Ad*x + Bd*u; y(k)=Cd*x + Dd*u; % 计算到当前时刻的ISE ise(k)=trapz(tt(1:k),e(1:k).^2); end figure(1); plot(tt,y); xlabel('时间/s') ylabel('输出值') figure(2); plot(tt,ise) xlabel('时间/s') ylabel('ISE指标值')
内容的提问来源于stack exchange,提问作者boobel
相关产品推荐
相关产品推荐

