2010-12-15 33 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 *)