Можете ли вы объяснить, какое поведение вы хотите?
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;
Но нет уверенности, что это будет работать, так как я не видел всю модель.