Начальные предположения для нелинейных алгебраических уравнений - PullRequest
2 голосов
/ 29 марта 2019

У меня есть система нелинейных алгебраических уравнений для решения. Как я могу использовать вычисленные значения (с непрерывной изменчивостью во времени) в качестве начального предположения для переменных решения вместо использования параметров в качестве начальных значений? Можно ли использовать для этой цели начальную часть уравнения?

Я создал тестовую модель для объяснения проблемы:

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;

Намерение состоит в том, чтобы дать начальное предположение о «х» на основе некоторых расчетов. Как я могу добиться этого в openmodelica?

1 Ответ

1 голос
/ 01 апреля 2019

Насколько мне известно, атрибут 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() помогает (не уверен, что в других инструментах). Это приводит к «избыточным последовательным начальным условиям». с которым Димола может справиться. Чтобы уравнения были избыточными, они должны давать одинаковый результат. Следовательно, вы не можете использовать оценки для результата, как в исходном коде, поэтому я изменил их для второго примера.

Тем не менее оба решения кажутся мне несовершенными. Если есть другое решение, пожалуйста, добавьте его ...

...