modelica: calcula o mínimo / máximo da variável contínua ao longo do tempo
Como afirmado acima: desejo calcular o mínimo (e / ou máximo) de uma variável contínua ao longo do tempo. Aqui está um exemplo mínimo para demonstrar:
model MinMaxTest
Real u;
Real u_min(start = 10);
Real u_max(start = -10);
equation
u = sin(time / 180 * Modelica.Constants.pi);
u_min = min(u, u_min);
u_max = max(u, u_max);
annotation(experiment(StartTime = 0, StopTime = 360, Tolerance = 1e-06, Interval = 1));
end MinMaxTest;
u
é a variável contínua arbitrária (para fins de demonstração, uma simples onda sinusal).u_min
/u_max
é o mínimo / máximo ao longo do tempo.
Obviamente, o resultado esperado éu_min=-1
eu_max=1
. Infelizmente, a simulação trava com um "Matrix singular!" erro. Alguém pode me indicar como evitar isso?
Estou usando o OpenModelica 1.15 (era 1.9.2)
EDIT 2Como sou bastante novo no Modelica, estou lutando para entender as diferenças entre as seguintes abordagens:
u_min = if noEvent(u < u_min) then u else pre(u_min);
if noEvent(u < u_min) then u_min = u; else u_min = pre(u_min); end if;
u_min = if noEvent(u < u_min) then u else u_min;
u_min = if u < u_min then u else pre(u_min);
u_min = if u < u_min then u else u_min;
when u < u_min then u_min = u; end when;
u_min + T*der(u_min) = if u <= u_min then u else u_min;
1 e 2 são equivalentes e resultam no comportamento esperado.
3 produz o resultado desejado, mas fornece uma "notificação de tradução" sobre um "loop algébrico", por que?
4 falha até agora, que o resultadou_min
curva é idêntica au
?! porque?
5 combina 3 e 4.
6 falha ao compilar comSorry - Support for Discrete Equation Systems is not yet implemented
7 Não estou claro qual é a ideia por trás disso, mas funciona seT
é do tamanho sugerido.
Se estou entendendo a documentação do Modelica corretamente, de 1 a 5 têm em comum que exatamente uma equação está ativa o tempo todo.noEvent
suprime a geração de eventos no cruzamento zero especificado. Tive a impressão de que isso é principalmente uma melhoria de eficiência. Por que deixar de fora faz com que 4 falhem?pre
refere-se ao valor anterior da variável, então acho que faz sentido se queremos manter uma variável constante, mas por que o 7 funciona sem ela? Meu entendimento dewhen
foi, que sua equação é apenas ativa nesse evento preciso e, caso contráriomantém o valor anterior, e foi por isso que tentei usá-lo em 6. Parece funcionar se comparar com valores constantes (que não servem para esse problema em particular).
u_min = smooth(0, if u < u_min then u else pre(u_min));
Curiosamente, isso funciona também.