np.linalg.eig 为同一矩阵给出不同的特征向量

如何解决np.linalg.eig 为同一矩阵给出不同的特征向量

以下内容基于 Python 3.7.6。

我正在尝试使用一个名为 PySCF 的包来解决简单的计算化学问题。其中一项计算涉及对称为 Fock 矩阵的二维数组的评估。 PySCF 使用函数 get_fock() [1,2] 生成它。对于我的一个测试用例,Fock 矩阵评估为

F = [[ 2. -1.  0.  0.  0. -1.]
 [-1.  2. -1.  0.  0.  0.]
 [ 0. -1.  2. -1.  0.  0.]
 [ 0.  0. -1.  2. -1.  0.]
 [ 0.  0.  0. -1.  2. -1.]
 [-1.  0.  0.  0. -1.  2.]]

我尝试使用 energies,C = np.linalg.eig(F) 找到该矩阵的特征值和特征向量,它给出了以下特征向量矩阵:

C = [[-0.40824829  0.57735027  0.40824829  0.57735027  0.2468088   0.08939109]
 [ 0.40824829 -0.28867513  0.40824829  0.28867513 -0.57541553 -0.44927503]
 [-0.40824829 -0.28867513  0.40824829 -0.28867513  0.32860673 -0.53866612]
 [ 0.40824829  0.57735027  0.40824829 -0.57735027  0.2468088  -0.08939109]
 [-0.40824829 -0.28867513  0.40824829 -0.28867513 -0.57541553  0.44927503]
 [ 0.40824829 -0.28867513  0.40824829  0.28867513  0.32860673  0.53866612]]

然而,np.matmul(np.matmul(C.T,F),C) 然后应该返回一个对角矩阵,其元素是 F 的特征值。这不是发生的事情,但我应该注意到 F正确特征值(单独验证)确实存储在 energies 中。

然后我为另一个矩阵 F0 分配了与 F 完全相同的元素(这次,硬编码到脚本中)。在这种情况下,np.linalg.eig(F0) 实际上给了我一个不同的特征向量矩阵:

C0 = [[ 0.23192061  0.41790651 -0.52112089 -0.23192061  0.52112089 -0.41790651]
 [-0.41790651 -0.52112089  0.23192061 -0.41790651  0.23192061 -0.52112089]
 [ 0.52112089  0.23192061  0.41790651 -0.52112089 -0.41790651 -0.23192061]
 [-0.52112089  0.23192061 -0.41790651 -0.52112089 -0.41790651  0.23192061]
 [ 0.41790651 -0.52112089 -0.23192061 -0.41790651  0.23192061  0.52112089]
 [-0.23192061  0.41790651  0.52112089 -0.23192061  0.52112089  0.41790651]]

为了确保我没有疯,我检查了 typeFF0<class 'numpy.ndarray'> 在这两种情况下。我还打印了 F-F0 ,正如预期的那样,它只是一个 0 矩阵。我在下面粘贴了我的脚本,它改编自 PySCF 示例脚本之一 [3]。

import numpy as np
from numpy import zeros,matrix
from pyscf import gto,scf,ao2mo,cc,tools

hubbard_U = 2.
hubbard_t = 1.

mol = gto.M(verbose=4)
n = n_basis = 6
mol.nelectron = 12
mol.verbose = 9
mol.incore_anyway = True

h1 = np.zeros((n,n))
for i in range(n-1):
    h1[i,i+1] = h1[i+1,i] = -hubbard_t # -ve Hubbard t
h1[n-1,0] = h1[0,n-1] = -hubbard_t # periodicity

eri = np.zeros((n,n,n))
for i in range(n):
    eri[i,i,i] = hubbard_U # Hubbard U

mf = scf.RHF(mol)
mf.conv_tol = 1e-8
mf.get_hcore = lambda *args: h1
mf.get_ovlp = lambda *args: np.eye(n)
mf._eri = ao2mo.restore(8,eri,n)
mf.kernel(np.ones((n,n)))

F = np.copy(mf.get_fock())

print('F =')
print(F)
energies,C = np.linalg.eig(F)
print('\nC =',C)
F0 = [[2.,-1.,0.,0.],[-1.,2.,[ 0.,-1.],2.]]
print('\nF - F0 =',F-F0)

energies0,C0 = np.linalg.eig(F0)
print('\nC0 =',C0)

完全相同的矩阵怎么可以给出两组完全不同的特征向量? 如果正在进行某种简单的酉变换,这不应该影响实值矩阵的 np.matmul(np.matmul(C.T,C) 关系(如上所述)。 我完全迷失在这里,不能帮助但认为我错过了一些非常基本的东西。任何帮助将不胜感激。

解决方法

嗯,你的矩阵是对称的,所以它保证是可对角化的,有一些 V.T @ F @ VV 是一个正交矩阵。矩阵 V 在对列的 -1 进行置换和乘法之前是唯一的。 (或者在对应于相同特征值的子空间上旋转,这里不是这种情况,因为您有不同的特征向量)。

numpy.linalg.eig 的文档说右特征值没有保证的顺序,特征向量有单位长度。这给了我们两个健全性检查。

        D,W = np.linalg.eig(F)
        assert(np.all(np.abs( W @ W.T - np.eye(W.shape[0])) < tol))
        assert(np.all(np.abs( F @ W - W @ np.diag(D)) < tol))

我检查了你的两个矩阵,确实 C0F 的特征向量矩阵,而 C 不是。

plt.subplot(121),plt.imshow(C.T @ F0 @ C),plt.title('$C^T F C$')
plt.subplot(122),plt.imshow(C0.T @ F0 @ C0),plt.title('$C_0 F C_0$')

Congruency transform on F

此时可能是输入矩阵不同的情况。但是当我们检查正交性 C @ C.T ~ I 时,我会说它违反了 eig 的陈述。


plt.subplot(121),plt.imshow(C @ C.T),plt.title('$C C^T$')
plt.subplot(122),plt.imshow(C0 @ C0.T),plt.title('$C_0 C_0^T$')

Ortogonality checks

这些库在很多地方使用,如果你能重现失败,这将是一个重要的 (BUG) 发现。

我针对维度 2 到 10 的随机矩阵测试了上述断言,并且上述两个条件在 1e-10 的容差内有效。可能与F的结构有关?还用你的 F0 尝试了数千次带有小的附加噪声,并且效果很好。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res