[解決済み] Matlabで'symfun'によって記号関数の微分を実装するには?
質問内容
以下は私のMatlabプログラムです。
syms x(t) t;
f = x^2 + 5;
そして、その結果
f
:
f(t) = x(t)^2 + 5
両方
f
と
x
はクラス
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自体にもこの制限があるようです。次のようなことを検討してみてください。 機能要望を出す に問い合わせてください。
関連
-
[解決済み] MATLABでctrl+Aを使わずにすべてのコードを自動インデントする
-
[解決済み] Matlab. 位置2のインデックスが配列の境界を越えています(1を超えてはいけません)。
-
[解決済み] MATLABでベクトルからNaNを除去する
-
[解決済み] エラー --> 整数には同じクラスの整数か、スカラー倍数しか組み合わせることができません。
-
[解決済み] 減衰比一定の直線と根元の軌跡との交点を求めるためのrlocfindの代替プログラム(Matlab
-
[解決済み] Matlab - rectangle関数を使用せずに矩形をプロットする
-
[解決済み] キュービックスプライン補間と多項式補間の比較
-
[解決済み] Matlabでεの機械値を求める
-
[解決済み] Matlab の imrect を用いて,新しい矩形の座標を取得します.
-
[解決済み] 行列の列数を求めるには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 第一差分フィルタ
-
[解決済み] MATLABで軸の制限をグローバルに設定し、プロットされたデータの最小値と最大値にする方法は?
-
[解決済み] MATLABエラー "このコンテキストでは関数定義は許可されていません。" [重複しています]。
-
[解決済み] 部分ピボットによるガウス消去の実装【終了しました
-
[解決済み] 部分ピボッティングによるLU分解 Matlab
-
[解決済み] プロットを回転させる?
-
[解決済み] MATLABで関数のパラメータにデフォルト値を設定するにはどうすればよいですか?
-
[解決済み] キュービックスプライン補間と多項式補間の比較
-
[解決済み] matlab のプロットベクトルは同じ長さでなければなりません。
-
[解決済み] Matlab の imrect を用いて,新しい矩形の座標を取得します.