在 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.2 在initial 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
运算符,不幸的是,这是我们正在尝试修复的已知错误。相关工单:
我也交叉链接了这个问题。
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
决定。
抱歉,这太啰嗦了,希望能帮到你!
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.2 在initial 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
运算符,不幸的是,这是我们正在尝试修复的已知错误。相关工单:
我也交叉链接了这个问题。
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
决定。
抱歉,这太啰嗦了,希望能帮到你!