KML:ZHEEVD在1000行以上矩阵,仅求本征值时存在数值问题
收藏回复举报
KML:ZHEEVD在1000行以上矩阵,仅求本征值时存在数值问题
t('forum.solved') 已解决
新人帖
发表于2025-08-04 22:53:32
0 查看

问题描述

在调用 ZHEEVD 函数,并且设定 JOBZ = 'N' (仅求取本征值,不求取本征向量) 时、矩阵行数不小于 1000 时,KML 的计算结果似乎存在数值问题。

下述复现过程请参考文件夹 ajz34/issue-kml:issue-zheevd-eigvalsh

该计算用到的 libklapack_full.so 文件的生成,参考文档 生成完整的LAPACK

该问题是在开发 Rust 高维度张量库 RSTSR 时发现的,其影响的 单元测试 与函数 rt::linalg::eigvalsh 有关。

复现问题

首先通过 Python 生成 1000 大小、种子确定的随机矩阵 (在 ARM 或 x86 架构下,该矩阵是唯一确定的)。

$ python write-array.py

执行该文件将会生成 a-re.txt, a-im.txt, b-re.txt, b-im.txt。其程序输出是

a
[ 0.4967141530112327+0.1691718549745155j -0.1382643011711847-0.1215051558933564j  0.6476885381006925+1.156625273249692j  ...
 -0.1129797465226199+0.2370092464071751j  1.4691423708411055-0.1258228342816938j  0.4764302546832209+1.7817485451934088j]
b
[37.71524632905825  +0.j                 -0.4027274894681069+0.1829983223250189j  0.0534111557676109-0.4136163675842361j ...
  0.4764276577542991+0.4043710213380862j -0.3298414572135253+0.2659350061558057j 37.763241442118904 -0.0000000000000002j]
Standard: eigh A x = lambda x, eigenvalues (small 3):
[-87.97709122688904 -87.64868631688464 -87.15838530672293]
Generalized: eigh A x = lambda B x, eigenvalues (small 3):
[-62.867811044803986 -37.89013819573343  -28.954653152200805]

随后执行 C++ 编译与运行:

$ g++ issue.cpp -o issue -lklapack_full -L<path/of/klapack_full>; ./issue

实际执行 KML 时,其结果是

Standard Eigen (ZHEEVD), Eigenvalues only
W:  -88.162423740709770  -87.754885592482211  -87.204480541707923
Standard Eigen (ZHEEVD), Eigenvalues and Eigenvectors
W:  -87.977091226889044  -87.648686316884636  -87.158385306722934
Generalized Eigen (ZHEGVD), Eigenvalues only
W:  -62.867811044807105  -37.890138195733485  -28.954653152200652
Generalized Eigen (ZHEGVD), Eigenvalues and Eigenvectors
W:  -62.867811044807091  -37.890138195733492  -28.954653152200642

上述输出表明,在调用 ZHEEVD 且只计算本征值、而不计算本征向量时,结果存在数值误差

其他观察到的现象

  • 该问题只在矩阵大小为 1000 或以上时出现;在 999 或以下时,ZHEEVD 仅计算本征值的结果是正确的。
  • 在我的观察范围内,该问题仅出现在 ZHEEVD 的本征值计算。若计算本征向量、或计算广义本征值问题 (ZHEGVD)、或实 64 位浮点 (DSYEVD),似乎不会出现问题。不过由于我的测试不非常充分,这个结论不一定正确。

本帖最后由 匿名用户2025/08/05 10:07:12 编辑

我要发帖子