由于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]}
我想我知道一旦答案,但现在我不能找到它我认为这也可以让其他人受益。
由于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]}
我想我知道一旦答案,但现在我不能找到它我认为这也可以让其他人受益。
尝试使用线程:
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
列表内它适用于每个项目。
这个问题的标准答案是哪个Brett呈现 即使用Thread
。 但是,我发现用于DSolve
,NDSolve
等...命令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 *)
@Mike如果您打算扩展旧的答案,请考虑添加相关功能和概念的文档链接。例如,“Head”这个词不会出现在代码中的任何地方,这可能会让别人猜测。 – 2011-12-15 10:41:53