問題タブ [fmi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
2198 参照

python - PyFMI を使用した感度分析 - for ループの FMU

主な目標

地域暖房ネットワークの感度分析。

アプローチ

  1. AixLib および BuildingSystem ライブラリを使用したシステムの Modelica モデル (Dymola 内)

  2. モデルを FMU コシミュレーションとしてエクスポート

  3. SALib (感度分析 Python ライブラリ) を使用してサンプルを定義します (パラメーター スイープ)

  4. PyFMI を使用して、個々のサンプルすべてに対して Python の for ループでモデルを実行します (複数のプロセッサでシミュレーションを実行するために、JobLib を使用して for ループを並列化します)。

  5. 分散ベースの感度分析を実行する SALib ( http://salib.readthedocs.io/en/latest/basics.html#an-example )

最初の一歩

石神関数のシンプルなモデリカモデル (時間に依存しない)。この関数は、感度分析方法をテストするためによく使用されます ( https://www.sfu.ca/~ssurjano/ishigami.html )。

Python コード (PyFMI とパラメーター スイープを使用した FMU の読み込みを含む) は正常に動作します。

問題

一定量のシミュレーションの後、エラーが発生します。エラー出力は常に同じに見えるとは限りません。時々私たちは得る

FMUException: バイナリのロード中にエラーが発生しました。DLL を読み込めませんでした: Eine DLL-Initialisierungsroutine ist fehlgeschlagen.

翻訳: DLL 初期化ルーチンが失敗しました。

そして時々私たちは得る:

FMUException: バイナリのロード中にエラーが発生しました。DLL をロードできませんでした: Für diesen Befehl ist nicht genügend Speicher verfügbar.

翻訳:このコマンドに使用できる十分なメモリがありません。

このエラーは、約 650 回のシミュレーション実行後に発生します。これは、シミュレーションが次々と再実行される小さなループ ブロックで実行されるか、またはすべてのシミュレーションで 1 つの for ループが実行されるかに依存しません。Python コンソール/プロセスを再起動すると、新しいシミュレーションを再度実行できます。

作業環境:

Windows 10、Python 2.7、pip (JModelica ではない) を使用してインストールされた PyFMI、Jupyther ノートブック (Mozilla Firefox) での Python コーディング

Python と PyFMI の基本的な知識しかなく、このエラーに本当に苦労しています。

付属品

以下に見つけることができます

  • Dymola からコシミュレーション FMU をエクスポートするために使用される Modelica モデル (CVode を使用)

  • py ファイルとしての Python コード

  • Python コードの散布図を出力します。

ファイルを直接ダウンロードできる JModelica フォーラムにも投稿しました (FMU、Jupyter ノートブックなど): http://www.jmodelica.org/27925

モデリカモデル

Python コード

Python スクリプトからプロットを出力する ここに画像の説明を入力

アップデート

さらにいくつかのテストを行ったところ、次のことがわかりました。

FMU が Dymola と JModelica のどちらからエクスポートされたかによって、動作が異なります。

Dymola からエクスポートされた FMU を使用する:

  • load_fmuforループから行を取り出すとうまくいくようです
  • load_fmuforループにない場合でも、クラッシュすることがあります
  • コマンドが正常に動作するように見えるmodel.reset()前に新しい行を追加するmodel.set(...)
  • ある場合とない場合でシミュレートすると結果が異なる model.reset() -> なぜ??
  • model.instantiate()の代わりにmodel.reset()-> は機能しません。タスク マネージャーのメモリ使用量は最大で約 350 MB になり、その後

    FMUException: モデルのインスタンス化に失敗しました。詳細については、ログを参照してください。

log_level=4 のログ ファイル:

JModelica からエクスポートされた FMU を使用する:

私の質問:

FMU モデルを異なるパラメーターで何度もシミュレートするループを実行する正しい理由は何ですか?

model.reset()を使用する場合と使用しない場合の違いは何model.instatiate()ですか?

付属品

model.reset()これは、for ループがある場合とない場合 の違いを示すプロットです。ここに画像の説明を入力

JModelica からエクスポートされた FMU (ライセンスは必要ありません) は、http ://www.jmodelica.org/27925#comment-6668 からダウンロードできます。