diferença entre 'quando' e 'se' no OpenModelica?
-
21-12-2019 - |
Pergunta
Sou novo no OpenModelica e tenho algumas perguntas sobre o código 'BouncingBall.mo' que é distribuído com o software como código de exemplo.
1) qual é a diferença entre 'quando' e 'se'?
2) qual é o propósito da variável 'foo' no código?
3)na linha(15) - "quando {h <= 0,0 e v <= 0,0, impacto}",, a expressão para 'quando' ser suficiente como "{h <= 0,0 e v <= 0,0}" porque isso se torna verdadeiro quando ocorre o impacto, qual é o propósito impacto(para mim é redundante aqui) e o que significa a vírgula (,) antes impacto significa?
model BouncingBall
parameter Real e = 0.7 "coefficient of restitution";
parameter Real g = 9.81 "gravity acceleration";
Real h(start = 1) "height of ball";
Real v "velocity of ball";
Boolean flying(start = true) "true, if ball is flying";
Boolean impact;
Real v_new;
Integer foo;
equation
impact = h <= 0.0;
foo = if impact then 1 else 2;
der(v) = if flying then -g else 0;
der(h) = v;
when {h <= 0.0 and v <= 0.0,impact} then
v_new = if edge(impact) then -e * pre(v) else 0;
flying = v_new > 0;
reinit(v, v_new);
end when;
end BouncingBall;
Solução
OK, são algumas perguntas.Deixe-me tentar respondê-las:
Qual é a diferença entre
when
eif
.As perguntas dentro de um
when
cláusula só são "ativas" no instante em que as expressões condicionais usadas nawhen
cláusula torna-se ativa.Em contraste, equações dentro de umif
afirmação é verdadeira enquanto a expressão condicional permanecer verdadeira.Qual é o propósito de
foo
?Provavelmente para visualização.Não tem um impacto claro no modelo que posso ver.
Por que é
impact
listado nowhen
cláusula.Um dos problemas que você tem é o chamado Sistemas Zeno como este é que ele continuará a saltar indefinidamente com intervalos cada vez menores.Eu suspeito que
impact
flag aqui serve para indicar quando o sistema parou de saltar.Isso normalmente é feito verificando se a expressão condicionalh<=0.0
realmente se torna falso em algum ponto.Como a detecção de eventos inclui tolerância numérica, em algum momento a altura dos saltos nunca sai da faixa de tolerância e você precisa detectar isso ou a bola nunca mais quicará e continuará a cair.(é difícil explicar sem realmente executar a simulação e ver o efeito).O que faz o
,
fazer nowhen
cláusula.Considere o seguinte:
when {a, b} then
.A questão é que, se você quiser ter umwhen
a cláusula é acionada quandoa
oub
se tornar realidade, você pode pensar que vai escrevê-lo comowhen a or b then
.Mas isso não está correto porque só será acionado quando o primeiro um se torna verdadeiro.Para ver isso melhor, considere este código:
a = time>1.0; b = time>2.0; when {a, b} then // Equation set 1 end when; when a or b then // Equation set 2 end when;
Então o conjunto de equações 1 será executado duas vezes aqui porque ele será executado quando a
se torna verdade e novamente quando b
se torna verdade.Mas o conjunto de equações 2 só será executado uma vez quando a
se torna verdade.Isso porque toda a expressão a or b
só se torna verdade em um instante.
Esses são pontos comuns de confusão sobre when
.Esperamos que essas explicações ajudem.