LoginSignup
0
1

More than 5 years have passed since last update.

Modelicaで最適化 - Excel編

Last updated at Posted at 2018-11-20

Modelicaで最適化を志す

Modelicaで最適化(動的計画法)を行う場合いくつか選択肢があるが
OpenModelica, JModelicaにはOptimizationクラスが用意されており最適化を行うことが出来る

JModelicaで試した結果はこちら
https://qiita.com/UedaShigenori/items/4452d95cfa440658163a

OpenModelicaで試した結果はこちら
https://qiita.com/UedaShigenori/items/fbd2209363c117476827

結論として両者はあまり使えなかった
OpenModelicaは期待する結果を得る方法が分からなかったし
JModelicaはパラメータ変数に計算式が入っているとダメだし、Fluidパッケージのモデルが全然計算できない

そこでExcelからOpenModelicaで計算を実行するライブラリを昔作ったのでそれを拡張して最適化できるようにしてみる
https://github.com/UedaShigenori/OpenModelica_Excel_Interface_ClassPackage

本当は格好よくPythonとかでやりたいし、OpenModelicaにPython InterfaceもあるのだがPython使えないから仕方ない
またPythonが使えない環境も製造業では多いためVBAで書いていく

試みとしてはまだ途中である

実装手順

  1. ExcelからOpenModelicaを計算実行出来るようにする

  2. それからパラメータを変更出来るようにする
    ここでパラスタ機能を付けてもいいかもしれない

  3. 計算結果をExcelに取得するようにする

  4. 計算結果から次のパラメータを決定出来るようにする

1.ExcelからOpenModelicaの計算を実行

以下のExamples1.xlsmはHelloWorld.moをOMShellから実行するサンプルマクロである
https://github.com/UedaShigenori/OpenModelica_Excel_Interface_ClassPackage

先日まではWindows10では動かなかったが、本日動くように修正した

躓いていたのはSendkeysでOMShellにコマンドを送るところで
Win10だとちゃんとコマンドを送れなかった
色々原因はあるらしいが以下のサイトを参考にWSHから送るようにした
https://qiita.com/nukie_53/items/f069a1e48cddca0024c2

ちゃんと動くことを確認できた

次のステップ

次はExcelからモデルのパラメータ変更するのだが
OMShellにコマンドが用意されているため用意と思われる

結果の取得もcsvで吐き出せば簡単に読み込める
ただ、結果ファイルは大きいので全部読み込むか、特定の変数の結果のみ読み込むかは後々判断する

難しいのは動的にパラメータを変えることだと認識する

ある目的関数を最小化(最大化)するため、パラメータ変数を変更するのだが
目的関数は時系列で出力されるため、一つの評価関数にする必要がある
最小二乗法などが候補となる

次に、最小化のためのアルゴリズムだが導関数を取得するかどうかで計算コストも変わる
代数的に求める二分法などもあるが、おそらくPythonはこの辺りのライブラリが充実しているのだと思う。
ExcelVBAでそのようなライブラリがあればだれか教えてほしい

ただ、ExcelのSolver機能などのセルに依存した機能は可読性が大きく下がり拡張性も悪くなるので
それ以外でお願い致します。


** パラメータを変更する

以下のコードを参照

Sub Examples2_2()

'
'    パラメータを変更して計算を実行するマクロです
'    mosスクリプトを書いて、OMShellに投げます
'

    '宣言
    Dim ThisWorkbookPath As String
    Dim mosFileName As String
    Dim modelFile As String
    Dim className As String

    'mosファイルの設定インスタンス
    Dim mosScript As MosSetting
    Set mosScript = New MosSetting

    'OMShellの操作インスタンス
    Dim OMShell As OperateOMShell
    Set OMShell = New OperateOMShell

    '計算を実行するmoファイル, クラス名, mosファイル名. ワークブックパスを定義
    modelFile = "He"
    className = "hel"
    mosFileName = "He"
    ThisWorkbookPath = ThisWorkbook.Path

    'mosファイルの設定
    Call mosScript.MakeMos(mosFileName)
    Call mosScript.loadFile(modelFile)
    Call mosScript.build(className, 0, 1, 500, 0.0001, "dassl", "csv")
    Call mosScript.ChangeParameter(className, "a", 100)
    Call mosScript.exe(className, "res14", "csv")
    Call mosScript.EndMos

    'OMShellからmosファイルを実行
    Call OMShell.StartOMShell
    Call OMShell.Cd(ThisWorkbookPath)
    Call OMShell.runScript(mosFileName)
End Sub
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1