You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,导致对数平均温差计算式中出现除以零的情况,触发求解器报错。

解决方案

核心思路:

  1. 给饱和温度判断加入极小阈值,避免Tb2无限接近Tbaohe时执行对数平均温差计算
  2. 仅在Tb2与Tbaohe的差值足够大时,才计算对数平均温差;差值极小时,用算术平均温差替代(此时两者数值几乎一致,不影响精度)
  3. 明确在饱和状态下设置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:07:32