CSIM在Scilab v6.0.0/6.0.1无法运行,v5.5.2正常,报错求助
我帮你搞定这个Scilab版本兼容的坑——你碰到的lsode报错,本质是Scilab 6.x重构了ODE求解模块,和5.5.2的处理逻辑有明显差异导致的。
问题明确
你的代码在Scilab v5.5.2里能正常运行,但一到v6.0.0及更高版本就抛出错误,具体报错信息如下:
lsode-- at t (=r1), mxstep (=i1) steps necessary before reaching tout
where i1 is : 500
where r1 is : 0.1202764106130D-05
Excessive work done on this call (perhaps wrong jacobian type).
at line 159 of function csim ( C:\Program Files\scilab-6.0.1\modules\cacsd\macros\csim.sci line 170 )
at line 39 of executed file C:\Users\wensrl\Documents\SciLab\Control\optTest2.sce
ode: lsode exit with stat...
背后原因
Scilab 6.x对lsode求解器的默认参数做了收紧:比如最大迭代步数(mxstep)的阈值比5.5.2低,而且对雅可比矩阵的类型检测更严格。报错里的"Excessive work done"就是说,求解器在默认的500步限制内,没法完成你的模型积分,而5.5.2的阈值更宽松,或者自动适配了你的模型特性。
可行的修复方案
按优先级给你列几个实用办法:
- 手动调高求解器的最大迭代步数:调用
csim的时候,显式给lsode设置更大的mxstep值,比如:// 把原来的csim调用改成这样,10000可以根据实际情况调大 csim(your_inputs, ['lsode', 'mxstep', 10000]) - 切换到其他ODE求解器:如果调步数不管用,试试换用Scilab 6.x支持的更稳健的求解器,比如
cvode:csim(your_inputs, ['cvode']) - 检查模型的刚性与雅可比矩阵:如果你的控制系统是刚性系统,Scilab 6.x需要你显式指定雅可比矩阵类型,比如:
同时也确认下模型的初始条件有没有异常,比如初始值是不是导致系统突变的情况。csim(your_inputs, ['lsode', 'jacobian', 'full'])
小提示
先试第一个方法,最直接省事;如果还是报错,再检查模型是不是刚性系统,或者换求解器测试。
内容的提问来源于stack exchange,提问作者TheWenz

