2010-12-15 64 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如果您打算擴展舊的答案,請考慮添加相關功能和概念的文檔鏈接。例如,「Head」這個詞不會出現在代碼中的任何地方,這可能會讓別人猜測。 – 2011-12-15 10:41:53

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] *) 

矩陣方程的一個例子是

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

使用Thread這裏彆扭,你需要將其應用多次並結果Flatten。使用LogicalExpand很容易

LogicalExpand[mEqn] 

(* a[1, 1] == 1 && a[1, 2] == 2 && a[2, 1] == 3 && a[2, 2] == 4 *)