Modelicaで最適化 - OpenModelica編


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で指定された変数が最大化される

BatchReactor.mo
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;
nmpcBatchReactor.mo
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となる

test.mo
model test
  Real y;
  input Real x(min=-1, max=1);
equation
  y=-x^2;
end test;
optim.mo
optimization optim(objective=y)
  extends test;
end optim;

結果はx,yともに0となった。
良さそうだ。


少しだけ難しい問題作成

以下の問題も解いてみよう

test.mo
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