5

Modelica のハイブリッド モデリング パラダイムに戸惑っています。イベントは便利な反面、避けなければならないものです。私の場合を説明しましょう:

1 年以上シミュレートされた近隣の複数の建物で構成される大規模なモデルがあります。最初、モデルの実行は非常に遅くなりました。できるだけ多くの if 条件の周りに noEvent() を追加すると、速度が大幅に向上しました。

開発が進むにつれて、モデルの制御がより複雑になり、非常に短い間隔で、多くのイベントが再び発生するようになりました。アイデアを与えるには:

Number of (model) time events : 28170
Number of (U) time events     : 0
Number of state    events     : 22572
Number of step     events     : 0

これらのイベントは出力を爆発させ (正しい後処理のためにイベントで変数が必要です)、シミュレーションを遅くします。さらに、一部の noEvent(if...) が予期しない動作につながるような気がします。

特定の時間ステップでイベントを強制し、これらの時間ステップの間でそれらを禁止することは解決策になるのでしょうか? 理想的には、特定の条件に基づいてこれらの「強制イベント」をトリガーしたいと考えています。例: 日中は 15 分ごとに、毎分高い日射量で、夜間はイベントがまったく必要ありません。

これは良い考えですか?状態イベントの多くが時間イベントになるので、これはより高速になると思いますか? これは Modelica 3.2 (Dymola) でどのように行うことができますか?

すべての回答に感謝します。ロエル

4

1 に答える 1

6

いくつかのコメント。

まず、(シミュレーションの合計時間に対して)多くのイベントを含むシミュレーションがある場合、最初に行うことをお勧めするのは、低次の積分器を使用することです。ここでのポイントは、高次の積分器では通常、より長い時間ステップをとることができるということです。しかし、これらのステップがイベントによって絶えず切り捨てられる場合、それらは本当に高価になるだけです。

次に、固定ステップのインテグレータを試すことができます。ツールによっては、固定時間ステップインテグレーターのコンテキストで、この種の「プールイベントとそれらすべてを一度に起動する」種類のアプローチを実装する場合があります。ただし、この仕様では、固定された時間ステップの間に発生するイベントをツールがどのように処理するかについては何も述べられていません。

第三に、これにアプローチする別の方法は、自分でイベントを「プール」することです。これを行うことを想像できる最も簡単な方法は、現在イベントを生成しているすべてのステートメントを取得し、それらを「when sample(...、...)then」ステートメントでラップすることです。このようにして、イベントが特定の間隔でのみトリガーされるようにすることができます。これは、固定タイムステップアプローチよりも移植性が高くなります。これはあなたが実際に質問で提案したものだと思いますが、時間ステップ(モデルには時間ステップの概念がありません)ではなく、モデルで指定されたサンプリング間隔( 、実際には、時間ステップから完全に独立している)。

ご指摘のとおり、「sample(...、...)」を使用すると、これらがタイムイベントに変換され、はい、これはより高速になるはずです。

于 2012-11-16T19:39:35.237 に答える