我在 Dymola 中建立了一个简单的模型,在不同时期使用不同的方程,但令我惊讶的是 Dymola 无法处理这个简单的模型。索引减少后,系统似乎是奇异的。
我的问题是:
x=100时der(x)=0,模型工作正常,但我想知道是否有适用于更复杂情况的通用规则。如果提供详细的解释,我将不胜感激。这是模型的代码:
model ErrorWhenUsingIf
Real x(start=100);
equation
if time<=0.5 then
x=100;
else
der(x)=5;
end if;
end ErrorWhenUsingIf;
Run Code Online (Sandbox Code Playgroud)
错误信息是:
Failed to evaluate model for ODE-Jacobian
Error: The following error was detected at time: 7.62939453125E-012
Error: Singular inconsistent scalar system for der(x) = ( -(if time <= 0.5 then x-100 else -5.0))/((if time <= 0.5 then 0.0 else 1.0)) = 8e-008/0
Solver will attempt to handle this problem.
Failed to evaluate model for ODE-Jacobian
Run Code Online (Sandbox Code Playgroud)
给定的模型不遵循以下常见的典型直接方法来实现可模拟/可编译的 Modelica 模型的当前规则之一:
模型在整个模拟过程中不应改变其差分指数
Modelica 语言规范指南的实际版本并没有明确阻止实现这些模型,并且没有什么可以反对实现这一点的。
普通的仿真环境显然不会仿真这么简单的模型,除非明确声明允许多模式的 DAE。
现在详细介绍一下,差异指数非正式地对应于状态变量之间隐式/显式依赖性的固有程度。在整个模拟过程中,差异指数可以通过两种方式改变,一种是结构方式,一种是数值方式。
在结构上,模型(类似于给定的模型)是根据方程系统的几个分支来表示的。每个分支对应不同的差分索引。在给定的模型中,一个分支对应一个线性方程,而另一个对应一个微分方程。结构分析的典型实现将揭示模型对应于 ODE 系统(第一个分支不是这样)。我的猜测是将线性方程提交给 ODE 求解器。如果我们在 if 条件之外添加一个虚拟微分方程,例如der(z) = -1,系统将被模拟,因为结构分析是偶然(半)正确的。
如果我们在不同的分支中处理更高索引的 DAE,我们可能会得到一个数值不精确的解决方案,因为索引减少不是针对每个可能的分支单独进行的。将求解器应用于非简化 DAE 可能会导致数值解出现草图,因为在传递给求解器的结果简化方程中没有明确显示隐式代数方程。
在数值方法中,有些情况下模型参数的不同值会导致不同的微分指数(想想一个参数值将复杂的方程变为简单的方程)。类似地,差分索引可能会在模拟运行时更改其值。使用处理高指数微分方程的常用方法很难捕捉到这种类型。
结构指数:常见的方法是使用 sc 结构指数来近似微分指数:它是方程系统的基于图形的表示,可以从中近似出微分指数。ODE 系统的结构指数为 0,而非微分方程系统的结构指数为 -1。指数缩减是使用 Pantelides 算法和虚拟导数方法的组合进行的,参见。相关文献。这种基于图形的方法无法捕捉模拟过程中不同的差异指数或不同参数值的变化的数值方面。
由这两种类型产生的多模式 DAE受到积极研究的影响,并且已经有关于多模式 DAE 的新出版物,参见。Hilding Elmqvist 在 Modelica 会议和期刊上发表的论文以及其他与多模式 DAE 相关的出版物(作为说明,我没有确定关于该主题的最佳出版物)。
如果要遵循通用角色,那么模型的所有分支都应该具有相同的结构指数(理想情况下在模拟期间具有相同的差异指数)。在前者中,对于小模型,建模者可以很容易地近似结构指数。对于大型模型,如果仿真环境可以转储关于给定模型的基于图的结构(即计算图)、其差分索引等信息,则是有益的。在后一种类型中,建模者难以捕捉到这一点。如果模拟环境可以转储有关数值变化的差分指数的此类信息,则是理想的。
| 归档时间: |
|
| 查看次数: |
165 次 |
| 最近记录: |