- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在处理一个元素非常小的稀疏矩阵。考虑一个向量:
vec=[-1.e-76 -1.e-72 -1.e-68 -1.e-64 -1.e-60 -1.e-56 -1.e-52 -1.e-48 -1.e-44
-1.e-40 -1.e-36 -1.e-32 -1.e-28 -1.e-24 -1.e-20 -1.e-16 -1.e-12 -1.e-08
-1.e-04 -1.e-02 -1.e-04 -1.e-08 -1.e-12 -1.e-16 -1.e-20 -1.e-24 -1.e-28
-1.e-32 -1.e-36 -1.e-40 -1.e-44 -1.e-48 -1.e-52 -1.e-56 -1.e-60 -1.e-64
-1.e-68 -1.e-72 -1.e-76]
对于那些感兴趣的人,这些数字代表一维系统的跳跃幅度。它们不为零。哈密顿量由稀疏矩阵给出:
H=sps.diags([vec,vec],[-1,1],dtype='f8')
我对特征值很感兴趣,但对特征向量更感兴趣.据我所知,有两种处理对角化的方法: scipy.linalg
和 numpy.linalg
前者更好。
denseHam=H.toarray()
正确的特征值谱由所有这些函数给出:
import numpy as np
import scipy.linalg as la
s1= la.eigvalsh(denseHam)
s2= np.linalg.eigvalsh(denseHam)
s3= np.linalg.eigvals(denseHam) #I did not expect that!
正确的光谱是:
spectrum=[-3.16230928e-03 -3.16227766e-08 -3.16227766e-13 -3.16227766e-18
-3.16227766e-23 -3.16227766e-28 -3.16227766e-33 -3.16227766e-38
-3.16227766e-43 -3.16227766e-48 -3.16227766e-53 -3.16227766e-58
-3.16224604e-63 3.16224604e-63 3.16227766e-58 3.16227766e-53
3.16227766e-48 3.16227766e-43 3.16227766e-38 3.16227766e-33
3.16227766e-28 3.16227766e-23 3.16227766e-18 3.16227766e-13
3.16227766e-08 3.16230928e-03]
然而,其他函数(也涉及特征向量的计算)失败了,我无法继续,因为我需要特征向量。
我不得不说 C++ 也能够正确计算特征向量。
所以我有两个问题:
np.linalg.eigh(denseHam)
给出的光谱与 np.linalg.eigvalsh(denseHam)
不同?非常感谢您!
---更新------我在这里粘贴了一个最小的完整示例。注意 numpy.linalg.eigh
的暴露退化:
import numpy as np
import scipy.sparse as sps
vec=np.array([-1.e-76, -1.e-72, -1.e-68, -1.e-64, -1.e-60, -1.e-56, -1.e-52,
-1.e-48, -1.e-44, -1.e-40, -1.e-36, -1.e-32, -1.e-28, -1.e-24,
-1.e-20, -1.e-16, -1.e-12, -1.e-08, -1.e-04, -1.e-02, -1.e-04,
-1.e-08, -1.e-12, -1.e-16, -1.e-20, -1.e-24, -1.e-28, -1.e-32,
-1.e-36, -1.e-40, -1.e-44, -1.e-48, -1.e-52, -1.e-56, -1.e-60,
-1.e-64, -1.e-68, -1.e-72, -1.e-76])
H=sps.diags([vec,vec],[-1,1],dtype='f8')
denseHam=H.toarray()
s1=np.linalg.eigvalsh(denseHam)
(s2,basis)=np.linalg.eigh(denseHam)
print("Note the difference between the eigenvalues computed with eigvalsh (1stcolumn) and eigh (2nd column)")
for elem in range(len(s1)):
print (s1[elem]," ",s2[elem])
最佳答案
简短回答:试试 LAPACK 的 scipy.linalg.lapack.dsyev()
!
# LAPACK's dsyev instead of LAPACK's dsyevd
(s3,basis3,error)=scipy.linalg.lapack.dsyev(denseHam)
函数 np.linalg.eigvalsh()
和 np.linalg.eigh()
两者都按照其文档中的说明调用 LAPCK 的 DSYEVD
。然而,它们提供不同的特征值:eigh()
失败。原因很可能刻在DSYEVD
的源代码中. 事实上,如果不需要特征向量,例程会缩放矩阵,将矩阵简化为三角形式 (DSYTRD
),最后调用 DSTERF
.最后一个例程使用 QL 或 QR 算法的 Pal-Walker-Kahan 变体计算对称三对角矩阵的所有特征值。相反,如果需要特征向量,DSYEVD
切换到 DSTEDC
缩放和减少到三角形后。 DSTEDC
使用分治法计算对称三对角矩阵的所有特征值和特征向量。
输入矩阵的小范数无关紧要,因为在这种情况下可能会应用缩放。由于实对称矩阵具有非常不同幅度的特征值(从 3.16224604e- 63 到 3.16230928e-03), 它是病态的。大多数线性代数程序(包括特征值计算)的准确性都受此属性的显着影响。提供的矩阵已经是三角形式。
np.linalg.eigh()
失败。这可能与使用分而治之策略有关。
np.linalg.eigvalsh()
似乎工作。因此,它看起来像 DSTERF
工作了。然而,此例程仅提供特征值。
LAPACK 提供 different algorithms to compute the eigenvalues and eigenvectors ,您的 C++ 代码可能使用另一个代码,例如 dsyev()
. 将矩阵缩放并简化为三角形式后,此例程首先调用DORGTR
生成正交矩阵,然后调用DSTEQR
获取特征向量。希望这个函数可以通过 scipy 的 Low-level LAPACK functions (scipy.linalg.lapack
) 调用。
我在您的代码中添加了几行来调用此函数。 scipy.linalg.lapack.dsyev()
为这个病态矩阵计算类似于 np.linalg.eigvalsh()
的特征值。
import numpy as np
import scipy.sparse as sps
import scipy.linalg.lapack
vec=np.array([-1.e-76, -1.e-72, -1.e-68, -1.e-64, -1.e-60, -1.e-56, -1.e-52,
-1.e-48, -1.e-44, -1.e-40, -1.e-36, -1.e-32, -1.e-28, -1.e-24,
-1.e-20, -1.e-16, -1.e-12, -1.e-08, -1.e-04, -1.e-02, -1.e-04,
-1.e-08, -1.e-12, -1.e-16, -1.e-20, -1.e-24, -1.e-28, -1.e-32,
-1.e-36, -1.e-40, -1.e-44, -1.e-48, -1.e-52, -1.e-56, -1.e-60,
-1.e-64, -1.e-68, -1.e-72, -1.e-76])
H=sps.diags([vec,vec],[-1,1],dtype='f8')
denseHam=H.toarray()
# eigenvalues only, boils down to LAPACK's DSTERF
s1=np.linalg.eigvalsh(denseHam)
# LAPACK's dsyevd, divide and conquer
(s2,basis)=np.linalg.eigh(denseHam)
# LAPACK's dsyev instead of LAPACK's dsyevd
(s3,basis3,error)=scipy.linalg.lapack.dsyev(denseHam)
print("Note the difference between the eigenvalues computed with eigvalsh (1stcolumn) and eigh (2nd column)")
for elem in range(len(s1)):
print (s1[elem]," ",s2[elem], s3[elem])
您还可以避免还原为三角形,因为您的矩阵已经是三角形了。可能需要缩放以避免数值问题。然后通过LAPACK functions for Cython可以直接调用DORGTR
和DSTEQR
.但它需要更多的工作和一个编译步骤。
关于python - 病态矩阵的对角化和计算特征向量的不可能性。 numpy/scipy 的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52211929/
是否可以在表格 View 中提供单独的单元格样式? 最佳答案 是的,看看几乎所有的苹果应用程序。他们倾向于使用不同控件的表格进行设置。这就是表格单元格具有不同重用标识符的原因。这样您就可以将正确的类型
我想知道是否可以在 Javascript 中做这样的事情: one(plus(nine())); // returns 10 看起来是这样,但我不确定如何将 one() 的值传递给 plus() 函数
我正在编写一个算法,在给定模型的情况下,我计算数据集列表的可能性,然后需要对每个可能性进行归一化(概率)。所以像 [0.00043, 0.00004, 0.00321] 这样的东西可能会被转换成 [0
我想检测是否可以进行局域网唤醒。 在我的路由器(Tomato 固件)上有一个包含信息的表格 - 当显示设备“事件(在 ARP 中)”时 - 可以通过 WOL(离线 Linux 电脑)打开该设备。 我想
我正在寻找一种方法来解析具有几个可能使用的不同终止字符的子字符串。我应该使用不同的方法还是有办法使用正则表达式来整理字符? 我当前的代码使用: smallstring = bigstring.subs
目前我有可能使用 surefire 插件在 maven 上运行多个测试,如下所示: mvn clean test -Dsurefire.suiteXmlFiles=test1.xml,test2.xm
最近,我成功地为 HDFS 和 YARN 启用了 HA。现在我有一个事件的和备用的名称节点,自动故障转移工作正常。我正在使用 Cloudera Manager 和 CDH 5。 我有以下问题。 例如,
我想要最简单的动词,它给出给定长度的所有 bool 列表的列表。 例如 f=. NB. Insert magic here f 2 0 0 0 1 1 0 1 1 f 3 0 0 0
这将是一个井字游戏实现: data Row = A | B | C deriving (Show, Read, Eq, Ord, Enum, Bounded) data Column = X
这是一个假设性的问题: 我想构建一个 Chrome 扩展程序,它会跟踪用户在该扩展程序处于事件状态的网页子集上的点击情况,并通过 AJAX 将数据作为 POST 或 GET 请求发送到我在某处运行的外
我们想使用 Entity Framework (.NET 4.0) 构建可以处理 Sql Server、MySQL 和 Oracle 的应用程序。也许 Sqlite 也是。 通过配置文件中的一些设置应
是否可以在 iPhone 上通过指定网络的 SSID 来创建数据连接? 是否可以从应用程序检查具有指定 SSID 的网络的信号/可用性? 问候,斯腾 最佳答案 遗憾的是,如果不使用私有(private
我正在使用各种 lambda 表达式语法测试性能差异。如果我有一个简单的方法: public IEnumerable GetItems(int point) { return this.ite
Effective Java 第 2 版的第 16 条,支持组合优于继承 说如下 “如果父类(super class)在后续版本中获得了一个新方法并且你运气不好给子类一个具有相同签名的方法和不同的返回
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我想知道 Tic Tac Toe 有多少种可能性,所以我在网上搜索并找到了一个数学定理,它表明 Tic Tac Toe 中有 255168 种可能的游戏。 网站:http://www.se16.inf
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我想在单个值中存储 4 个 boolean 可能性。例如,我想要一个单一的值来判断一个人是否: IsSingle IsGraduate IsMale IsLookingForPartner 那么将它们
我的 Wicket 口应用程序遇到了一些问题。 问题出在一个名为 OverviewPage 的页面上,这里有一些面板,例如 ListPanel,其中有我的 RepeatingView。 这个Repea
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 7年前关闭。 Improve this questi
我是一名优秀的程序员,十分优秀!