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;
Foi útil?

Solução

OK, são algumas perguntas.Deixe-me tentar respondê-las:

  1. Qual é a diferença entre when e if.

    As perguntas dentro de um when cláusula só são "ativas" no instante em que as expressões condicionais usadas na when cláusula torna-se ativa.Em contraste, equações dentro de um if afirmação é verdadeira enquanto a expressão condicional permanecer verdadeira.

  2. Qual é o propósito de foo?

    Provavelmente para visualização.Não tem um impacto claro no modelo que posso ver.

  3. Por que é impact listado no when 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 condicional h<=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).

  4. O que faz o , fazer no when cláusula.

    Considere o seguinte: when {a, b} then.A questão é que, se você quiser ter um when a cláusula é acionada quando a ou b se tornar realidade, você pode pensar que vai escrevê-lo como when 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top