我有以下矩阵sigma和sigmad:
西格玛:
1.9958 0.7250
0.7250 1.3167
Run Code Online (Sandbox Code Playgroud)
sigmad:
4.8889 1.1944
1.1944 4.2361
Run Code Online (Sandbox Code Playgroud)
如果我试图解决python中的广义特征值问题,我得到:
d,V = sc.linalg.eig(matrix(sigmad),matrix(sigma))
Run Code Online (Sandbox Code Playgroud)
五:
-1 -0.5614
-0.4352 1
Run Code Online (Sandbox Code Playgroud)
如果我尝试在matlab中解决ge问题,我会得到:
[V,d]=eig(sigmad,sigma)
Run Code Online (Sandbox Code Playgroud)
五:
-0.5897 -0.5278
-0.2564 0.9400
Run Code Online (Sandbox Code Playgroud)
但是d确实很重要.
我发现scipy.linalg.eig有时会产生不一致的结果.但不是每一次.
>>> import numpy as np
>>> import scipy.linalg as lin
>>> modmat=np.random.random((150,150))
>>> modmat=modmat+modmat.T # the data i am interested in is described by real symmetric matrices
>>> d,v=lin.eig(modmat)
>>> dx=d.copy()
>>> vx=v.copy()
>>> d,v=lin.eig(modmat)
>>> np.all(d==dx)
False
>>> np.all(v==vx)
False
>>> e,w=lin.eigh(modmat)
>>> ex=e.copy()
>>> wx=w.copy()
>>> e,w=lin.eigh(modmat)
>>> np.all(e==ex)
True
>>> e,w=lin.eigh(modmat)
>>> np.all(e==ex)
False
Run Code Online (Sandbox Code Playgroud)
虽然我不是最好的线性代数向导,但我确实理解特征分解固有地受到奇怪的舍入误差的影响,但我不明白为什么重复计算会导致不同的值.但我的结果和可重复性是不同的.
问题的本质究竟是什么 - 好吧,有时结果是可以接受的,有时它们不是.这里有些例子:
>>> d[1]
(9.8986888573772465+0j)
>>> dx[1]
(9.8986888573772092+0j)
Run Code Online (Sandbox Code Playgroud)
上面的差异~3e-13看起来并不是什么大不了的事.相反,真正的问题(至少对于我目前的项目而言)是某些特征值似乎无法在正确的符号上达成一致.
>>> np.all(np.sign(d)==np.sign(dx))
False
>>> np.nonzero(np.sign(d)!=np.sign(dx))
(array([ 38, 39, 40, 41, 42, …Run Code Online (Sandbox Code Playgroud) 我正在尝试用 Scipy 解决一个大特征值问题,其中矩阵A很密集,但我可以计算它对向量的作用,而无需A显式组装。因此,为了避免矩阵 A 变大时出现内存问题,我想使用稀疏求解器scipy.sparse.linalg.eigs来LinearOperator实现此操作。
应用于eigs显式 numpy 数组A效果很好。但是,如果我改为应用eigsa LinearOperator,则迭代求解器无法收敛。即使matvec的方法LinearOperator只是与给定矩阵 的矩阵向量乘法,情况也是如此A。
下面附有一个说明失败的最小示例(我使用移位反转模式,因为我对最小的几个特征值感兴趣)。A这可以很好地计算随机矩阵的特征值,但当应用于LinearOperator直接从 转换而来的a 时会失败A。我尝试摆弄迭代求解器的参数(v0、ncv、maxiter)但无济于事。
我错过了一些明显的东西吗?有办法让这项工作发挥作用吗?任何建议将不胜感激。非常感谢!
编辑:我应该澄清“让这个工作”的意思(谢谢,迪特里希)。下面的示例使用随机矩阵进行说明。然而,在我的应用程序中,我知道特征值几乎是纯虚的(或者如果我将矩阵乘以 ,则几乎是纯实的1j)。我对 10-20 个最小幅度特征值感兴趣,但如果我指定 ,该算法表现不佳(即,即使对于较小的矩阵大小也不会停止)which='SM'。因此,我通过传递参数来使用移位反转模式sigma=0.0, which='LM'。我很乐意尝试不同的方法,只要它允许我计算一堆最小幅度的特征值。
from scipy.sparse.linalg import eigs, LinearOperator, aslinearoperator
import numpy as np
# Set a seed for reproducibility
np.random.seed(0)
# Size of …Run Code Online (Sandbox Code Playgroud) 我正在使用LAPACK库中的DSYEV和DSYEVD来查找特征值和特征向量(编译语法:gfortran -llapack).但是,我找到-0.44,0.35,0.88了特定矩阵的错误特征值().出了什么问题?
可以很容易地看出矩阵具有零行列式,因此至少一个特征值必须为零.
这是我的代码(希望它不是太大):
Program Real_Eigenvec
implicit none
integer, parameter:: n=3
integer:: i,j, flag
real*8:: A(n,n),X(n,n)
real*8:: lambda(n)
real*8, parameter:: p=0.5d0/dsqrt(2.d0), q=1.d0-1.d0/dsqrt(2.d0)
Print*,'Enter flag: 0 for DSYEV, 1 for DSYEVD'
Read*, flag
A= transpose(reshape((/ 0.d0, 1.d0, 0.d0, p, q, p, 0.5d0, 0.0d0, 0.5d0 /), shape(A)))
print*,'Dimension of the matrix, n=',int(sqrt(float(size(A))))
Print*,'A matrix in full form:'
Do i=1,n
print 100, (A(i,j),j=1,n)
End Do
call Eigen(A,lambda,X,n,flag)
! Print the eigenvalues and eigenvectors.
PRINT 200
DO i = 1, n
PRINT …Run Code Online (Sandbox Code Playgroud) 有没有找到一个真正的特征向量的独特和有效的方式,对称的,非常大的,比方说10000x10000,在稀疏矩阵Eigen3?密集矩阵有一个特征值求解器,但它没有利用矩阵的性质,例如它的对称性.此外,我不想将矩阵存储在密集中.
或者(替代方案)是否有更好的(更好的文档记录)库来做到这一点?
我有一些scipy eigh函数的问题,返回正半定矩阵的负特征值.以下是MWE.
该hess_R函数返回一个正半定矩阵(它是秩1矩阵和对角矩阵的总和,两者都带有非负数项).
import numpy as np
from scipy import linalg as LA
def hess_R(x):
d = len(x)
H = np.ones(d*d).reshape(d,d) / (1 - np.sum(x))**2
H = H + np.diag(1 / (x**2))
return H.astype(np.float64)
x = np.array([ 9.98510710e-02 , 9.00148922e-01 , 4.41547488e-10])
H = hess_R(x)
w,v = LA.eigh(H)
print w
Run Code Online (Sandbox Code Playgroud)
印刷的特征值是
[ -6.74055241e-271 4.62855397e+016 5.15260753e+018]
Run Code Online (Sandbox Code Playgroud)
如果我更换np.float64与np.float32在return语句hess_R,我得到
[ -5.42905303e+10 4.62854925e+16 5.15260506e+18]
Run Code Online (Sandbox Code Playgroud)
相反,所以我猜这是一种精确的问题.
有没有办法来解决这个问题?从技术上讲,我不需要使用eigh,但我认为这是我的其他错误的根本问题(取这些矩阵的平方根,得到NaN等)
我有一个特殊的现象,虽然scipy.sparse.linalg.eigs对于稀疏矩阵应该更快,我得到它比正常eigvals方法运行得慢scipy:
In [4]: %timeit m.calc_pde_numerical_jacobian(m.initial_state)
10 loops, best of 3: 41.2 ms per loop
In [5]: %timeit m.calc_pde_analytic_jacobian(m.initial_state)
1000 loops, best of 3: 1.42 ms per loop
In [6]: %timeit m.calc_analytic_pde_eigs(m.initial_state)
1 loop, best of 3: 374 ms per loop
In [7]: %timeit m.calc_numeric_pde_eigs(m.initial_state)
1 loop, best of 3: 256 ms per loop
Run Code Online (Sandbox Code Playgroud)
因此,该方法calc_pde_numerical_jacobian构造了我的方程组的雅可比行列式的密集矩阵,并且calc_pde_analytic_jacobian正在构造雅可比分析(csc格式)的稀疏矩阵.虽然分析方法在构造雅可比矩阵的稀疏矩阵方面工作得更快,但当使用scipy的特征值求解方法时,稀疏矩阵特征值方法较慢.我用来计算特征值的函数是这样的:
def calc_numeric_pde_eigs(self,state):
return linalg.eigvals(self.calc_pde_numerical_jacobian(state))
def calc_analytic_pde_eigs(self,state):
return sparse.linalg.eigs(self.calc_pde_analytic_jacobian(state),k=6,which='LR',return_eigenvectors=False)
Run Code Online (Sandbox Code Playgroud)
谁知道这会怎么样?
我想基于本征的一般特征值求解器(本征3.3.3)来编译以下示例:
#include <iostream>
#include <Eigen/Eigenvalues>
int main()
{
Eigen::Matrix4f A;
A << -0.75, 0, -1.5, -1,
-1.25, 0, -1.5, -1,
-0.75, 0, -1, -1,
-0.25, 0, -1.5, -1;
Eigen::Matrix4f G;
G << 1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 0;
std::cout << "A = " << A << std::endl;
std::cout << "G = " << G << std::endl;
Eigen::GeneralizedEigenSolver<Eigen::Matrix4f> sol;
sol.compute(A.transpose()*A, G); // compute generalized eigenvalues
std::cout << "alphas = " << …Run Code Online (Sandbox Code Playgroud) 我尝试将n*100*1003d矩阵对角化K,numpy.linalg.eig并获得特征值w和特征向量v。矩阵是100*100,但是我想通过广播来做,这就是n我设置的数字。矩阵不是厄米矩阵。
w,v=np.linalg.eig(K)
Run Code Online (Sandbox Code Playgroud)
起初,我尝试了n=1000,我得到真正的特征向量,即xxxxxxxxxe+xx,但当我尝试n=2000的,元素w和v表演xxxxxxxxxe+xx+0.j。由于+0.j,使用时给出了复数w并v进行了进一步的计算。
+0.j?我正在尝试解决 python 中的多项式特征值问题,并且我需要像 matlab 中的 polyeig 这样的函数,是否有任何库能够执行此操作?
我试图解决的问题是这样的
c0+c1*alpha+c2*alpha**2+c3*alpha**3=0
其中 c 是矩阵,alpha 是给定问题的特征值。