0

我想使用 Eigen 库的 ArpackWrapper 解决以下广义 EVP:

在此处输入图像描述

K_e 是 SPD。通常 K_g 是不定的和单数的,但对于这个 MVP,它只是不定的。此外,我对最小的特征值感兴趣。对于 300kx300k 的大型系统,我获得了合理的结果,但对于这个小例子,结果看起来很奇怪。读取的前 4 个结果特征值

 0.8987
-0.720851 
 0.607632 
 0.729297

对于请求较少的特征值solverEig.info()返回Eigen::NoConvergence

如果我使用 Maple 来计算我得到的特征值

 522.991427951073 
-175.66558721639944
  66.23707710214939
  -7.756864956770603
 355.6461914072188

可以将其插入问题陈述中以查看其正确性。

因此,我的问题是为什么它没有产生正确的结果?这是 arpack 还是 eigen wrapper 的问题?或者很可能是我对 arpack 或 eigen wrapper 的错误使用/理解。

版本:

特征 3.3.7

Arpack https://github.com/opencollab/arpack-ng不同的版本导致相同的行为

编码:

#include <iostream>
#include <Eigen/Core>
#include <Eigen/SparseCore>
#include "eigen3/unsupported/Eigen/ArpackSupport"
#include "eigen3/unsupported/Eigen/SparseExtra"
using namespace std;
int main() {

    Eigen::SparseMatrix<double> ke; 
    Eigen::SparseMatrix<double> kg; 

    Eigen::loadMarket(ke,"ke.txt"); //5x5 Matrix
    Eigen::loadMarket(kg,"kg.txt"); //5x5 Matrix


    Eigen::ArpackGeneralizedSelfAdjointEigenSolver<Eigen::SparseMatrix<double>> solverEig;

    solverEig.compute(ke,-kg,4,"SM",Eigen::ComputeEigenvectors);


    cout<<solverEig.eigenvalues()<<endl;
    return 0;
}

文件:

ke.txt

%%MatrixMarket matrix coordinate  real general
5 5 19
1 1 3.2621670111997303820317029021680355072021484375000000000000000000e+01
2 1 1.4310835055998653686515353911090642213821411132812500000000000000e+01
3 1 -2.0000000000000000000000000000000000000000000000000000000000000000e+00
5 1 -1.4310835055998653686515353911090642213821411132812500000000000000e+01
1 2 1.4310835055998653686515353911090642213821411132812500000000000000e+01
2 2 8.7155417527999333060506614856421947479248046875000000000000000000e+01
3 2 0.0000000000000000000000000000000000000000000000000000000000000000e+00
5 2 -7.1554175279993268432576769555453211069107055664062500000000000000e+00
1 3 -2.0000000000000000000000000000000000000000000000000000000000000000e+00
2 3 0.0000000000000000000000000000000000000000000000000000000000000000e+00
3 3 8.2000000000000000000000000000000000000000000000000000000000000000e+01
4 3 -8.0000000000000000000000000000000000000000000000000000000000000000e+01
3 4 -8.0000000000000000000000000000000000000000000000000000000000000000e+01
4 4 8.0000000000000000000000000000000000000000000000000000000000000000e+01
5 4 0.0000000000000000000000000000000000000000000000000000000000000000e+00
1 5 -1.4310835055998653686515353911090642213821411132812500000000000000e+01
2 5 -7.1554175279993268432576769555453211069107055664062500000000000000e+00
4 5 0.0000000000000000000000000000000000000000000000000000000000000000e+00
5 5 8.7155417527999333060506614856421947479248046875000000000000000000e+01

公斤.txt

%%MatrixMarket matrix coordinate  real general
5 5 19
1 1 -2.1389117730512491322159007722802925854921340942382812500000000000e-01
2 1 0.0000000000000000000000000000000000000000000000000000000000000000e+00
3 1 1.8999822924102233168142106478626374155282974243164062500000000000e-01
5 1 0.0000000000000000000000000000000000000000000000000000000000000000e+00
1 2 0.0000000000000000000000000000000000000000000000000000000000000000e+00
2 2 -2.1389117730512491322159007722802925854921340942382812500000000000e-01
3 2 0.0000000000000000000000000000000000000000000000000000000000000000e+00
5 2 -9.3693312577685552988704387189500266686081886291503906250000000000e-02
1 3 1.8999822924102233168142106478626374155282974243164062500000000000e-01
2 3 0.0000000000000000000000000000000000000000000000000000000000000000e+00
3 3 -3.8974822924103957877406401166808791458606719970703125000000000000e-01
4 3 1.9975000000001727484821856251073768362402915954589843750000000000e-01
3 4 1.9975000000001727484821856251073768362402915954589843750000000000e-01
4 4 1.8161606213113259955527212241577217355370521545410156250000000000e-01
5 4 0.0000000000000000000000000000000000000000000000000000000000000000e+00
1 5 0.0000000000000000000000000000000000000000000000000000000000000000e+00
2 5 -9.3693312577685552988704387189500266686081886291503906250000000000e-02
4 5 0.0000000000000000000000000000000000000000000000000000000000000000e+00
5 5 4.7505937470883541351440726430155336856842041015625000000000000000e-01

4

2 回答 2

1

也许在你的情况下,ARPACK的参数NCV默认是NEV(要计算的特征向量的nb),或者矩阵N的大小,它们都很小,但建议这个参数不应该小于20 (我真的会放至少 70 或 100 个……)。查看这些链接:

https://www.caam.rice.edu/software/ARPACK/UG/node136.html(NCV、NEV和备注4)

https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.linalg.eigs.html#scipy.sparse.linalg.eigs(ncv描述)

于 2020-08-12T12:12:07.120 回答
0

奇怪的是你得到的是真正的特征值,而不是一个复杂的对——你是否可能eigsh为对称问题而运行,它只看下半部分?

from scipy.sparse.linalg import eigs  # arpack

v0 = np.ones( K.shape[0] )  # else random

evals, V = eigs( A=K, M=M, k=3, tol=0, v0=v0 )  # k < n-1
print( "eigs evals:", evals )
eigcheck( K, evals, V, M=M )

K: 
 [[32.6217 14.3108 -2 0 -14.3108]
 [14.3108 87.1554 0 0 -7.15542]
 [-2 0 82 -80 0]
 [0 0 -80 80 0]
 [-14.3108 -7.15542 0 0 87.1554]]
M: 
 [[-0.213891 0 0.189998 0 0]
 [0 -0.213891 0 0 -0.0936933]
 [0.189998 0 -0.389748 0.19975 0]
 [0 0 0.19975 0.181616 0]
 [0 -0.0936933 0 0 0.475059]]
eigs evals: [ -1301.07 -2136.22j   -1301.07 +2136.22j   36.0965 -2477.99j ]
eigcheck : |Av - λv|_max [2e-13 2e-13 2e-13]

您能指出网络上类似的大问题吗?谢谢

于 2020-08-12T08:58:23.283 回答