Modelica Dymola中求解非线性系统模型的最大能力是多少?

Modelica Dymola中求解非线性系统模型的最大能力是多少?,modelica,dymola,Modelica,Dymola,在Dymola中,我经常遇到非线性系统初始化失败,或者在大型热流体系统中很难解决的刚性系统,但是对于一个简单的系统,就不会有这种问题。我的问题是: 所以我想知道求解非线性系统模型的最大能力是多少?例如,我的模型中最多可以包含多少个非线性方程 Dymola中是否有任何设置可以提高解决非线性系统的能力 如何减少模型中非线性方程的数量而不损害模型的准确性 这些问题很难用一种普遍有效的方式来回答。尽管如此,我还是会尝试分享一些我在Dymola和非线性系统方面的经验 没有硬性数字限制大小。这更多地取决于方

在Dymola中,我经常遇到非线性系统初始化失败,或者在大型热流体系统中很难解决的刚性系统,但是对于一个简单的系统,就不会有这种问题。我的问题是:

  • 所以我想知道求解非线性系统模型的最大能力是多少?例如,我的模型中最多可以包含多少个非线性方程
  • Dymola中是否有任何设置可以提高解决非线性系统的能力
  • 如何减少模型中非线性方程的数量而不损害模型的准确性

  • 这些问题很难用一种普遍有效的方式来回答。尽管如此,我还是会尝试分享一些我在Dymola和非线性系统方面的经验

  • 没有硬性数字限制大小。这更多地取决于方程的非线性程度,而不是它们的数量。我已经用大小为150的非线性系统模拟了模型,这些系统非常稳定,而其他大小为10的系统可以刹车

  • 对此有多种观点

    • 我研究过一些模型,这些模型使C编译器在编译期间内存不足。如果您遇到这种问题,通过设置
      Advanced.CompileWith64=2
      强制64位编译会有所帮助。那你就不应该再耗尽内存了。这仅指尺寸
    • 通过设置
      Advanced.Define.DAEsolver=true
      激活DAE模式,可以提高非线性系统的性能。但这并不适用于所有解算器
    • 除此之外,它还可以帮助设置高级。moveequalationstodynamics=true,手册中对此说明:“它强制积分器解非线性方程 每个积分器步骤都会计算公式,因此它也会更频繁地更新初始猜测。”
    • 正如Erik所提到的,
      同伦()
      -操作符非常重要,因为它有助于在初始化困难的情况下使解算器收敛
  • 这是非常具体的模型。解耦可以有所帮助,例如通过添加储能元件/状态将系统拆分为更小的系统。这可以根据系统的物理特性来完成,如果可能的话,这是更好的解决方案。作为一种(更人为的)替代方法,可以添加过滤器/延迟。通常这会对准确性产生负面影响


  • 我非常同意马库斯的建议,但也想提醒大家关于Modelica的同伦算子。一个精心选择的简化模型可以极大地帮助Dymola初始化一个大型且困难的非线性系统的模型


    一般来说,在求解非线性系统时,良好的初始猜测非常重要。使用同伦只是提供这些良好猜测的一种隐式方法。

    尤其是使用更好的起始值可以使初始化更加稳定。尝试从小到大建立模型,将每个中间版本模拟到稳定状态,更新开始值。matth评论:有一个选项可以在初始化收敛后自动完成。(这不是针对惊奇漫画,因为这是您自己的问题,但对于所有其他人来说,这可能会有所帮助):@MarkusA,但使用“在模型中保存开始值”只能在初始化后保存值,这不能确保模型已达到稳定状态。我知道有人试图进行模拟,直到模型达到稳定状态,提取关于哪些变量用作起始值的信息,然后更改这些变量的值。添加新零部件后,重复上述步骤。但是如何自动完成上述步骤是一个挑战,也许python是一个不错的选择。但是我没有看到过这样的例子。@Marvel:您可以采取以下步骤将正时间的结果保存为模型中的起始值:1.模拟模型。2.“继续”->“导入首字母”->选择时间。3.“保存在模型中”并选择“当前变量浏览器内容”。@Marvel:但是,请注意,如果模型具有初始方程,这些方程将覆盖所有保存的起始值。在初始化后保存开始值时,可能会出现问题。还有一种方法是生成一个脚本,其中包含模拟的最终值。我构建了两个子系统(a和B),每个子系统都有10个非线性方程,在进行单元测试时,它们都可以正常工作,但如果我将它们组合成一个完整的系统,则会出现初始化失败,因为有20个非线性方程。我应该如何处理这类问题?很难帮助,但似乎组合系统要比单个系统复杂得多。您可以尝试分别初始化这两个系统,使其具有一致的总体系统,然后存储这两个系统的开始值,并使用它们初始化整个系统。