Domanda

Sono nuovo su OpenModelica e ho alcune domande riguardanti il ​​codice di "BouncingBall.mo" che è distribuito con il software come codice di esempio.

1) qual è la differenza tra 'Quando' E 'Se'?

2) qual è lo scopo della variabile 'pippo' nel codice?

3)in linea(15) - "quando {h <= 0,0 e v <= 0,0,impatto}",, non dovrebbe essere l'espressione for 'Quando' essere sufficiente come "{h <= 0,0 e v <= 0,0}" perché questo diventa VERO quando si verifica l'impatto, qual è lo scopo impatto(per me è ridondante qui) e cosa significa la virgola(,) Prima impatto 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;
È stato utile?

Soluzione

OK, sono parecchie domande.Provo a rispondere:

  1. Qual è la differenza tra when E if.

    Le domande all'interno di a when sono "attive" solo nel momento in cui le espressioni condizionali utilizzate nel file when la clausola diventa attiva.Al contrario, le equazioni all'interno di an if sono vere finché l'espressione condizionale rimane vera.

  2. Qual è lo scopo foo?

    Probabilmente per la visualizzazione.Non ha alcun impatto chiaro sul modello che posso vedere.

  3. Perché è impact elencato nel when clausola.

    Uno dei problemi che hai cosiddetto I sistemi Zeno come questo è che continuerà a rimbalzare indefinitamente con intervalli sempre più piccoli.Sospetto che impact flag qui ha lo scopo di indicare quando il sistema ha smesso di rimbalzare.Questo viene normalmente fatto controllando per assicurarsi che l'espressione condizionale h<=0.0 diventa effettivamente falso ad un certo punto.Poiché il rilevamento degli eventi include la tolleranza numerica, a un certo punto l'altezza dei rimbalzi non esce mai dall'intervallo di tolleranza ed è necessario rilevarlo, altrimenti la palla non rimbalzerà mai più e continuerà a cadere.(è difficile da spiegare senza eseguire effettivamente la simulazione e vedere l'effetto).

  4. Cosa fa il , fare nel when clausola.

    Considera quanto segue: when {a, b} then.Il fatto è che, se vuoi avere un file when la clausola si attiva quando uno dei due a O b diventare realtà, potresti pensare di scriverlo come when a or b then.Ma questo non è corretto perché si attiverà solo quando il file Primo uno diventa vero.Per vederlo meglio, considera questo codice:

    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;

Quindi il set di equazioni 1 verrà eseguito due volte qui perché verrà eseguito quando a diventa vero e poi di nuovo quando b diventa vero.Ma il set di equazioni 2 verrà eseguito solo una volta Quando a diventa vero.Questo perché l'intera espressione a or b diventa vero solo in un istante.

Questi sono punti comuni di confusione su when.Speriamo che queste spiegazioni aiutino.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top