Как заставить logi c избегать дискретной производной в предложении when в Modelica? - PullRequest
0 голосов
/ 03 марта 2020

Я делаю логику c, вычисляя p (давление) двигателя внутреннего сгорания. Уравнения состоят из нескольких случаев, называемых «Период» в предложении when.

  when Period==1 then
    p = pre(p) * ( T / pre(T)) ^( Gamma/(Gamma-1));
  elsewhen Period==0 or Period==2 or Period==3 then
    p = ( m*R_gas*der(T)+m*T*der(R_gas)+R_gas*T*der(m)-V*der(p) ) / der(V);
  end when;

единственная неизвестная переменная в коде - это p, и я получил сообщения об ошибках, подобные ниже

enter image description here

В сообщении говорится, что уравнение p является дискретным и не может быть дифференцировано.

Но я подумал, что это не дискретные уравнения. Несмотря на то, что это дискретные уравнения, я не ожидаю ошибки, потому что часть der (p) есть только во втором предложении.

Как я могу решить эту проблему?

1 Ответ

2 голосов
/ 03 марта 2020

Можете ли вы объяснить, какое поведение вы хотите?

1-е уравнение

  when Period==1 then
    p = pre(p) * ( T / pre(T)) ^( Gamma/(Gamma-1));

работает само по себе, но 2-е уравнение, приведенное выше для p, будет активным только тогда, когда Period становится 0, 2 или 3. Это всего лишь один момент времени, поэтому я не могу понять, что должно быть der (p) в этой правой части.

Дополнительно, если уравнение включает в себя как p, так и der(p), уравнение обычно решается для вычисления der(p) на основе p, но я не уверен, является ли это целью здесь.

Добавлено: Ваши комментарии кажутся укажите, что вы хотите, чтобы уравнение было действительным, в то время как Period получает новое значение, а не только в экземпляре. В Modelica when для уравнений, которые должны быть действительными только один раз, когда условие становится истинным, а if для уравнений, которые действительны, когда условие выполняется.

Это может привести к чему-то вроде:

  if Period==1 then
    ...
  else
    p = ( m*R_gas*der(T)+m*T*der(R_gas)+R_gas*T*der(m)-V*der(p) ) / der(V);
  end if;

Однако первое уравнение в этом случае проблематично c. Я предполагаю, что вы хотите, чтобы x=T^(Gamma/(Gamma-1))/p оставался постоянным в этой части, и, к сожалению, запись, которая напрямую привела бы к изменению индекса, который в настоящее время не поддерживается в Modelica.

Однако альтернативой является сказать, что он имеет нулевую производную и это дало бы что-то вроде:

  x=T^(Gamma/(Gamma-1))/p;
  if Period==1 then
    der(x)=0;
  else
    p = ( m*R_gas*der(T)+m*T*der(R_gas)+R_gas*T*der(m)-V*der(p) ) / der(V);
  end if;

Но нет уверенности, что это будет работать, так как я не видел всю модель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...