Решение статических уравнений (или их систем) - PullRequest
0 голосов
/ 07 февраля 2019

Я хотел сделать следующее в Modelica: в конкретной модели у меня есть несколько параметров h, и я хочу вывести из них некоторые независимые от времени значения k, решив ряд неявных уравнений между параметрами и другими значениями.Поскольку уравнения неявны по своей природе, я не могу просто назначить выражение, я скорее должен позволить решателю найти решение.

Поскольку параметры постоянны, я хочу иметь возможность решать уравнения только один раз в начале, до фактического интегрирования по времени остальной части системы (например, дифференциальное уравнение, которое содержит k в качестве коэффициента)имеет место.

Посмотрите следующий пример того, что я хотел бы иметь возможность написать:

model ConstantTest
  parameter Real h = 2;
  const Real k;
initial equation
  k*k=h; // just an example of an implicit equation, which in this simple case could also be written explicitly
end ConstantTest;

Но это не удалось, потому что «константа» в Modelica не только постоянна в том смысле,иметь исчезающую производную по времени, но она также уже неизменна во время решения начальных уравнений.Поэтому решатель жалуется, что не может решить исходное уравнение 0 = 2, потому что он предполагает, что k неизменно равно 0.

Конечно, я могу просто сделать переменную ka, но тогда я должен сказать решателюявно, что k имеет исчезающую производную по времени (что делает его практически «постоянным» в наивном физическом смысле):

model ConstantTest
  parameter Real h = 2;
  Real k;
initial equation
  k*k=h;
equation
  der(k) = 0;
end ConstantTest;

Это работает, но это несколько странно, потому что решатель должен решить тривиальное дифференциальное уравнениена каждом временном шаге, чтобы вообще ничего не делать с k.И это было бы пустой тратой вычислительных ресурсов.

Есть ли способ решить статические неявные уравнения с Modelica, не вводя «затраты времени на эволюцию»?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Я думаю, что лучший способ определить системы такого типа:

model ConstantTest
  parameter Real h = 2;
  Real k;
equation
  2*k=h;
end ConstantTest;

, которые OpenModelica поместит в начальный раздел и решит только один раз.Я бы посчитал поведение OpenModelica для вашей системы ошибкой, так как она решает независимое от времени уравнение несколько раз.

0 голосов
/ 07 февраля 2019

Полагаю, вы могли бы сделать это:

model ConstantTest
  parameter Real h = 2;
  parameter Real k(fixed=false);
initial equation
  k*k=h;
end ConstantTest;

k будет вычислено при инициализации.

...