Symbolic Math Toolboxでは==演算子で恒等式を評価できない場合がある

Symbolic Math Toolboxでは==演算子で恒等式を評価できない場合がある

現象

if 文に cosh(x)^2 == sinh(x)^2 + 1 を入れても TRUE として評価されないという現象が発生しました.

(x はシンボリック変数です)

解決方法

ドキュメンテーションによると,sym/eq (シンボリック変数に対する == 演算子) は方程式の定義を行うものとして扱われているようです. 要するに,通常の変数に対する == 演算子とは違って,{0, 1} の値を返すものではないのですね.

方程式が恒等式であるかどうかを評価するには,isAlways 関数を使用すれば良いようです.

ちなみに simplify 関数でも同様のことができますが,sym/isAlways の中身を見てみると全く別の処理を行っているようです.

追加の検証と所感

試しに syms x y として2つの変数を定義し,x=y として代入を行った後に x==y を評価してみます.

すると,上の画像のように方程式 x==yy==y として評価され,isAlways を使わない if 文による判定にもパスしています. つまりは,if 文中にシンボリック変数の方程式が放り込まれたときには,左辺と右辺がシンボルとして等価かどうかが判定されているのではないかと考えられます.

このような挙動の違いがあるにもかかわらず,何の警告も出ずに if 文中での方程式の使用が許されてしまうのはちょっと微妙なんじゃないかなあと個人的には思います.

いずれにせよ,恒等式を if で評価する場合は isAlways ということで解決できます. ドキュメントをちゃんと読みましょうということですねー.

Symbolic Math Toolbox について

Symbolic Math Toolbox は MATLAB 上でシンボル計算を可能にするツールボックスで,要するに Mathematica みたいなことができます. このツールボックスの便利なポイントは,MATLAB の強力な数値計算エンジン・関数群とシンボル計算を組み合わせることで,数式による理論から数値によるシミュレーションや実験までの流れがスムーズに構築できるようになっている点です. これを使いはじめるまでは,数理モデリングを Mathematica で行ってから導出した状態方程式を MATLAB に写経してシミュレーションを回す,という非常に面倒な流れを踏んでいました. また,処理した後のシンボリック変数は matファイル に保存できるので,再利用も楽ちんです(Mathematicaはこの辺が弱いような気がします).

Share Comments