作为除数的导数在 Dymola 初始化期间给出除以零
Derivative as divisor gives division by zero during initialization in Dymola
我构建了一个模型,其中包含 dy/dx=5
的导数,如下片段所示,但模型在 Dymola 中初始化时失败,在 der(x)
和der(y)
的值都是0,所以会出现除0的错误。
model HowToExpressDerivative "dy/dx=5, how to describe this equation in Modelica?"
extends Modelica.Icons.Example;
Real x, y;
equation
x = time ^ 2;
der(y) / der(x) = 5;
end HowToExpressDerivative;
这是 Dymola 中的结果:
但是当我在 Wolfram System Modeler 和 OpenModelica 中尝试相同的模型时,模型工作正常。
在 Wolfram System Modeler 中,它直接使用 der(y)/der(x)=5
的等式。
我的问题是:
- 为什么同一个模型在 Dymola 中会失败?
- Dymola 是否没有能力进行自动符号操作以将此等式
der(y)/der(x)=5
转换为der(y)=5*der(x)
? - 或者Dymola中的数值求解器无法处理这种情况?
Dymola 目前无法识别那种情况下的微不足道的简化(在另一种情况下已完成),不是因为它太复杂,而是因为 Dymola 使用了一个简单的规则:
Modelica 代码中的部分是安全的,其他部分不被认为是安全的。
因此 der(x)/der(y)=5
表明除以 der(y) 是安全的(即使它显然不安全),而从技术上讲求解该方程涉及除以 1/der(y)
,这被认为是不安全的(因为它没有出现在 Modelica 代码中)。
显然可以改进逻辑,但最简单的解决方案是使用以下规则:除非安全,否则不要在代码中划分。
遵循该规则的一个好处是可以检查所有原始方程并查看它们是否满足(达到数值精度)- 不会触发被零除。
更新: 在 Dymola2023 中模型正确编译和运行。
// Initial Section
der(x) := 2.0*time;
der(y) := 5.0*der(x);
// --------------------------------------------------------------------------
// Dynamics Section
der(x) := 2.0*time;
der(y) := 5.0*der(x);