| TomSym | |
|---|---|
| 開発者 | Tomlab Optimization Inc |
| 安定版リリース | 7.8 / 2011年12月16日 (2011年12月16日) |
| オペレーティングシステム | TOMLAB - OSサポート |
| タイプ | テクニカルコンピューティング |
| ライセンス | 独自の |
| ウェブサイト | TomSym製品ページ |
TomSym [ 1] MATLABシンボリックモデリングエンジンは、応用最適化および最適制御問題をモデリングするためのプラットフォームです
説明
TomSymは、 Matlabのほとんどの組み込み数学演算子をサポートする、Matlabの完全なモデリング環境です。モデリング、コンパイル、そしてTOMLABソルバーへのインターフェースを組み合わせたものです。行列関数の行列微分は4階テンソル、つまり各要素が行列である行列です。TomSymは、これを表現するために4次元行列を使用するのではなく、2次元で動作し続けます。これにより、高次元行列では利用できない、Matlabの 非常に効率的な疎行列の処理を活用できます
TomSym にはさまざまな機能があります。
- 表現を変換し、スパースパターンを含む解析的な 1 次および 2 次導関数を生成する機能。
- MADとインターフェースおよび互換性があるため、シンボリック モデリングが適さない場合に MAD を使用できます。
- モデルの一部に数値微分を使用できます。
- 問題を解決するためのさまざまな情報をプロットおよび計算する機能。
- if、then、else ステートメントのサポート。
- p コード化されたMatlab ファイルを分析する機能。
- たとえば、生成されたモデルのコードの自動化された簡素化など。
モデリング
TomSymシンボリックソース変換により、任意の決定変数(連続および整数)のセットと任意のタイプの制約、およびスカラーと定数パラメータ を定義することが可能になります
線形計画法
線形計画法の問題の例は次のようになります
c = [ - 7 ; - 5 ]; A = [ 1 2 4 1 ]; b_U = [ 6 ; 12 ] ; x_L = [ 0 ; 0 ] ;
タム2x1 x
解= ezsolve ( c '* x , { A * x <= b_U , x_L <= x });
混合整数非線形計画法
MINLP問題は線形計画問題と同様に定義されます。この例では、モデルを一般的なTOMLAB問題に変換する方法も示しています
名前= 'minlp1Demo - Kocis/Grossman.' ;
タム2x1 xタム3x1整数y
目標値= [ 2 3 1.5 2 - 0.5 ] * [ x ; y ];
制約= { ... x ( 1 ) >= 0 、... x ( 2 ) >= 1e-8 、... x <= 1e8 、... 0 <= y <= 1 、... [ 1 0 1 0 0 ] * [ x ; y ] <= 1.6 、... 1.333 * x ( 2 ) + y ( 2 ) <= 3 、... [ - 1 - 1 1 ] * y <= 0 、... x ( 1 ) ^ 2 + y ( 1 ) == 1.25 、... sqrt ( x ( 2 ) ^ 3 ) + 1.5 * y ( 2 ) == 3 、... };
guess = struct ( 'x' , ones ( size ( x )), 'y' , ones ( size ( y ))); options = struct ; options . name = Name ; Prob = sym2prob ( 'minlp' , objective , constraints , guess , options );
Prob . DUNDEE . optPar ( 20 ) = 1 ;結果= tomRun ( 'minlpBB' , Prob , 2 );
マルチインデックスモデリング
tomSymを使用すると、MATLABで2つ以上の変数インデックスを持つモデルを構築できます。[2]次の例では、4つのインデックスを持つ変数「flow」を作成します。この変数は、2つのインデックスに制約を作成し、2次元行列との乗算を合計するために使用されます
% モデルで使用されるインデックスを作成します。
i = tomArrayIdx ( 'i' , 1 : 6 ); j = tomArrayIdx ( 'j' , 1 : 6 ); k = tomArrayIdx ( 'k' , 1 : 6 ); l = tomArrayIdx ( 'l' , 1 : 6 );
% 全長の整数変数を作成します。
flow = tom ( 'flow' , 6 ^ 4 , 1 , 'int' );
% 変数を4つのインデックスを持つ行列に変換します。
flow = tomArray ( flow ,[ 6 , 6 , 6 , 6 ]);
% すべての i と j に有効な制約を作成します
。cons = { sum ( sum ( flow ( i , j , k , l ), k ), l ) == 1 };
% 複数インデックスの乗算に基づいてスカラーを作成します
distance = tomArray ([ 0 945 605 4667 4749 4394 ; ... 945 0 866 3726 3806 3448 ; ... 605 866 0 4471 4541 4152 ; ... 4667 3726 4471 0 109 415 ; ... 4749 3806 4541 109 0 431 ; ... 4394 3448 4152 415 431 0 ]);
sumtotal = sum ( vec ( (距離( i 、k ) +距離( l 、j ) + ...距離( k 、l ) * .8 ) .* flow ( i 、j 、k 、l )));
自動微分と数値微分
tomSymで解釈できない関数については、自動微分または数値微分のいずれかを使用できます。以下の例では、2つの方法を用いて簡単な問題を解きます。
タムx1 x2アルファ= 100 ;
% 1つの関数にMAD(自動微分)を使用する
%
% ラッパー関数を作成します。この例ではsinを使用していますが、
MADがサポートされている任意の関数を使用できます。
y =ラップ( struct ( 'fun' , 'sin' , 'n' , 1 , 'sz1' , 1 , 'sz2' , 1 , 'JFuns' , 'MAD' ), x1 / x2 ); f =アルファ* ( x2 - x1 ^ 2 ) ^ 2 + ( 1 - x1 ) ^ 2 + y ;
% 問題を設定して解きます
c = - x1 ^ 2 - x2 ; con = { - 1000 <= c <= 0 - 10 <= x1 <= 2 - 10 <= x2 <= 2 };
x0 = { x1 == - 1.2 x2 == 1 };
solution1 = ezsolve ( f , con , x0 );
% 1つの関数に数値微分を使用する
% 新しいラッパー関数を作成します。今回はsin関数を使用しますが、
数値微分を使用するため、任意の関数を使用できます。
y =ラップ( struct ( 'fun' , 'sin' , 'n' , 1 , 'sz1' , 1 , 'sz2' , 1 , 'JFuns' , 'FDJac' ), x1 / x2 ); f =アルファ* ( x2 - x1 ^ 2 ) ^ 2 + ( 1 - x1 ) ^ 2 + y ;
solution2 = ezsolve ( f , con , x0 );
参考文献
- ^ Rutquist, Per; MM Edvall (2008年11月). TOMLAB ユーザーズマニュアル(PDF) . ワシントン州プルマン: Tomlab Optimization Inc
- ^ 「航空会社のハブの場所」、TOMSYMホームページ、2009年4月。
外部リンク
- TomSymホームページ