Julia 中的特征向量 -- 结果不如 Mathematica 精确

Eigenvector in Julia -- result less precise than Mathematica

提问人:Weston 提问时间:10/18/2023 更新时间:10/19/2023 访问量:76

问:

我很高兴学习朱莉娅。

使用 Wolfram Mathematica,我可以获得简单矩阵的精确特征向量.例如:enter image description here

Julia 中的相同示例返回以下内容:

enter image description here

有没有办法让 Julia 的输出更简单/更精确/更像 Mathematica 的输出?

谢谢!

朱莉娅 特征向量

评论

0赞 DNF 10/19/2023
如果您将代码作为格式化文本而不是图像发布,其他人可以更轻松地测试您的代码。请参阅此帖子:stackoverflow.com/help/how-to-ask 有关提问的提示,特别是以“请勿发布代码、数据、错误消息等图像”开头的部分。

答:

4赞 StefanKarpinski 10/19/2023 #1

Mathematica 倾向于在这种情况下使用精确的符号算法,即使它们不能泛化或扩展到更大的输入。Julia 对大输入和小输入都使用相同的算法,这些算法往往是数字的,对于整数输入来说并不精确。产生的特征向量总是被归一化,因此它们具有单位范数:eigvecs

julia> B = eigvecs(A)
3×3 Matrix{Float64}:
 1.0  0.707107  0.557086
 0.0  0.707107  0.742781
 0.0  0.0       0.371391

julia> mapslices(norm, B, dims=1)
1×3 Matrix{Float64}:
 1.0  1.0  1.0

Mathematica 显然没有这样做,这让它给出了带有积分条目的特征向量。一般来说,积分特征向量是不存在的,这就提出了一个问题:Mathematica 是如何决定在这里使用精确算法的?谁知道呢。它使用什么算法?还有,谁知道呢。Mathematica 是一个了不起的软件,但它是闭源的,所以它是一个黑匣子。他们可能会记录这一点,如果有人愿意,可以去查看文档并发布这个问题的另一个答案,但与开源软件不同的是,没有办法真正看到它在做什么。

如果你怀疑一个矩阵的特征向量具有整数条目,那么你可以使用以下技巧来尝试恢复它们:对于每一列,将零附加到该列,然后在填充列中查找任意两个条目之间的最小正差;然后将原始列除以该差值。下面是一些为示例实现此目的的代码:

julia> B ./ mapslices(v -> minimum(filter(>(0), [v;0] .- [v;0]')), B, dims=1)
3×3 Matrix{Float64}:
 1.0  1.0  3.0
 0.0  1.0  4.0
 0.0  0.0  2.0

正如你所看到的,它恢复了 Mathematica 报告的整数值特征向量。我有点惊讶 Mathematica 将特征向量作为行而不是列返回,但这似乎就是它正在做的事情。