Skip to content

Instantly share code, notes, and snippets.

@mayataka
Last active January 5, 2024 07:02
Show Gist options
  • Save mayataka/ef178130d52b5b06d4dd8bb2c8384c54 to your computer and use it in GitHub Desktop.
Save mayataka/ef178130d52b5b06d4dd8bb2c8384c54 to your computer and use it in GitHub Desktop.
How to Use CasADi

CasADi とは?

数値最適化用の自動微分&各種ソルバーへのインターフェースツールです. MPCなどでの活用が便利です.

なぜ CasADiを使うのか?

  • 定式化が非常に直感的で使いやすい.
  • かなり変わった定式化にも対応可能(一般的な数値最適化ソルバーであるため)
  • バックエンドソルバーが豊富
  • AutoGenU,ACADO Toolkitといったシンボリック計算MPCツールと比べてトータルの実装時間が圧倒的に高速
  • 解きたいMPCの問題に対して,まずは CasADi で解いてみて,収束性能や計算時間が気になったら他のツールに移るのが効率的

最適制御ソルバーの実装

https://gist.github.com/mayataka/a75e6cdfd0e37499d892f0a4ea7af15c

MPCの実装

https://gist.github.com/mayataka/bc08faa63a94d8b48ceba77cc79c7ccc

ソルバーの選択

  • 基本はIpoptを使っておけばOK
  • 計算速度を向上させたい場合以下のオプションを設定
    • linear_solver: 線型方程式のソルバーでデフォルトはmumps(遅い).ma27などにすれば早くなるらしい(ただしHSLライブラリが必要)
    • max_iter: 最大反復回数であり,これを小さくすることで suboptimal な解が得られる
    • mu_min: バリアパラメータの下限値であり,大きくすることで保守的な解になるが収束が早くなる
    • hessian_approximation: limited-memoryにするとヘッシアン近似(準ニュートン法)を行い反復一回あたりの計算は早くなる
  • SCPGenを使えばGauss-Newtonも使える.Cコード生成もできるらしいが筆者は使い方がわからない.
  • さらなる高速化に向けて,現在CasADiはhpipmへのインターフェースを開発中である(casadi/casadi#2807 ) hpipmが使用可能になり次第そちらを使うべきである.
  • 現時点でCasADiで問題を記述しつつ計算を早めたい場合は,少し記述が複雑になるがacadosを使うべきである.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment