选择步长和迭代次数
为模型中的求解器指定的步长和迭代次数会影响实时模拟的速度和准确性。如果减小步长或增加迭代次数,结果会更准确,但模拟运行速度会变慢。如果增加步长或减少迭代次数,模拟运行得更快,但结果不太准确。
若要优化模型以在实时目标计算机上进行仿真,请指定步长(Ts)和迭代次数(N),提供可接受的精度和速度,以避免超限。与求解器类型一样,可以指定的不同组合Ts而且NSimulink的值万博1manbetx®全局求解器和模型中每个独立的Simscape™网络。
此工作流可帮助您选择用于实时模拟的步长和迭代次数:
通过对液压作动器模型进行变步长仿真,得到参考结果。
使用模型的修改版本来确定要使用的最大步长,以便从固定步长、固定成本模拟中获得足够准确的结果。实时仿真需要固定步长、固定代价的仿真。
为模型的修改版本指定全局和局部固定步骤、固定成本求解器设置。
用修正后的模型进行定时仿真,并评估结果的准确性。
调整步长和迭代次数,以找到为实时模拟提供所需速度和精度的求解器设置。
获取参考结果
为获得参考结果,对原版本液压执行器模型进行仿真。
打开液压执行器模型,在MATLAB中®命令提示符,输入:
模型=“ssc_hydraulic_actuator_digital_control”;open_system(模型)
该模型被配置为限制数据点。要将模型配置为记录所有数据点,请打开模型配置参数,并在Simscape窗格中,清除限制数据点复选框。
模拟模型。
sim(模型)
从已记录的Simscape节点中提取压力和模拟步骤时间的数据。
simlogRef = simlog_ssc_液压驱动器_digital_control;preprenode = simlogref .液压驱动器。液压缸。chamber_a.a.p;pRef = pRefNode.series.values(“爸爸”);tRef = pRefNode.series.time;
画出步长。
H1 =图;semilogy(不可食用的(1:end-1), diff(不可食用的),“- x”)标题(“求解步长”)包含(“时间(s)”) ylabel (步长(s))
最大步长(Ts马克斯)对于原始模型获得准确的实时结果约为1e-2秒。有关确定Ts马克斯,请参阅确定步长.
绘制模拟结果图。
H2 = figure;情节(不可食用的参照,“b -”) h2Legend1 = legend({“参考”},“位置”,“southoutside”);标题(汽缸压力的)包含(“时间(s)”) ylabel (“压力(Pa)”)
确定准确结果的最大步长
在修改版本的液压执行器模型中,可以更改的值Ts马克斯,为获得准确实时仿真结果的最大步长。
打开修改后的液压作动器模型。
ssc_hydraulic_actuator_HIL
该版本的液压驱动器包含一个离散的分区控制器。液压执行器子系统的本地求解器可用于固定步长、固定成本的仿真。步长已参数化(ts),这样您就可以对求解器进行调整,以减少产生溢出的可能性。有关显示如何离散液压执行器控制器的示例,请参见为HIL测试配置液压执行器.
要确定用于实现精确实时模拟结果的最大步长,可以使用全局可变步长求解器进行模拟。若要使用全局求解器将修改后的模型配置为可变步长仿真,请禁用局部求解器配置。在液压执行器子系统中,在解算器配置块属性检查器,清除使用局部求解器复选框。
模拟模型。
从已记录的Simscape节点中提取压力和时间数据。
simlog0 = simlog_ssc_液压驱动器_hil;pNodeSim0 = simlog0.液压驱动器。液压缸。chamber_a.a.p;pSim0 = pNodeSim0.series.values(“爸爸”);tSim0 = pNodeSim0.series.time;
将步长绘制到包含原始模型步长数据的图中。
图(h1)在semilogy (tSim0 (1: end-1), diff (tSim0),“x”,“颜色”,“r”,...“线宽”、1。“MarkerSize”5)标题(“求解步长”)包含(“时间(s)”) ylabel (步长(s)h1Legend1 = legend({“参考”,“修改”},...“位置”,“southoutside”);
对于离散模型,Ts马克斯在1e-2和1e-3秒之间。
参数化全局和本地求解器设置
为了减少寻找最佳实时模拟求解器设置的步骤数,请使用工作空间变量参数化求解器配置。在液压执行器离散模型中,局部求解器配置的步长被指定为工作空间变量ts.对于本例,您还使用工作区变量来参数化全局步长(次数)和局部非线性迭代次数(N).
对于修改后的模型,在模型配置参数属性检查器中,指定以下设置:
窗格 参数 价值 目的 解算器
类型 固定步
配置修改后模型的全局求解器进行固定步长仿真。 解算器 离散(无连续状态)
配置全局求解器以匹配控制器的状态。 附加选项
>固定步长(基本采样时间)次数
参数化全局步长。 Simscape
限制数据点 清除复选框。 随着求解器步长的减小,模拟生成的数据点数量也会增加。清除该选项以确保收集评估模拟精度所需的所有数据。 为固定步长模拟配置本地求解器。在液压执行器子系统中,在解算器配置块属性检查器,选择使用局部求解器.
若要参数化模拟的代价,请设置非线性迭代来
N
.
执行固定步骤,固定成本模拟
通过模拟模型,然后评估结果的准确性和模拟的速度,可以确定求解器设置是否适合实时仿真。为了评估精度,将结果与参考结果和其他固定步长、固定成本的模拟结果进行比较。若要评估模拟速度,请将运行时间与指定的模拟时间和模拟执行预算进行比较。如果速度或精度不能接受,请调整步长和迭代次数,使您的模型具有实时性。
本例的模拟执行时间预算为4秒。有关确定模型的执行时间预算的信息,请参见估算计算成本.
对于第一个模拟,将全局步长和局部步长指定为的最大值Ts马克斯从阶梯图中。为两个解算器指定一个相对较大的步长值,为局部解算器的非线性迭代次数指定三个。
Ts = 1e-2;tsG = 1e-2;N = 3;
执行定时固定步长、固定成本的模拟。
抽搐;sim卡(“ssc_hydraulic_actuator_HIL”);tSim1 = toc;time1 = max(tSim1);
从记录的Simscape节点中提取压力和模拟时间的数据。
simlog1 = simlog_ssc_液压驱动器_hil;pNodeSim1 = simlog1.液压驱动器。液压缸。chamber_a.a.p;pSim1 = pNodeSim1.series.values(“爸爸”);tSim1 = pNodeSim1.series.time;
将模拟结果绘制到包含参考结果的图中。将经过的时间写入图形图例。
图(h2)在情节(tSim1 pSim1,“g——”) delete(h2Legend1) configSim1L = ['Local: Ts= 'num2str (ts),s, N= 'num2str (N),“。”];configSim1G = [' Global: Ts= 'num2str(次数)“年代”。];timeSim1T = [的时间= 'num2str (time1)];cfgSim1 = [configSim1L,configSim1G,timeSim1T];h2Legend2 = legend({“参考”num2str (cfgSim1)},...“位置”,“southoutside”);
运行时间不同,因为它取决于运行模拟的计算机的即时计算能力。图例中的运行时间来自于3.6 ghz Intel上的模拟®CPU, 16gb内存。您的图例包含计算机上模拟运行的时间。
模拟完成所花费的时间比指定的模拟时间(10秒)要少,因此它在开发计算机上的运行速度比实时快。运行时间也小于本例的模拟执行时间预算(4秒)。因此,指定的求解器配置为提供预算数据的目标机器上的实时仿真提供了可接受的安全裕度。
放大到一个拐点,以评估结果的准确性。
图(h2) xStart = 0;xEnd = 10;yStart = 0;yEnd = 3.5e6;xZoomStart = 0.3;xZoomEnd = 0.6;yZoomStart = 2.6e6;yZoomEnd = 3.5e6;axis([xZoomStart xZoomEnd yZoomStart yZoomEnd])
理论和实证数据支持了参考结果。万博1manbetx仿真结果的精度是不可接受的,因为解算器在收敛到参考数据的解之前会振荡。
如果您可以达到可接受的结果精度,但是对于给定的执行时间预算,模拟运行太慢,那么可以通过增加步长或减少迭代次数来提高速度。
当您发现求解器设置的组合能够提供足够精确的结果和符合您的执行时间预算的模拟速度时,您可以尝试通过执行硬件在环模拟工作流在实时目标机器上运行您的模型。如果无法找到求解器设置的正确组合,请执行实时模型准备工作流或提高实时计算能力,以提高模拟速度和准确性。要提高实时计算能力,请升级目标硬件或划分模型以进行并行处理。
调整求解器设置以提高精度
通常可以通过增加迭代次数或减小步长来提高精度。
尝试通过增加迭代次数(N)至10。
N = 10;
运行一个定时模拟。
抽搐;sim卡(“ssc_hydraulic_actuator_HIL”);tSim2 = toc;time2 = max(tSim2);
提取压力和模拟时间数据。
simlog2 = simlog_ssc_液压驱动器_hil;pNodeSim2 = simlog2.液压驱动器。液压缸。chamber_a.a.p;pSim2 = pNodeSim2.series.values(“爸爸”);tSim2 = pNodeSim2.series.time;
画出结果。
图(h2)在情节(tSim2 pSim2,“:”) delete(h2Legend2) axis([xStart xEnd yStart yEnd]) configSim2L = ['Local: Ts= 'num2str (ts),s, N= 'num2str (N),“。”];configSim2G = [' Global: Ts= 'num2str(次数)“年代”。];timeSim2T = [的时间= 'num2str (time2)];cfgSim2 = [configSim2L,configSim2G,timeSim2T];h2Legend3 = legend({“参考”num2str (cfgSim1) num2str (cfgSim2)},...“位置”,“southoutside”);
该仿真对于实时仿真来说足够快,因为它的运行时间少于4秒的仿真执行预算。
缩放以评估准确性。
图(h2)轴([xZoomStart xZoomEnd yZoomStart yZoomEnd])
总的来说,结果并不比较少迭代的模拟结果准确多少。
尝试通过将局部和全局求解器的步长减小到1e-3秒来提高精度。指定
3.
对于迭代次数(N).Ts = 1e-3;tsG = 1e-3;N = 3;
运行一个定时模拟。
抽搐;sim卡(“ssc_hydraulic_actuator_HIL”);tSim3 = toc;time3 = max(tSim3);
提取压力和模拟时间数据。
simlog3 = simlog_ssc_液压驱动器_hil;pNodeSim3 = simlog3.液压驱动器。液压缸。chamber_a.a.p;pSim3 = pNodeSim3.series.values(“爸爸”);tSim3 = pNodeSim3.series.time;
画出结果。
图(h2)在情节(tSim3 pSim3,“k——”) delete(h2Legend3) axis([xStart xEnd yStart yEnd]) configSim3L = ['Local: Ts= 'num2str (ts),s, N= 'num2str (N),“。”];configSim3G = [' Global: Ts= 'num2str(次数)“年代”。];timeSim3T = [的时间= 'num2str(历史问题)];cfgSim3 = [configSim3L,configSim3G,timeSim3T];h2Legend4 =传奇...({“参考”num2str (cfgSim1) num2str (cfgSim2) num2str (cfgSim3)},...“位置”,“southoutside”);
模拟需要更长的时间,但是考虑到4秒的模拟执行时间预算,已经足够快了。
缩放以更好地评估准确性。
图(h2)轴([xZoomStart xZoomEnd yZoomStart yZoomEnd])
结果的准确性是可以接受的。对于修改后的模型进行实时仿真,请使用提供可接受的速度和精度的求解器设置:
三次非线性迭代
全局和局部步长为1e-3秒
如果您可以获得足够精确的结果,但是模拟运行速度对于您的执行时间预算来说太慢,那么可以通过增加步长或减少迭代次数来提高速度。
当您发现求解器设置的组合提供了足够精确的结果,并且模拟速度低于您的执行时间预算时,您可以在实时目标机器上运行您的模型。要在实时目标机器上运行模型,请执行硬件在环模拟工作流。
如果无法找到用于实时仿真的求解器设置的正确组合,请通过修改模型的范围或保真度来提高仿真速度和精度。有关更多信息,请参见实时模型准备流程.
如果您不能通过改变模型的范围或保真度来使您的模型具有实时能力,请提高您的实时计算能力。有关更多信息,请参见升级目标硬件而且系统各部分的并行仿真.
另请参阅
解算器分析器|simscape.getLocalSolverFixedCostInfo