仿真测试结果总报错?一步步拆解定位问题

发布于 更新于
1,422
详情介绍

我对MATLAB/Simulink R2023b版本进行了实际的测试,经历了仿真结果和理论值偏差超过30%这样大坑的情况。

参数设置检查与模型验证

开启Simulink模型,步入Model Settings菜单。开始的首要步骤,去触动那个名为Solver的选项卡,把其中的Type进行设定,调整为Fixed-step这种状态,针对Solver的选型,要挑选为ode4 (这个ode4是Runge-Kutta类型的),在Fixed-step size这个地方,填进去0.001这个数值。这种参数方面的组合,能够有力地防止,由于变步长算法而导致的仿真结果出现不收敛的情况。

针存在需要避免陷入的坑,有这样一种常见的报错方式,即“Derivative of state ‘1’ in block ‘xxx’ at time 0.0 is not finite”,而其中的核心原因在于,要么是积分步长过大,要么是初始条件并不合理。以下是快速解决办法,在模型当中操作,选中Integrator模块进而插入,双击该模块使其打开,把Initial condition从原本默认的0这一数值调整为实际物理初值后,再同时勾选Limit output,随后设置相关的上下限范围完毕之结果达成的一系列操作过程。

这样就能方便后续对比分析。

有这样一个【新手避坑】情况,不少人会直接于Scope界面处拖拽光标去读数,此时产生的误差是极大的。而正确的做法呈:在MATLAB命令窗口当中输入plot(sim_data.time, sim_data.signals.values),后续通过代码描绘图形来观察数据点的分布情况,进而借此去避免因图形缩放所作成的视觉误判。

两种仿真方案对比与选择

方案A:针对单一情况仿真情况。在Model Settings的Solver选项卡当中,将Start time设定成为0,把Stop time设定成为5这种情况。这样的方式适宜用来快速验证处于单一工作点时的系统响应情况,仿真所需时间比较短,不过没办法全面评价系统动态性能状状。

方案B:针对多工况进行批处理式仿真。在MATLAB脚本里写入循环体:设定i从1取值至5;将参数‘model_name’的‘SimulationCommand’属性值设为‘start’;把sim(‘model_name’)的执行结果赋值给simOut(i)。此方式可获取不同参数情况下的完整响应曲线,不过要额外去编写数据处理代码。

实际项目里头,要是进行快速原型验证的话,推荐方案A,它效率挺高;要是针对最终产品性能评估,那就务必要用方案B。关键参数最优推荐数值是:把Max step size设定成1e – 4,原因在于这个数值能够确保采样点数超出10万个,满足Nyquist采样定理,防止因频率混叠导致的结果失真。

完整报错处理流程

高频率出现的完整报错内容为: “无法对涉及‘model_name/Subsystem1’的代数环路进行求解”。一种一步到位的解决流程如下:第一步,用鼠标双击报错路径里的Subsystem1,从中找寻环路反馈信号。第四步,重新运行仿真,报错不再出现。

在此提醒新手需注意避开相关误区,当插入Unit Delay之后,所产生的输出信号将会出现延迟一个采样周期的情况能呈现。要是并且如果在此种情况或者条件下,系统对于相位是呈现出敏感状态的,那么就能够选用Memory模块来进行替代操作,该模块所产生的延迟仅仅只是一个步长的幅度,相较于对相位所造成的影响而言,它所带来的影响会更小一些。

本办法不适用于全然连续系统的稳态剖析,像热力学仿真里平衡态的收敛判断这种情况。替代的方案:去改用 Simscape 物理网络办法,或者直接于 Simulink 当中开启Continuous 求解器类型,再配合 Variable-step 模式。

常见问题(FAQ)

仿真结果不收敛、和理论值偏差大,求解器该怎么设置?
在模型设置里进入求解器选项卡,把步长类型设为固定步长,求解器选 ode4,固定步长填 0.001,这样能防止变步长算法导致仿真结果不收敛。
报错说某个状态的导数在 0 时刻不是有限值,该如何处理?
核心原因是积分步长过大或者初始条件不合理;可在模型中选中积分器模块,把初始条件由默认的 0 改成实际物理初值,同时勾选输出限幅并设置上下限。
在示波器界面拖光标读数误差太大,正确的读数方式是什么?
正确做法是在命令窗口输入绘图代码,用代码绘制曲线来观察数据点分布,避免因图形缩放造成的视觉误判。
0 / 600
0 讨论
热门最新
总结
暂无总结
嗨,下午好!
所有的成功,都源自一个勇敢的开始
相关文章