非线性代数方程的初始猜测
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."。对于冗余的方程式,它们需要给出相同的结果。因此,您不能像在原始代码中那样使用结果的估计值,这就是为什么我在第二个示例中更改了它们。
这两种解决方案对我来说似乎都不完美。如果有其他解决办法欢迎补充...
我有一个非线性代数方程组要求解。我如何使用计算值(具有连续时间可变性)作为解变量的初始猜测而不是使用参数作为起始值?初始方程部分可以用于此目的吗?
我已经创建了一个测试模型来解释这个问题:
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."。对于冗余的方程式,它们需要给出相同的结果。因此,您不能像在原始代码中那样使用结果的估计值,这就是为什么我在第二个示例中更改了它们。
这两种解决方案对我来说似乎都不完美。如果有其他解决办法欢迎补充...