【问题标题】:Issue with computing eigenvalues using mathematica使用mathematica计算特征值的问题
【发布时间】:2011-09-24 13:17:12
【问题描述】:

基本上我试图找到矩阵的特征值,大约需要 12 个小时。当它完成时,它说它找不到所有的特征向量(实际上几乎没有),我对它确实找到的那些持怀疑态度。我真正能做的就是发布我的代码,我希望有人可以给我一些建议。我对mathematica 不是很有经验,也许运行时间慢和结果不好与我有关,而不是mathematica 的能力。感谢任何回复的人,我真的很感激。

cutoff = 500; (* set a cutoff for the infinite series *)
numStates = cutoff + 1; (* set the number of excited states to be printed *)
If[numStates > 10, numStates = 10];

    $RecursionLimit = cutoff + 256; (* Increase the recursion limit to allow for the specified cutoff *)
(* set the mass of the constituent quarks *)
m1 := mS; (* just supposed to be a constant *)
m2 := 0;

(* construct the hamiltonian *)
h0[n_,m_] := 4 Min[n,m] * ((-1)^(n+m) * m1^2 + m2^2);

v[0,m_] := 0;
v[n_,0] := 0;
v[n_,1] := (8/n) * ((1 + (-1)^(n + 1)) / 2);
v[n_,m_] := v[n - 1, m - 1] * (m/(m - 1)) + (8 m/(n + m - 1))*((1 + (-1)^(n + m))/2);

h[n_,m_] := h0[n,m] + v[n,m];

(* construct the matrix from the hamiltonian *)
mat = Table[h[n,m], {n, 0, cutoff}, {m, 0, cutoff}] // FullSimplify;

(* find the eigenvalues and eigenvectors, then reverse the order *)
PrintTemporary["Finding the eigenvalues"];
{vals, vecs} = Eigensystem[N[mat]] // FullSimplify;

$RecursionLimit = 256; (* Put the recursion limit back to the default *)

我的代码有点多,但这是它真正变慢的地方。我绝对应该提到的是,如果我将 m1 和 m2 都设置为零,我真的没有任何问题,但是将 m1 设置为常数会使一切都陷入困境。

【问题讨论】:

  • 可能值得指出的是,大量时间用于构建矩阵(即使按照 Timo 的建议进行记忆)。 RSolve 为您的 v 的递归定义提供了一个明确的形式,尽管修复未确定的函数(通过您的初始条件)可能会因分支切割等而变得复杂。无论如何,如果您进一步扩展它,这可能是一些事情看看。

标签: wolfram-mathematica eigenvector eigenvalue


【解决方案1】:

这是蒂莫回答的后续。我想展示一个数字,所以我将其作为答案而不是评论。

假设您要查找具有 501 x 501 个符号元素的矩阵的特征值。 [顺便说一句,您称它们为常量,但这是用词不当。常量只是定义的,具有名称的固定值。您在 Timo 的回答中的评论中描述的是一个符号变量。]

很高兴了解完全符号矩阵对特征值计算的作用。这是一个 2 x 2 矩阵:

Array[f, {2, 2}] // Eigenvalues

(* ==> 
 {1/2 (f[1, 1]+f[2, 2]-Sqrt[f[1, 1]^2+4f[1, 2] f[2, 1]-2 f[1, 1] f[2, 2]+f[2, 2]^2]), 
 1/2(f[1, 1]+f[2, 2]+Sqrt[f[1, 1]^2+4 f[1, 2] f[2, 1]-2 f[1, 1] f[2, 2]+f[2, 2]^2])}   
*)

它占用Array[f, {2, 2}] // Eigenvalues//ByteCount = 3384 字节。这爆发得相当快:一个 7x7 解决方案已经占用了 70 MB(需要几分钟才能找到这个)。事实上,矩阵大小和字节数之间存在很好的关系:

拟合函数为:字节数 =E^(2.2403067075863197 + 2.2617380321848457 x 矩阵大小)。

如你所见,一个 501 x 501 符号矩阵的特征值在宇宙终结之前是找不到的。

[顺便说一句,矩阵的所有格形式是什么?]

【讨论】:

  • 漂亮的图表!看待问题的另一种方法是认识到求解 nxn 矩阵的特征值等同于求解 n 阶多项式的根,并且众所周知的事实是 all 没有通解 n=5 及以上的多项式的根。因此,MMA 可能开始为变量mS 的值组装一个庞大的条件列表,在这些条件下可以求解一些特征值。
  • @Timo 实际上 MMA 返回 Root 对象。对于上述大小为 6 x 6 的矩阵,此 Root 的第一个成员已经有 32,331 个元素。
  • 感谢您清除常量和符号变量之间的区别。我应该在我的评论中说的是我想要一个关于符号变量的答案,但是既然你已经证明这是不可能的,我将不得不将它定义为一个常数并改变我所看到的常数合身。谢谢!
  • 感谢您的澄清。
【解决方案2】:

您的问题是常量mS 仍然是符号。这意味着 Mathematica 正在尝试解析求解特征值而不是数值求解。如果您的问题允许您为mS 选择一个数值,您应该这样做。

您遇到的另一个不相关的问题是您正在使用递归公式并且您想要使用,例如,以下行中的记忆

v[n_, m_] := v[n, m] = v[n - 1, m - 1]*(m/(m - 1)) 
                     + (8 m/(n + m - 1))*((1 + (-1)^(n + m))/2);

额外的v[n, m] = 存储给定nm 的值,因此您不必每次在Table[] 中调用h[n, m] 时一直递归到v[0,0]

处理完这两件事后,我的旧 core 2 duo 只需不到一分钟即可完成特征值。

【讨论】:

  • 我真正想要的是能够将 mS 保持为常数,这样当我得到一些解决方案时,我可以自己改变 mS 值(即我真的很想得到解决方案毫秒)。但是,这绝对是有道理的,因为它不再能够找到数值解。我想我可以从一开始就为 m1 指定一个数值(我可以在那里改变它而不是以后)。无论如何,感谢您的回复,递归技巧非常棒!
  • 如果你还没有这样做,看看你用 cutoff=5 得到了什么。为 mS 使用特定的数字可能是要走的路。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多