You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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,属于参数赋值错误。

解决方法

  1. 预初始化误差数组和ISE数组,存储每一步的计算结果
  2. 修正kp的小数点写法,将逗号替换为英文点号
  3. 调用trapz时仅传入从仿真起始到当前时刻的时间片段、误差片段,保证二者长度一致
  4. 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:36:04