非线性代数方程的初步猜测

时间:2019-03-29 12:01:31

标签: modelica openmodelica

我有一个要求解的非线性代数方程组。如何使用计算值(具有连续时间可变性)作为解决方案变量的初始猜测,而不是使用参数作为初始值?初始方程部分可以用于此目的吗?

我创建了一个测试模型来解释该问题:

model Teststartvalue
  Real value1=1000;//calculated by some model
  Real value2=-1000;//calculated by some model
  parameter Real InputValue = 100;//Input to model
  Real StartValue=if InputValue < value2 then 1.8 elseif InputValue > value1 then 2.8 else 0.5;
  Real x(start=0.5);
//Desired code
//  Real x(start=StartValue);
equation
  (x-1)*(x-2)*(x-3)=0;
//  x^3-(6*x^2)+(11*x)-6=0;
end Teststartvalue;

目的是基于一些计算来提供对“ x”的初始猜测。如何在openmodelica中实现这一目标?

1 个答案:

答案 0 :(得分:1)

据我所知,start属性只能采用具有常数或参数可变性的表达式(请参见Modelica规范3.4第3.8节)。因此,我想到的唯一真正的解决方案是一点技巧:

  • 将用于起始值(在您的示例中为Start on a fresh line Hit tab twice, type up the content Your content should appear in a box )的参数的固定属性设置为StartValue
  • 计算初始方程式中的值

这将导致:

false

不确定这将在所有工具及其将来版本中都适用!我实际上不打算将这种方式使用。这也可能导致以后出现问题,因为通常假定在仿真开始之前而不是在初始化期间设置参数。

另一种选择是使用初始方程式,该方程式应为:

model TestStartValue
  Real value1=1000;//calculated by some model
  Real value2=-1000;//calculated by some model
  parameter Real InputValue = 100;//Input to model
  final parameter Real StartValue(fixed=false);
  Real x(start=StartValue);

initial equation 
  StartValue=if InputValue < value2 then 1.8 elseif InputValue > value1 then 2.8 else 0.5;

equation 
  (x-1)*(x-2)*(x-3)=0;
end TestStartValue;

该解决方案的缺点是,实际上需要使用一个初始方程式来设置状态变量的值。对于这些,初始值可以自由选择(或多或少),因为在初始化时没有方程式可以确定初始值。这里不是这种情况,它将在初始化期间给出model TestStartValueInitEq Real value1=1000;//calculated by some model Real value2=2000;//calculated by some model parameter Real InputValue = 100;//Input to model Real x; initial equation if InputValue < value2 then pre(x)-2=0; elseif InputValue > value1 then pre(x)-3=0; else pre(x)-1=0; end if; equation (x-1)*(x-2)*(x-3)=0; end TestStartValueInitEq; 的多个方程式,这将使模型失效。为了在Dymola中避免这种情况,x可以提供帮助(不确定在其他工具中是否可以做到)。然后,这导致“冗余一致的初始条件”。 Dymola可以处理的。为了使方程式多余,它们需要给出相同的结果。因此,您不能像原始代码那样使用估算值,这就是为什么我在第二个示例中更改了估算值的原因。

对我来说,这两种解决方案似乎都不完美。如果还有其他解决方案,请添加...