在 OpenModelica 中保存开始/初始猜测值并从文件中实现初始值

Save start / initial guess values in OpenModelica & implement initial values from file

Dymola "Save start values in the model" 中有一个选项,允许重新使用这些参数以调整模拟。

我在 OpenModelica 中寻找类似的可能性,但到目前为止我无法弄清楚。特别是,我正在使用 ThermoSysPro 构建模型,它对初始值的变化相当敏感。我的模型有几个垂直管道(上游、下游),所以很容易失败。

1.是否可以在 OpenModelica 中保存初始/开始/猜测值?

2。在模型中实施/采用这些值的方法是什么? (假设我有密度 - ρ,焓 - h,温度 - T 等等。只是为了简化 Modelica 新手的目的)

------更新------

就我而言,我有两种开始/初始值的方法: (ThermoSysPro - TSP)

方法 1 - 运行 1s 的模拟,不改变 TSP 中给出的默认起始值​​,通过引入所需的边界条件或关闭它会 运行 成功。

收集生成的初始值并将它们添加为起始值(当一个组件有很多时很耗时)。

对于 “体积” 等组件或任何其他未离散化的组件,在 “初始化”[=95] 下给出这些值就足够了=] 组件中的部分或 “文本视图” window 例如Q(start = 0.3); P(start = xxx)

但是对于离散化的组件,例如“管道”,必须通过“文本视图”使用运算符 each 例如Q(each start = 0.3)。但是,通过“图表视图”更改组件的任何参数时,运算符“each”都会消失,因此必须按如下方式给出:

•   Q(start = {0.3 for i in 1:componentName.Ns+1}) 
•   Q(start = fill(0.3, componentName.Ns+1))
•   Q(start = {x1, x2, x3, x4, … xi})

Ns + 1 - 对于水力节点/Ns – 对于热力节点

问题

P.1.1 - 通常应该这样写:

Q(start = fill(0.3, Ns+1), fixed = fill(true/false, Ns+1)) 

但这与运算符 each 的情况相同,通过 “图表视图” 更改组件的任何参数后,属性 fixed尽管需要数组,但会自动更改为 fixed=false。我尝试创建一个布尔参数并使用数组理解,但我总是得到相同的结果。 有什么建议或解决方法吗?

P.1.2 – 在调整生成的起始值而不是使用默认值后,我看不到模拟有任何改进(加速/更好的结果/或其他) .也,在适应了太多之后,我开始遇到初始化问题——这应该与我的理解相反。所以,我不确定我应该如何 using/declaring 开始值正确?也许问题是我没有明确添加fixed = true/false

方法 2 – 使用 Modelica 函数根据边界条件计算起始值。所以首先,我计算多个参数的起始值(通常我计算压力和焓)。例如

parameter Modelica.SIunits.Enthalpy init_enthalpy[Ns+1] = {Modelica.Media.Water.WaterIF97_base.specificEnthalpy_pT(P[i], T) for i in 1:Ns+1}

然后为特定组件添加它:

h(start = init_enthalpy)

问题:

P2.1 对于 ThermoPower 库,这种方法非常有效,但对于 ThermoSysPro ,我遇到了困难,因为可以为初始化提供的参数太多了。一般应该给出多少个参数,或者如何定位最重要的那些绝对应该给出的参数?

P2.2initial equation部分声明start / initial values和计算为有区别吗parameter(如上)?

P2.3 通过指示起始值是 fixed=true / false 并不意味着您正在使用所谓的 "inverse problem"?

我不知道自动保存初始值的选项是否可用,但通常您可以使用初始方程设置变量的初始值,或者您可以更改变量的开始属性。如果它是一个状态,您必须将 fixed 属性设置为 true 以便将其视为初始化。

model test
  Real a(start=10, fixed=true);
  Real b;
initial equation
  b = 20;
equation
  der(a) = cos(time);
  der(b) = sin(time);
end test;

非线性系统的非线性迭代变量和离散变量也需要有起始值。

P1.1 关于缺失的 each 运算符,不幸的是,这是我们正在尝试修复的已知错误。相关工单:

trac.openmodelica - #5737

我也交叉链接了这个问题。

P1.2 起始值并不能真正加快模拟速度,只能(稍微)加快初始化速度。如果您不提供任何内容,编译器会将它们设置为零并从那里开始。这可能会导致多个问题:

  • 你实际上没有模拟你认为你会的系统
  • 非线性系统的迭代求解器(牛顿)在初始化期间收敛到错误的解或根本不收敛
  • 意外除以零
  • 不可解析的欠约束初始系统

如果您提供许多初始值,您可能会导致别名冲突或过度约束系统。如果您有一个方程 a=b 并为两者提供起始值,则它们必须相等。您提供的起始值将始终覆盖原始模型中的起始值,但不会导致别名冲突。如果您有冲突,编译器会在选项之间任意选择(一些非常基本的启发式)。

方法 2 不幸的是我不是工程师所以我不知道这是否是正确的方法,但总的来说这似乎不错。

P2.1 大多数情况下,库中的默认初始值都很好,如果你想做一些不同的事情,你只需要专门设置它们。例如。锅炉以更高的温度或类似的温度启动。

如果您想获得完整信息,请使用:Simulation -> Simulation Setup -> Translation Flags 字段 Additional Translation Flags。放:-d=backenddaeinfo,stateselection,discreteinfo,iterationVars

我为 Modelica.Electrical.Analog.Examples.Rectifier 做了这个,这是输出:

[1] 11:25:25 Symbolic Notification
Model statistics after passing the front-end and creating the data structures used by the back-end:
 * Number of equations: 128
 * Number of variables: 128

[2] 11:25:25 Translation Notification
List of all iteration variables (DAE kind: initialization)
Iteration variables of torn nonlinear equation system:
  IdealDiode6.s:VARIABLE(start = 0.0 unit = "1" protected = true )  "Auxiliary variable for actual position on the ideal diode characteristic" type: Real
  IdealDiode3.s:VARIABLE(start = 0.0 unit = "1" protected = true )  "Auxiliary variable for actual position on the ideal diode characteristic" type: Real
Iteration variables of torn nonlinear equation system:
  IdealDiode5.s:VARIABLE(start = 0.0 unit = "1" protected = true )  "Auxiliary variable for actual position on the ideal diode characteristic" type: Real
  IdealDiode2.s:VARIABLE(start = 0.0 unit = "1" protected = true )  "Auxiliary variable for actual position on the ideal diode characteristic" type: Real
Iteration variables of torn nonlinear equation system:
  IdealDiode1.s:VARIABLE(start = 0.0 unit = "1" protected = true )  "Auxiliary variable for actual position on the ideal diode characteristic" type: Real
  IdealDiode4.s:VARIABLE(start = 0.0 unit = "1" protected = true )  "Auxiliary variable for actual position on the ideal diode characteristic" type: Real
Iteration variables of torn linear equation system:
  SineVoltage1.n.v:VARIABLE(flow=false unit = "V" )  "Potential at the pin" type: Real

[3] 11:25:25 Symbolic Notification
Model statistics after passing the back-end for initialization:
 * Number of independent subsystems: 2
 * Number of states: 0 ()
 * Number of discrete variables: 6 (IdealDiode1.off,IdealDiode2.off,IdealDiode3.off,IdealDiode4.off,IdealDiode5.off,IdealDiode6.off)
 * Number of discrete states: 0 ()
 * Top-level inputs: 0

[4] 11:25:25 Symbolic Notification
Strong component statistics for initialization (33):
 * Single equations (assignments): 29
 * Array equations: 0
 * Algorithm blocks: 0
 * Record equations: 0
 * When equations: 0
 * If-equations: 0
 * Equation systems (linear and non-linear blocks): 0
 * Torn equation systems: 4
 * Mixed (continuous/discrete) equation systems: 0

[5] 11:25:25 Symbolic Notification
Model statistics after passing the back-end for simulation:
 * Number of independent subsystems: 1
 * Number of states: 4 (Inductor2.i,Inductor3.i,Capacitor1.v,Capacitor2.v)
 * Number of discrete variables: 6 (IdealDiode1.off,IdealDiode2.off,IdealDiode3.off,IdealDiode4.off,IdealDiode5.off,IdealDiode6.off)
 * Number of discrete states: 0 ()
 * Top-level inputs: 0

[6] 11:25:25 Symbolic Notification
Strong component statistics for simulation (28):
 * Single equations (assignments): 24
 * Array equations: 0
 * Algorithm blocks: 0
 * Record equations: 0
 * When equations: 0
 * If-equations: 0
 * Equation systems (linear and non-linear blocks): 0
 * Torn equation systems: 4
 * Mixed (continuous/discrete) equation systems: 0

[7] 11:25:25 Symbolic Notification
Torn system details for strict tearing set:
 * Linear torn systems: 1 {(1,100.0%) 9}
 * Non-linear torn systems: 3 {2 7,2 7,2 7}

[8] 11:25:25 Translation Notification
List of all iteration variables (DAE kind: simulation)
Iteration variables of torn nonlinear equation system:
  IdealDiode2.s:VARIABLE(start = 0.0 unit = "1" protected = true )  "Auxiliary variable for actual position on the ideal diode characteristic" type: Real
  IdealDiode5.s:VARIABLE(start = 0.0 unit = "1" protected = true )  "Auxiliary variable for actual position on the ideal diode characteristic" type: Real
Iteration variables of torn nonlinear equation system:
  IdealDiode6.s:VARIABLE(start = 0.0 unit = "1" protected = true )  "Auxiliary variable for actual position on the ideal diode characteristic" type: Real
  IdealDiode3.s:VARIABLE(start = 0.0 unit = "1" protected = true )  "Auxiliary variable for actual position on the ideal diode characteristic" type: Real
Iteration variables of torn nonlinear equation system:
  IdealDiode1.s:VARIABLE(start = 0.0 unit = "1" protected = true )  "Auxiliary variable for actual position on the ideal diode characteristic" type: Real
  IdealDiode4.s:VARIABLE(start = 0.0 unit = "1" protected = true )  "Auxiliary variable for actual position on the ideal diode characteristic" type: Real
Iteration variables of torn linear equation system:
  SineVoltage1.n.v:VARIABLE(flow=false unit = "V" )  "Potential at the pin" type: Real

在[2]下可以看到需要有起始值的迭代变量。在 [3] 中,您可以看到需要具有起始值或在系统中明确定义的离散变量(例如,如果您使用 when 条件来切换它们,它们需要具有起始值。布尔值默认值:false)。在 [5] 中,您可以看到所选择的状态,它们需要起始值并且需要固定(您也可以为它们的导数提供初始方程,例如稳态初始化)。

P2.2 起始值可以作为迭代变量的初始值(牛顿求解器必须)。对于州,除非您设置 fixed=true,否则它们不会总是被使用,fixed=false 是默认值。初始方程始终是初始系统的一部分。对于计算参数,无论您将该参数用作起始值还是用于初始方程式,都适用相同的规则。

P2.3 不幸的是,我不太清楚你所说的 逆问题 是什么意思。正如我所提到的,您可以为状态导数而不是状态提供初始方程,这也行得通(也许这就是您在这里暗示的意思?)。 fixed=false 是默认的,说明这一点的选项是撤销在较低级别或使用的库中做出的 fixed=true 决定。

抱歉,这太啰嗦了,希望能帮到你!