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

Initial guesses for nonlinear algebraic eqtns

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

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

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 中实现这一点?

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

  • 将用于起始值(在您的示例中为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;

此解决方案的缺点是,初始方程实际上旨在设置状态变量的值。对于这些,初始值可以自由选择(或多或少),因为在初始化时没有确定它的方程式。这不是这里的情况,它将在初始化期间给出 x 的多个方程式,这将制动模型。为了在 Dymola 中避免这种情况,pre() 会有所帮助(不确定在其他工具中是否如此)。这会导致 Dymola 可以处理的 "Redundant consistent initial conditions."。对于冗余的方程式,它们需要给出相同的结果。因此,您不能像在原始代码中那样使用结果的估计值,这就是为什么我在第二个示例中更改了它们。

这两种解决方案对我来说似乎都不完美。如果有其他解决办法欢迎补充...