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