标签: eigenvalue

Matlab VS Python - eig(A,B)VS sc.linalg.eig(A,B)

我有以下矩阵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确实很重要.

python matlab numpy scipy eigenvalue

5
推荐指数
1
解决办法
4093
查看次数

numpy/scipy特征分解的不稳定结果

我发现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)

numpy scipy eigenvalue

5
推荐指数
1
解决办法
869
查看次数

计算 scipy LinearOperator 的特征值时出错:“gmres 未收敛”

我正在尝试用 Scipy 解决一个大特征值问题,其中矩阵A很密集,但我可以计算它对向量的作用,而无需A显式组装。因此,为了避免矩阵 A 变大时出现内存问题,我想使用稀疏求解器scipy.sparse.linalg.eigsLinearOperator实现此操作。

应用于eigs显式 numpy 数组A效果很好。但是,如果我改为应用eigsa LinearOperator,则迭代求解器无法收敛。即使matvec的方法LinearOperator只是与给定矩阵 的矩阵向量乘法,情况也是如此A

下面附有一个说明失败的最小示例(我使用移位反转模式,因为我对最小的几个特征值感兴趣)。A这可以很好地计算随机矩阵的特征值,但当应用于LinearOperator直接从 转换而来的a 时会失败A。我尝试摆弄迭代求解器的参数(v0ncvmaxiter)但无济于事。

我错过了一些明显的东西吗?有办法让这项工作发挥作用吗?任何建议将不胜感激。非常感谢!

编辑:我应该澄清“让这个工作”的意思(谢谢,迪特里希)。下面的示例使用随机矩阵进行说明。然而,在我的应用程序中,我知道特征值几乎是纯虚的(或者如果我将矩阵乘以 ,则几乎是纯实的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)

numpy linear-algebra scipy eigenvalue

5
推荐指数
1
解决办法
1364
查看次数

LAPACK给了我不正确的特征值

我正在使用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)

fortran matrix eigenvalue lapack

5
推荐指数
1
解决办法
1369
查看次数

使用eigen3 /稀疏的稀疏特征值

有没有找到一个真正的特征向量的独特和有效的方式,对称的,非常大的,比方说10000x10000,在稀疏矩阵Eigen3?密集矩阵有一个特征值求解器,但它没有利用矩阵的性质,例如它的对称性.此外,我不想将矩阵存储在密集中.

或者(替代方案)是否有更好的(更好的文档记录)库来做到这一点?

c++ eigenvalue eigen3

5
推荐指数
2
解决办法
1750
查看次数

scipy eigh给出正半定矩阵的负特征值

我有一些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.float64np.float32在return语句hess_R,我得到

[ -5.42905303e+10   4.62854925e+16   5.15260506e+18]
Run Code Online (Sandbox Code Playgroud)

相反,所以我猜这是一种精确的问题.

有没有办法来解决这个问题?从技术上讲,我不需要使用eigh,但我认为这是我的其他错误的根本问题(取这些矩阵的平方根,得到NaN等)

python precision numpy scipy eigenvalue

5
推荐指数
1
解决办法
2220
查看次数

稀疏特征值:scipy.sparse.linalg.eigs比scipy.linalg.eigvals慢

我有一个特殊的现象,虽然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)

谁知道这会怎么样?

python numpy scipy eigenvalue sparse-matrix

5
推荐指数
1
解决办法
1254
查看次数

特征值/特征值:mingw-w64的部分过多

我想基于本征的一般特征值求解器(本征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)

eigenvalue eigenvector eigen mingw-w64 eigen3

5
推荐指数
0
解决办法
319
查看次数

如何使特征值和特征向量保持真实而不是复杂?

我尝试将n*100*1003d矩阵对角化Knumpy.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的,元素wv表演xxxxxxxxxe+xx+0.j。由于+0.j,使用时给出了复数wv进行了进一步的计算。

  1. 我以为是因为浮点数计算的算法错误,但是为什么呢?
  2. numpy.linalg是否使用LAPACK?是否有可能来自LAPACK的错误?
  3. 我该如何摆脱+0.j

python numpy matrix eigenvalue complex-numbers

5
推荐指数
1
解决办法
2165
查看次数

python中的任何函数如matlab中的polyeig()吗?

我正在尝试解决 python 中的多项式特征值问题,并且我需要像 matlab 中的 polyeig 这样的函数,是否有任何库能够执行此操作?

我试图解决的问题是这样的

c0+c1*alpha+c2*alpha**2+c3*alpha**3=0 其中 c 是矩阵,alpha 是给定问题的特征值。

python matlab scientific-computing eigenvalue

5
推荐指数
0
解决办法
499
查看次数