問題タブ [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.
python - PyFMI を使用した感度分析 - for ループの FMU
主な目標
地域暖房ネットワークの感度分析。
アプローチ
AixLib および BuildingSystem ライブラリを使用したシステムの Modelica モデル (Dymola 内)
モデルを FMU コシミュレーションとしてエクスポート
SALib (感度分析 Python ライブラリ) を使用してサンプルを定義します (パラメーター スイープ)
PyFMI を使用して、個々のサンプルすべてに対して Python の for ループでモデルを実行します (複数のプロセッサでシミュレーションを実行するために、JobLib を使用して for ループを並列化します)。
分散ベースの感度分析を実行する 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 コード
アップデート
さらにいくつかのテストを行ったところ、次のことがわかりました。
FMU が Dymola と JModelica のどちらからエクスポートされたかによって、動作が異なります。
Dymola からエクスポートされた FMU を使用する:
load_fmu
forループから行を取り出すとうまくいくようですload_fmu
forループにない場合でも、クラッシュすることがあります- コマンドが正常に動作するように見える
model.reset()
前に新しい行を追加するmodel.set(...)
- ある場合とない場合でシミュレートすると結果が異なる
model.reset()
-> なぜ?? model.instantiate()
の代わりにmodel.reset()
-> は機能しません。タスク マネージャーのメモリ使用量は最大で約 350 MB になり、その後FMUException: モデルのインスタンス化に失敗しました。詳細については、ログを参照してください。
log_level=4 のログ ファイル:
JModelica からエクスポートされた FMU を使用する:
- が for ループ内にある場合でも正常に動作
load_fmu
します (ただし低速) - この経験は、5.4.2 章 ( http://www.jmodelica.org/api-docs/usersguide/2.1/ch05s04.html#d0e1854 )の JModelica ドキュメント内で与えられた例に対応していません
load_fmu
。 -ループ - コマンド
model.reset()
ormodel.instatiate()
は for ループ内で必要です (Dymola FMU とは対照的に) -> なぜ??
私の質問:
FMU モデルを異なるパラメーターで何度もシミュレートするループを実行する正しい理由は何ですか?
model.reset()
を使用する場合と使用しない場合の違いは何model.instatiate()
ですか?
付属品
model.reset()
これは、for ループがある場合とない場合
の違いを示すプロットです。
JModelica からエクスポートされた FMU (ライセンスは必要ありません) は、http ://www.jmodelica.org/27925#comment-6668 からダウンロードできます。