※記事内に商品プロモーションを含むことがあります。
はじめに
最適化ライブラリCasADiには、行列を扱える3つのクラス (SX, MX, DM) があります。これらのクラスの違いをまとめました。
この記事では、CasADiのPythonインターフェイスを使用しています。PythonとCasADiのバージョンは以下の通りです。
- Python 3.9.7
- CasADi 3.5.5
各クラスの基礎
CasADiの公式リファレンスでは、SX, MX, DMクラスの説明は以下となっています。
- SX: 単項演算や二項演算で表現されるシンボルを要素に持つ行列 (scalar expression)
- MX: SXに似ているが、行列をシンボルで表現する (matrix expression)
- DM: 非ゼロ要素を数値として持ち、シンボルによる表現は持たない行列
シンボルとは、数学の記号(xやyなど)のような概念です。DMクラスはシンボルを定義できないので、NumPyのarray
クラスに似ています。
各クラスのオブジェクトを定義する例を以下に示します。
|
|
ca.SX(2,3)
などは2x3サイズの行列を表します。また、ca.SX([[1,2],[3,4]])
などは具体的な数値を持つ行列の定義を表します。
NG例の通り、シンボルを持つDMオブジェクトd0
と、数値を持つMXオブジェクトm2
は作成できません。
また、SXとMXのシンボルの違いを以下に示します。SXオブジェクトでは、a_0
, a_1
などのように各要素がシンボルを持ちます。一方、MXオブジェクトでは行列がc
というシンボルを持ちます。
|
|
異なるクラス同士の演算
異なるクラス同士の演算を解説します。SXオブジェクトとMXオブジェクトを組み合わせた計算は出来ませんが、以下の組み合わせは計算可能です。
- SXとDM→SXオブジェクトになる
- MXとDM→MXオブジェクトになる
例を以下に示します。
|
|
当然、同じ種類のオブジェクト同士は計算可能です。
CasADi固有のクラス
CasADiに実装されている固有のクラスと、SX, MX, DMクラスとの関係を見ていきます。
Lookup table
CasADiには、テーブルを補間するinterpolant
クラスが実装されています。interpolant
オブジェクトの引数にはスカラー、MX, DMクラスを取ることができますが、SXクラスは不可です。
|
|
引数をスカラーにした場合、戻り値はDMクラスとなります。
Opti stack
CasADiには、数理最適化計算を実行するためのOpti stackというフレームワークが実装されています。Opti
オブジェクトのvariable()
メソッドで変数を定義します。この変数はMX
オブジェクトとなります。
|
|
MXオブジェクトとSXオブジェクトは合わせて計算することができないため、Opti stackを使用する場合、変数やパラメータはMXやDMクラスで宣言すると良いでしょう。
参考
CasADiの公式リファレンス