我有一个非线性代数方程组需要求解。如何使用计算值(具有连续时间变化)作为解变量的初始猜测,而不是使用参数作为起始值?初始方程部分可以用于此目的吗?
我创建了一个测试模型来解释这个问题:
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
and
- 计算初始方程中的值
这将导致:
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 可以处理。为了使方程冗余,它们需要给出相同的结果。因此,您不能像原始代码中那样使用结果估计值,这就是我在第二个示例中更改它们的原因。
不过,这两种解决方案对我来说似乎都不完美。如果还有其他解决方案请补充...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)