2010-12-15 11 views
10

DSolveの構文のために、微分方程式の系はベクトル方程式ではなく、方程式のリストとして与えられなければならない(Solveとは異なり、両方を受け入れる)。 だから私の素朴な疑問は、次のようなベクトル方程式に変換する方法である:方程式のリストにベクトル方程式をMathematicaの方程式のリストに変換する

{f'[t],g'[t]}=={{a,b},{c,d}}.{f[t],g[t]} 

{f'[t]==a*f[t]+b*g[t],g'[t]==c*f[t]+d*g[t]} 

私は一度答えを知っていたと思うが、私は今それを見つけることができません私はそれが他の人にも利益をもたらすことができると思います。

答えて

13

は、スレッドを使用してみてください:

Thread[{f'[t], g'[t]} == {{a, b}, {c, d}}.{f[t], g[t]}] 
(* {f'[t] == a f[t] + b g[t], g'[t] == c f[t] + d g[t] *) 

それは等価演算子==を取り、同じHeadと、リスト内の各項目に適用します。

+0

@Mike古い回答を展開する場合は、関連する機能や概念へのドキュメントリンクも追加することを検討してください。たとえば、「He​​ad」という言葉はコードのどこにも現れず、誰かが推測してしまうかもしれません。 –

6

この質問に対する標準的な答えは、Brettが提示されたものです。 、つまりThreadを使用しています。 しかし、私はDSolveNDSolveなどで使用することがわかりました。コマンドLogicalExpandが優れています。

eqn = {f'[t], g'[t]} == {{a, b}, {c, d}}.{f[t], g[t]}; 

LogicalExpand[eqn] 

(* f'[t] == a f[t] + b g[t] && g'[t] == c f[t] + d g[t] *) 

それはリストに、ベクトル方程式を変換しないが、それは自動的に行列/テンソル方程式およびベクトル式の組み合わせを平坦化するので、より有用です。あなたは上記の微分方程式に初期条件を追加したい場合 たとえば、あなたが行列式の例

init = {f[0], g[0]} == {f0, g0}; 

LogicalExpand[eqn && init] 

(* f[0] == f0 && g[0] == g0 && 
    f'[t] == a f[t] + b g[t] && g'[t] == c f[t] + d g[t] *) 

を使用したいここThreadを使用して

mEqn = Array[a, {2, 2}] == Partition[Range[4], 2]; 

がぎこちないです、あなたが必要ですそれを複数回適用すると、結果はFlattenになります。 LogicalExpandを使用すると簡単です

LogicalExpand[mEqn] 

(* a[1, 1] == 1 && a[1, 2] == 2 && a[2, 1] == 3 && a[2, 2] == 4 *) 
関連する問題