在 Dymola 中使用固定步长求解器时如何选择步长?

Mar*_*vel 1 modelica dymola

我想做一个实时模拟,如果我想在 Dymola 中使用固定步长求解器,具有不同的步长,结果可能会有所不同,那么是否有任何标准程序来选择步长?或者我是否必须进行大量计算来证明步长独立性,就像在 CFD 区域中我需要证明网格独立性一样?

在此处输入图片说明

Mar*_* A. 6

我不知道是否有标准程序,但证明数值稳定性对于非线性/混合模型的数值求解并不简单。因此,我会采用一些不严格的数学程序。由于您可以自由选择步长,因此我将执行以下操作。

选项 1(至少有一点数学背景):

  • 使用“工具 -> 线性分析 -> 极点”对模型进行线性化
  • 结果应包含一列 freq. [Hz]
  • 给定求解器属性(例如稳定区域),取最大值并为其推导出必要的步长
  • 对于 Forward Euler,使用 StepSize = 1/max(freq) * 1/10
  • 对于其他人来说,关系可能非常不同,但对于大多数显式求解器来说,这应该是一个很好的起点

注意:“线性分析”的其他功能可能也包含有用的信息,因此值得尝试运行它们。

上述方法的问题在于,非 LTI 系统的极点可能取决于模型的输入/状态。因此它可能会出错,因为结果分别取决于系统状态或线性化时间。

选项 2(只是通过跟踪和错误):

鉴于您大致了解步长应该是多少,您可以这样做:

  • 选择一个求解器并选择一个相当小的步长。这应该提供一个很好的结果,但模拟速度很慢(例如,在您的情况下为 100ns)。
  • 然后将步长增加例如 10 倍,直到差异达到您认为太大而无法继续的水平。
  • 然后减少步长的变化以找到性能和精度之间权衡的最佳点。

注意:上面的步骤可以颠倒过来,从一个大步长开始,然后减小它直到结果匹配得足够好。

验证/微调

为了证明上述两个选项中的任何一个的结果都不是完全关闭,执行以下操作是有意义的:

  • 使用经过验证的运行良好的求解器创建参考结果(在 Dymola 中,我将使用具有合理相对容差的 DASSL)。
  • Double-check the reference result with a second solver, ideally something rather different (in Dymola this could be Radau, CVode is similar to DASSL)
  • Compare the results of the reference solver with your fixed-step solver and check if you are fine with the difference.
  • If the results are similar enough, you can try to increase the step-size to a point where the difference gets too big (finetuning)

For both Options

Note that when you change the system's properties (poles) or input the above procedure(s) should be repeated - at least the validation part.