Modelicaで最適化を試す
Modelicaで最適化(動的計画法)を行う場合いくつか選択肢がある
詳細はこちら
https://qiita.com/UedaShigenori/items/aae444326b28ccc8b20f
本稿ではOpenModelicaのOptimizationクラスを使用した場合を詳述する
Optimizationクラスを使用する
実行方法
このUser's Guideの内容を実施する
https://www.openmodelica.org/doc/OpenModelicaUsersGuide/latest/optimization.html
最適化はOMShellから実行しないと多分上手くいかない
一応、OMEditからもオプションをつければOptimizationクラスは認識してくれるがたしか計算が回らなかった
まずはOptimizationオプションを有効にする
setCommandLineOptions("-g=Optimica")
以降は参考サイトにあるように以下のmoファイルを読み込んで実行する
inputが値を振りたい変数
optimizationクラスのobjectiveが目的関数
変数の範囲はmin, maxにて設定できる
多分デフォルトではobjectiveで指定された変数が最大化される
model BatchReactor
Real x1(start =1, fixed=true, min=0, max=1);
Real x2(start =0, fixed=true, min=0, max=1);
input Real u(min=0, max=5);
equation
der(x1) = -(u+u^2/2)*x1;
der(x2) = u*x1;
end BatchReactor;
optimization nmpcBatchReactor(objective=-x2)
extends BatchReactor;
end nmpcBatchReactor;
計算を実行する
//moファイルがあるパスをいれる
cd("C:\hogehoge")
loadFile("BatchReactor.mo")
loadFile("nmpcBatchReactor.mo")
//最適化実行
optimize(nmpcBatchReactor, numberOfIntervals=16, stopTime=1, tolerance=1e-8)
matファイルが出力されるのでOMEditなどで読み込む
結果を見ても式が複雑すぎて本当に最適化されているのやら分からない
分かりやすい問題作成
最適な結果が自明な問題を作成してOpenModelicaの最適化機能を確認してみる
y=-x^2(-1<x<1)で一番yが大きくなるxの値を探す
答えはもちろんx=0のときyは最大で0となる
model test
Real y;
input Real x(min=-1, max=1);
equation
y=-x^2;
end test;
optimization optim(objective=y)
extends test;
end optim;
少しだけ難しい問題作成
以下の問題も解いてみよう
model test
Real y;
input Real x(min = -1, max = 1);
equation
y=(x-10)^2;
end test;
答えはx=-1のとき、yが最大(121)となる。
以下は結果だが、どうしてもx=0, y=100を示してしまう。
設定が悪いのだろうか?
誰か分かる人がいれば教えてほしい
とりあえずOpenModelicaのせいと考えてJModelicaで試してみる
-> ToBeContinue