1. ホーム
  2. matlab

[解決済み] Matlabで'symfun'によって記号関数の微分を実装するには?

2022-02-18 13:50:06

質問内容

以下は私のMatlabプログラムです。

syms x(t) t;
f = x^2 + 5;

そして、その結果 f :

f(t) = x(t)^2 + 5

両方 fx はクラス symfun をMatlabで表示します。に等しいdf/dxの結果が欲しい. 2*x(t) . Matlabで試してみました。

diff(f, x);

と表示され、以下のエラーが発生しました。

Error using mupadmex
Error in MuPAD command: The variable is
invalid. [stdlib::diff]
Error in sym/diff (line 57)
    R = mupadmex('symobj::diff', S.s, x.s,
    int2str(n));

Matlabでdf/dxはどのように得られるのですか?

どのように解くのですか?

Matlabの新しいバージョン(私はR2014bを使用しています)では、エラーメッセージがより明確になっています。

を使用したエラー sym/diff (26行目) 最初の引数を除くすべての引数は、シンボリック関数であってはなりません。

ということで、以下のようになります。 sym/diff は、ドキュメントが抽象的または任意と呼ぶものに関して、派生物を取ることはできません。 symfun つまり、定義のないものです。この制限はドキュメントでは明示的に言及されていませんが、様々な入力パターンがそれを暗示しています。


回避策1 : 単純な関数、独立変数 t 微分されたsymfunにのみ表示されます

特にエレガントなワークアラウンドは見つかっていません。もし t は、関心のある変数にのみ表示されます(ここでは x(t) を使用し、それ自体や他の抽象的な記号関数を使用しない場合、時間に関して微分することができます。 t で、余分な項を打ち消す。例えば

syms t x(t) y(t) z
f1 = x^2+5;
f2 = x^2+z^2+5;
f3 = x^2+y^2+z^2+5+t;
dxdt = diff(x,t);
df1 = diff(f1,t)/dxdt
df2 = diff(f2,t)/dxdt
df3 = diff(f3,t)/dxdt

を返し、必要な 2*x(t) は、最初の2つのケースには適用されますが、3番目のケースには適用されません。そのため simplify を完全に分割するために、場合によっては D(x)(t) の用語があります。


回避策2 : より堅牢だが、より複雑な方法

使用方法 subs を複数回使用すると、当該記号関数を標準的な記号変数に置き換えて、微分し、入れ替えることができます。例えば

syms t x(t) y(t) z
f3 = x^2+y^2+z^2+5+t;
xx = sym('x');
df3 = subs(diff(subs(f3,x,xx),xx),xx,x)

を返し、さらに 2*x(t) の場合、上記の3番目のケースになります。しかし、これはちょっと醜いハックだと思います。

Matlabでこれができないのはちょっとばかしおかしいですね。Mathematicaにはそのような問題はありません。MuPAD自体にもこの制限があるようです。次のようなことを検討してみてください。 機能要望を出す に問い合わせてください。