我需要在Mathematica中解决这个等式:
d / dx v (x)= A 。的 v (x)的
此处 v 是列向量 {v1(x),v2(x),v3(x),v4(x)}
和
A 是 4 x 4矩阵。
我想用任何初始条件求解函数v1, v2, v3, v4
。
x的范围是0到1000.
如何使用NDSolve
?
答案 0 :(得分:7)
所以,如果你有一些可怕的矩阵
A = RandomReal[0.1, {4, 4}]; (* A horrible matrix *)
我们做反对称(因此解决方案是振荡的)
A = A - Transpose@A;
定义函数的向量及其初始条件
v[x_] := {v1[x], v2[x], v3[x], v4[x]};
init = v[0] == RandomReal[1, 4]
然后NDSolve
命令看起来像
sol = NDSolve[LogicalExpand[v'[x] == A.v[x] && init],
{v1, v2, v3, v4}, {x, 0, 1000}]
可以使用
绘制解决方案Plot[Evaluate[v[x] /. sol], {x, 0, 1000}]
注意,上述微分方程是具有常系数的线性一阶方程,因此简单地使用矩阵指数求解。
但是,如果矩阵A
是x
的函数,则解析解变得很难,但数字代码保持不变。
例如,尝试:
A = RandomReal[1/10, {4, 4}] - Exp[-RandomReal[1/100, {4, 4}] x^2];
A = A - Transpose@A;
哪个可以产生像
这样的解决方案
答案 1 :(得分:1)
我想用矩阵而不是矢量v做同样的事情。只要在不知道这个符号代表矢量或矩阵的情况下可以正确读取它的等式,NDSolve就可以从初始条件推导出它的特征,但是变量维度明确的情况:
M'[t]==a[t]*IdentityMatrix[2]+M[t]
失败了。 “普通”解决方案是明确定义矩阵,并在给出变量列表时将其展平。
但是我省略了这个问题(以及许多relatedx语法问题),只是引入了一个reduntant变量,其中只有一个角色是身份矩阵,但没有引入一个列表(矩阵是2d列表,所以Mathematica就像在互相添加列表时一样,产生错误):
eqn = {w'[t] == a[t]*identity[t] + w[t], a'[t] == 2, identity'[t] == {{0, 0}, {0, 0}}}
init={ w[0] == {{1, 2}, {2, 1}}, a[0] == 1, identity[0] == {{1, 0}, {0, 1}}}
sol = NDSolve[eqn&&init, {w, a, identity}, {t, 0, 1}]
一些工作证据:
Plot[{Evaluate[w[t] /. sol][[1, 1, 1]], Evaluate[w[t] /. sol][[1, 1, 2]]}, {t, 0, 1}]
答案 2 :(得分:0)
尝试这样的事情(我的家用笔记本上没有Mathematica :))
NDSolve[Transpose[{v1[x],v2[x],v3[x],v4[x]}']=={{a11,a12,a13,a14},{a21,a22,a23,a24},{a31,a32,a33,a34},{a41,a42,a43,a44}}.Transpose[{v1[x],v2[x],v3[x],v4[x]}], {v1,v2,v3,v4},{x,0,1000}]
ps:你可以用不同的方式重写它,将你的记录替换为一组方程式 {V1 '[X] == A11 * V1 [X] + A12 * V2 [X] + A13 * V3 [X] + A14 * V4 [X],V2'[X] == A21 * V1 [X] + a22 * v2 [x] + a23 * v3 [x] + a24 * v4 [x],依此类推..}如果你想要的话)