将矢量方程转换为Mathematica中的方程列表

Yuv*_*ati 10 wolfram-mathematica

由于DSolve语法,微分方程系统必须作为方程列表而不是矢量方程给出(与Solve不同,它接受两者).所以我的简单问题是如何转换矢量方程,例如:

{f'[t],g'[t]}=={{a,b},{c,d}}.{f[t],g[t]}
Run Code Online (Sandbox Code Playgroud)

方程列表:

{f'[t]==a*f[t]+b*g[t],g'[t]==c*f[t]+d*g[t]}
Run Code Online (Sandbox Code Playgroud)

我想我已经知道了答案,但我现在找不到它,我认为它也可以使其他人受益.

Bre*_*ion 13

尝试使用Thread:

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] *)
Run Code Online (Sandbox Code Playgroud)

它采用相等运算符==并将其应用于列表中的每个项目Head.


Sim*_*mon 6

这个问题的标准答案是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] *)
Run Code Online (Sandbox Code Playgroud)

它不会将矢量方程转换为列表,但它更有用,因为它会自动展平矩阵/张量方程和矢量方程组合.例如,如果您想为上述微分方程添加初始条件,则可以使用

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] *)
Run Code Online (Sandbox Code Playgroud)

矩阵方程的一个例子是

mEqn = Array[a, {2, 2}] == Partition[Range[4], 2];
Run Code Online (Sandbox Code Playgroud)

Thread在这里使用很尴尬,你需要多次应用它和Flatten结果.使用LogicalExpand很简单

LogicalExpand[mEqn]

(* a[1, 1] == 1 && a[1, 2] == 2 && a[2, 1] == 3 && a[2, 2] == 4 *)
Run Code Online (Sandbox Code Playgroud)