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

Modelica 非线性代数方程的初始猜测,modelica,openmodelica,Modelica,Openmodelica,我有一个非线性代数方程组要解。如何使用计算值(具有连续时间可变性)作为解决方案变量的初始猜测,而不是使用参数作为起始值?初始方程部分是否可用于此目的 我创建了一个测试模型来解释这个问题: model Teststartvalue Real value1=1000;//calculated by some model Real value2=-1000;//calculated by some model parameter Real InputValue = 100;//Input

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

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

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;
模型测试起始值
实际价值1=1000//用某种模型计算
实际价值2=-1000//用某种模型计算
参数实输入值=100//模型输入
实际起始值=如果输入值<值2,则为1.8;如果输入值>值1,则为2.8,否则为0.5;
实x(起点=0.5);
//所需代码
//实x(开始=起始值);
方程式
(x-1)*(x-2)*(x-3)=0;
//x^3-(6*x^2)+(11*x)-6=0;
结束测试开始值;

目的是根据一些计算提供“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;
模型测试起始值
实际价值1=1000//用某种模型计算
实际价值2=-1000//用某种模型计算
参数实输入值=100//模型输入
最终参数真实起始值(固定=假);
实x(开始=起始值);
初始方程
起始值=如果输入值<值2,则为1.8;如果输入值>值1,则为2.8,否则为0.5;
方程式
(x-1)*(x-2)*(x-3)=0;
结束测试开始值;
不确定这是否适用于所有工具及其未来版本!事实上,我不认为这是打算用这种方式。此外,这可能会导致以后出现问题,因为通常假设参数是在模拟开始之前设置的,而不是在模拟初始化期间设置的

另一种选择是使用初始方程,该方程应给出如下内容:

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;
model TestStartValueInitEq
实际价值1=1000//用某种模型计算
实际价值2=2000//用某种模型计算
参数实输入值=100//模型输入
实x;
初始方程
如果输入值<值2,则
前(x)-2=0;
elseif InputValue>value1然后
前(x)-3=0;
其他的
前(x)-1=0;
如果结束;
方程式
(x-1)*(x-2)*(x-3)=0;
结束测试STARTVALUETINITEQ;
这种解决方案的缺点是,初始方程实际上用于设置状态变量的值。对于这些,初始值可以自由选择(或多或少),因为在初始化时没有方程确定它。这里的情况并非如此,它将在初始化过程中为
x
提供多个方程式,从而使模型停止运行。为了避免在Dymola中出现这种情况,
pre()
有帮助(不确定在其他工具中是否有)。这将导致“冗余一致初始条件”,Dymola可以处理这些条件。对于多余的方程,它们需要给出相同的结果。因此,您不能像在原始代码中那样对结果使用估计值,这就是为什么我在第二个示例中更改了它们


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

欢迎使用堆栈溢出。你的问题太笼统,人们无法给你好的答案。请查看此指南,了解并包括。如果您能够展示您迄今为止所做的尝试以及为什么不起作用,这将非常有用。一个其他人可以轻松复制的最小示例也很有帮助。包括问题中的代码。感谢黑客。“TestStartValueInitEq”模型在Openmodelica中不起作用TestStartValue解决了这个问题。