Dymola运行时ln函数除零错误,动态模型求解求助
动态模型温差计算除零错误的解决方案
问题说明
需要实现的温差计算逻辑:
- 当
Tb2小于饱和温度Tbaohe时,采用对数平均温差T1求解 - 当
Tb2达到或接近饱和温度时,切换为算术平均温差T2求解,此时Tc1等于Tbaohe
原始代码如下:
Kc*Ac*T3 = (Wnjs + Gna)*(hc1 - hb2); T1 = ((Te1 - Tbaohe) - (Tc1 - Tb2))/(ln((Te1 - Tbaohe)/(Tc1 - Tb2))); T2 = (Te1 + Tbaohe)/2 - (Tc1 + Tb2)/2; if Tb2 < Tbaohe then T3 = T1; else T3 = T2; end if;
运行时触发除零错误,报错信息:
Error: The following error was detected at time: 10.86044238659505 Model error - division by zero: (Te1-Tbaohe) / (Tc1-Tb2) = (104.936) / (0) First evaluation failed for non-linear solver. First evaluation failed for non-linear solver.
错误原因
当Tb2无限接近Tbaohe时,Tc1-Tb2趋近于0,导致对数平均温差计算式中出现除以零的情况,触发求解器报错。
解决方案
核心思路:
- 给饱和温度判断加入极小阈值,避免
Tb2无限接近Tbaohe时执行对数平均温差计算 - 仅在
Tb2与Tbaohe的差值足够大时,才计算对数平均温差;差值极小时,用算术平均温差替代(此时两者数值几乎一致,不影响精度) - 明确在饱和状态下设置
Tc1 = Tbaohe
修改后的代码:
Kc*Ac*T3 = (Wnjs + Gna)*(hc1 - hb2); T2 = (Te1 + Tbaohe)/2 - (Tc1 + Tb2)/2; // 可根据模型精度调整阈值大小,比如1e-6 real threshold = 1e-6; if Tb2 < Tbaohe - threshold then // 仅在安全范围内计算对数平均温差 T1 = ((Te1 - Tbaohe) - (Tc1 - Tb2))/(ln((Te1 - Tbaohe)/(Tc1 - Tb2))); T3 = T1; else // 接近或达到饱和温度时,切换为算术平均温差,并设置Tc1=Tbaohe Tc1 = Tbaohe; T3 = T2; end if;
补充说明
- 阈值
1e-6可根据模型的温度精度需求调整,比如如果模型精度要求到0.001,可设置为1e-3 - 当温差极小时,对数平均温差和算术平均温差的相对误差小于0.1%,完全满足工程计算需求
- 将
T1的计算放到安全分支内,避免了不必要的计算,提升求解效率
内容的提问来源于stack exchange,提问作者white
相关产品推荐
相关产品推荐

