关于优化算法在线更新simulink参数时的一些注意事项

仅为了便利自己的学习,便于快速解决仿真中的一些问题

1. 关于sim函数使用报错:Too many return arguments are specified. Specify only one.

 主要是第一条说sim函数的返回参数过多,刚开始我以为是函数使用的问题,但是发现并不是,sim函数的使用格式为:

[T,X,Y1,...,Yn] =sim('model',Timespan, Options, UT)

其中T为时间变量,X为状态,Y1....Yn为使用out等模块输出到工作区间的值,以out模块输出为例,其Y1对应out模块参数中Port number :1,以此类推。

好了,下面我们说一下报错的原因:

有的matlab版本会在simulink仿真时数据输出中默认会勾选out输出,所以导致输出个数不确定,把

其取消即可,如下:

 参考博主链接:

Error “Too many return arguments are specified. Specify only one.”_wuqx_blogs的博客-CSDN博客

2.对于优化算法在线优化模型参数时,需要将输入确定下来,如使用白噪声Band-LimitedWhiteNoise模块时,由于是通过随机数产生,所以是每次仿真运行都不一样的,应该先将其一组数据确定下来。否则优化算法迭代的时候没有一个优化的基准,可能就会导致无法优化。

3.两个时间同步:

①对于模块的采样时间要与仿真分析的定步长时间相同,如下:

②对于matlab中设定的仿真分析时间要与simulink设定的仿真时间相同,如下matlab的sim函数中设定仿真时间为10s,所以simulink中也要设定为10:

4.利用M文件实现对Simulink中S函数的程序实现自动调参数的功能

比如说我们用s函数写了滑模控制器,滑模控制律中的滑模面系数和趋近律系数都是需要认为调节的(如果不使用优化算法),这时候我们每次调节都得在s函数中修改,而且每次修改完调节参数后都得运行模型,很没有效率,所以提出自己编写m文件实现s函数自动调参的功能。

其主要步骤为:

(1).将s函数中需要调节的参数进行封装显示,如何封装可以参考一下链接:

在Simulink中对S 函数进行参数传递的三种方法_独坐寒江边 的博客-CSDN博客_simulink传递函数输入参数

(2).编写m文件

参考链接:

在MATLAB中采用M文件实现对Simulink中的S函数程序实现自动调参数_独坐寒江边 的博客-CSDN博客

5.对于constant模块用scope输出是显示是一个点(第一个仿真步长),导致的传参报错问题解决方法,报错如下:

SMC_GA_TestuntitleduUBoIIenL. SBBuaar/ vaReyuay- wwruue An error occurred while running the simulation and the simulation was terminatedCaused by :.Simulink cannot solve the algebraic loop containing 'SMNc_GA_Test/S-Function6' at time 0.05using the LineSearch-based algorithm due to one of the following reasons: the model is ill-defined i.e., the system equations do not have a solution; or the nonlinear equation solverfailed to converge due to numerical issues.To rule out solver convergence as the cause of this error,follow either of the suggested actions.If the error persists in spite of the following changes,then the model is likely il1.defined and requires modification.Suggested Actions Switch to TrustRegion-based algopithm using
Fix set_param( " sMc_GA_ Test  , ' AlgebraicLoo扁辑,'TrustRegion ' )Reduce the Fixed-step size of the solver.open

导致原因猜测,模块步长和仿真步长不一致导致,但是即使设定constant模块步长和仿真步长一致也无法解决问题。

解决方案①:点击fix,但是大部分可能无效。

解决方案①:用step代替constant,即设置0s阶跃。

解决方案③:对于可能步长不一致的猜测,加延时模块,如memory等,此方案有效,具体机理还未知,效果如图:

补充:对于constant模块输出实际上是一条线,但是由于默认采样时间是inf,所以导致只有一个点,只需将采样时间设置为:-1,即继承采样时间的意思。如下:

参考链接:

Markers enabled to highlight data - MATLAB Answers - MATLAB Central

Scope does only show one data point - MATLAB Answers - MATLAB Central

6.对于scope模块的线条呈现标记符号如“o"的问题,simulink scope中的markers enabel to highlight data

 只需要打开“style”设置无标识符即可,如下:

 变成直线:

 注:具体触发原因不详,可能下次打开还会如此。

参考链接:

matlab问题:simulink 中的示波器“已起用标记突出显示数据” - 知乎

7.优化算法迭代优化时发现适应度值保持一条直线,没有变化,也就是没有优化,如下(由于时间关系,这里只迭代4次):

 原因分析:

①模块的仿真步长没有统一,如用constant模块记得将时间设定为继承时间,即sample time:-1

②未将输出到工作区间的数据以数组Array的形式输出。

③被控对象或者控制器的编写有问题

8. 当matlab1一个文件复制到另外一个新文件夹中,就是直接复制,但是两边的仿真结果不一致,后者直接第二个文件仿真时无法识别到文件,初步认定原因时软件识别文件延迟,尝试方法:

①先将改复制的文件夹删除路径再添加

②在新文件中空格一下,再删除空格,为了就是更改一下,让软件识别

③重启matlab

9.编写的s函数仿真分析时如下错误: 

An error occurred while running the simulation and the simulation was terminated
Caused by:
Error in 'Steering_model/S-Function' while executing MATLAB S-function 'Steering_v_omegar', flag = 3 (output), at time 0.0. 
输入参数的数目不足。 
Component:Simulink | Category:Block 

错误原因:

              输出的参数beta没有定义

 改正:

定义beta:

 

注:本人也是在自己学习过程中尝试解决问题,如有错误欢迎指导!


版权声明:本文为weixin_50892810原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。