数值补偿在协同模拟积分中的应用
这个例子展示了如何使用数值补偿来减少联合仿真引入的潜在仿真误差。
一个示例联合仿真组件
典型的联合仿真组件可以由具有连续状态的动态系统和在通信时间点之间执行积分的局部求解器表示。这些函数导出独立的Co-Simulation FMUcosim_component.fmu
从这个模型中:
componentMdl =“cosim_component”;open_system (componentMdl);
该模型包含传递函数,并具有具有步长的局部固定步长求解器t = 0.02年代
.您可以使用生成的FMU作为集成模型中的联合仿真组件。
注意,联合仿真组件只能使用在通信时间点给定的输入值。当通信步长与组件的动态行为相比相对较大时,这一要求引入了联合仿真误差。减小通信步长可以改善仿真结果,但会增加数据传输开销。改变局部求解器类型或减小局部求解器步长可以在通信步内获得更好的集成结果,但不能补偿由于欠采样引起的联合模拟误差。
数值补偿在积分模型中的应用
在以下模型中使用联合仿真组件进行集成:
integrationMdl =“cosim_integration”;open_system (integrationMdl);set_param (integrationMdl“SimulationCommand”,“更新”);
该模型在顶层分支中包含两个连接的FMU联合仿真组件。这两个联合模拟组件,FMU Cosim组件
而且FMU Cosim组件2
,都有自己的局部求解器。它们仅以离散通信速率D2交换数据,其中t = 0.2年代
.底部分支中的两个连续时间传递函数块是同一系统的整体非联合仿真方法,使用全局求解器作为仿真结果的基线。两个非联合仿真组件以连续速率交换数据,全局求解器步长设置为t = 0.02年代
.在这个例子中,我们关注的是的数值行为FMU Cosim组件2
并假设其输入信号的联合仿真离散化是不可避免的。
更新方框图后,第二个co-sim组件的输入端口出现齿轮图标,FMU Cosim组件2
.这表明Simulink已经自动确定该输入金宝app端口需要数值补偿,因为:
源(和目标)块将它们的输出(和非直馈输入)端口声明为连续的数量。
源和目标块是联合仿真组件(例如S-Function或联合仿真FMU)
该信号具有双重数据类型和周期性离散采样率
要关闭自动补偿,请左键单击图标。或者,通过编程方式将其关闭:
黑色=“cosim_integration/FMU Cosim Component 2”;P = get_param(blk,“PortHandles”)
p =带字段的结构:输入:43.0005输出:67.0007启用:[]触发:[]状态:[]LConn: [] RConn: [] Ifaction:[]复位:[]事件:[]
set_param (p。轮廓尺寸,“CoSimSignalCompensationMode”,“Auto_Off”) out_off = sim(integrationMdl);
金宝app当齿轮图标显示为禁用时,Simulink不补偿此输入端口上的联合仿真错误。以下函数在没有数值补偿的情况下绘制结果:
图(1);持有在;情节(out_off.yout {1} . values,“r”);情节(out_off.yout {2} . values,“黑”);情节(out_off.yout {3} . values,‘g’);情节(out_off.yout {4} . values,“b”);传奇({“cosim响应(无补偿)”,“理想的反应”,“cosim输入”,理想的输入},“位置”,“西北”)
联合仿真输入信号(表示连续量的双类型周期离散信号)从0跳到正的值t = 0.4秒
.与理想(非联合模拟)响应相比,联合模拟响应显示其输入的延迟。联合仿真方案导致这种延迟,其中输入信号不能在两个通信时间点之间变化。例如,当协同仿真组件时FMU Cosim组件2
在通信时间点暂停t = 0.4秒
,局部求解器取正输入进行积分;然后局部求解器通过通信步骤[0.4, 0.6)
,并在下一个通信时间点返回正输出值t = 0.6秒
.
启用数值补偿时,Simulink将尝试为联合仿真组件计算更好的输入值金宝appFMU Cosim组件2
使联合仿真输入值更接近两个通信时间点之间非联合仿真输入的平均值。例如,而不是使用联合仿真输入值y = 0.165
在t = 0.4秒
,在通信步骤上有更好的平均输入[0.4, 0.6]
大概在y = 0.241
的中点y = 0.165 (t = 0.4 s)
而且y = 0.316 (t = 0.6 s)
.这就像使用中点黎曼和而不是左和来估计理想输入信号曲线下的面积。
然而,在通信时间点t = 0.4秒
的值。y = 0.316 (t = 0.6 s)
仍然不可用。来估计y
价值t = 0.6秒
, 金宝appSimulink将信号数据外推为基于早期时间点的多项式(例如。t = 0.2秒
,t = 0.4秒
).你可以选择不同的外推法在联合模拟数值补偿对话框时右击图标。或者,使用以下函数:
set_param (p。轮廓尺寸,“CoSimSignalCompensationConfig”,”{ExtrapolationMethod”:“LinearExtrapolation“}”)
下图比较了启用或禁用补偿的结果:
set_param (p。轮廓尺寸,“CoSimSignalCompensationMode”,“汽车”) out_linear = sim(integrationMdl);图(2);持有在;情节(out_off.yout {1} . values,“r”)情节(out_linear.yout {1} . values,“米”)情节(out_off.yout {2} . values,“黑”)({传奇“cosim响应(无补偿)”,cosim响应(线性外推),“理想的反应”},“位置”,“西北”)
通过数值补偿,在通信时间点的联合仿真响应更接近于理想的非联合仿真输出。减小了联合仿真引入的数值误差(时延)。
下图显示了不同外推方法的影响:
set_param (p。轮廓尺寸,“CoSimSignalCompensationConfig”,”{ExtrapolationMethod”:“QuadraticExtrapolation“}”) out_quadratic = sim(integrationMdl);set_param (p。轮廓尺寸,“CoSimSignalCompensationConfig”,”{ExtrapolationMethod”:“CubicExtrapolation“}”) out_cubic = sim(integrationMdl);图(3);持有在;情节(out_linear.yout {1} . values,“r”)情节(out_quadratic.yout {1} . values,‘g’)情节(out_cubic.yout {1} . values,“b”)情节(out_off.yout {2} . values,“黑”)({传奇cosim响应(线性外推),cosim响应(二次外推),宇宙响应(三次外推),“理想的反应”},“位置”,“西北”)
例如,当比较外推的输出值时,外推的输出值会引入估计误差y
价值t = 0.6秒
(估计t = 0.4秒
)真实的y
价值t = 0.6秒
(记录在t = 0.6秒
).金宝app当您指定非零时,Simulink可以在以下通信步骤中选择性地补偿此错误信号校正系数在联合模拟数值补偿对话框。或者,使用这些函数:
set_param (p。轮廓尺寸,“CoSimSignalCompensationConfig”,”{ExtrapolationMethod”:“LinearExtrapolation”、“CompensationCoefficient”:“1”}”)
这个系数在内有效[0, 1]
,在那里0
表示将忽略估计误差,并且1
在接下来的通信步骤中完全补偿估计误差。将此值设置为1
当联合模拟信号表示或与某种守恒量的流量(例如,电流、质量或体积流量)成比例时,可能有用。
下图显示了不同信号校正系数值的影响:
set_param (p。轮廓尺寸,“CoSimSignalCompensationConfig”,”{ExtrapolationMethod”:“LinearExtrapolation”、“CompensationCoefficient”:“0”}”) out_linear_0 = sim(integrationMdl);set_param (p。轮廓尺寸,“CoSimSignalCompensationConfig”,”{ExtrapolationMethod”:“LinearExtrapolation”、“CompensationCoefficient”:“0.5”}”) out_linear_0_5 = sim(integrationMdl);set_param (p。轮廓尺寸,“CoSimSignalCompensationConfig”,”{ExtrapolationMethod”:“LinearExtrapolation”、“CompensationCoefficient”:“1”}”) out_linear_1 = sim(integrationMdl);图(4);持有在;情节(out_linear_0.yout {1} . values,“r”)情节(out_linear_0_5.yout {1} . values,‘g’)情节(out_linear_1.yout {1} . values,“b”)情节(out_off.yout {2} . values,“黑”)({传奇cosim响应(系数:0),cosim响应(系数:0.5),cosim响应(系数:1),“理想的反应”},“位置”,“西北”)
close_system (componentMdl 0);close_system (integrationMdl 0);