Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 病态矩阵的矩阵逆元素_Python_Scipy_Eigenvector - Fatal编程技术网

Python 病态矩阵的矩阵逆元素

Python 病态矩阵的矩阵逆元素,python,scipy,eigenvector,Python,Scipy,Eigenvector,我试图找到病态矩阵的矩阵逆元素 考虑复非厄米矩阵M,我知道这个矩阵有一个零特征值,因此是奇异的。但是,我需要找到矩阵元素的和:v@f(M) @u,其中u和v都是向量,f(x)=1/x(实际上是矩阵的逆)。我知道第零特征值对这个和没有贡献,所以奇点没有明确的问题。然而,我的代码在数值上是非常不稳定的,我认为这是在寻找系统特征值时出错的结果 从构建初步矩阵开始: import numpy as np import scipy as sc g0 = np.array([0,0,1]) g1 = np

我试图找到病态矩阵的矩阵逆元素

考虑复非厄米矩阵
M
,我知道这个矩阵有一个零特征值,因此是奇异的。但是,我需要找到矩阵元素的和:
v@f(M) @u
,其中u和v都是向量,f(x)=1/x(实际上是矩阵的逆)。我知道第零特征值对这个和没有贡献,所以奇点没有明确的问题。然而,我的代码在数值上是非常不稳定的,我认为这是在寻找系统特征值时出错的结果

从构建初步矩阵开始:

import numpy as np
import scipy as sc

g0 = np.array([0,0,1])
g1 = np.array([0,1,0])
e0 = np.array([1,0,0])

sm = np.outer(g0, e0)
sp = np.outer(e0, g0)



def spre(op):
    return np.kron(np.eye(op.shape[0]),op)

def spost(op):
    return np.kron(op.T,np.eye(op.shape[0]))

def sprepost(op1,op2):
    return np.kron(op1.T,op2)

sm_reg = spre(sm)
sp_reg = spre(sp)

spsm_reg=spre(sp@sm)

hil_dim = int(g0.shape[0])
cav_proj= np.eye(hil_dim).reshape(hil_dim**2,)

rho0 =(np.outer(e0,e0)).reshape(hil_dim**2,)




def ham(g):
    return g * (np.outer(g1,e0) + np.outer(e0, g1))


def lind_op(A):
    L = 2 * sprepost(A,A.conj().T) - spre(A.conj().T @ A)
    L += - spost(A.conj().T @ A)
    return L



def JC_lio(g, kappa, gamma):
    unit = -1j * (spre(ham(g)) - spost(ham(g)))
    lind = gamma * lind_op(np.outer(g0 , e0)) + kappa * lind_op(np.outer(g0 , g1))
    return unit + lind
现在定义一个函数,首先查找左右特征值,然后查找矩阵元素之和:

def power_int(g, kappa, gamma):

    # Construct the non-Hermitian matrix of interest
    lio = JC_lio(g,kappa,gamma)

    #Find its left and right eigenvectors:
    ev, left, right = scipy.linalg.eig(lio, left=True,right=True)

    # Find the appropriate normalisation factors
    norm = np.array([(left.conj().T[ii]).dot(right.conj().T[ii]) for ii in range(len(ev))])

    #Find the similarity transformation for the problem
    P = right
    Pinv = (left/norm).conj().T


    #find the projectors for the Eigenbasis
    Proj = [np.outer(P.conj().T[ii],Pinv[ii]) for ii in range(len(ev))]


    #Find the relevant matrix elements between the Eigenbasis and the projectors --- this is where the zero eigenvector gets removed
    PowList = [(spsm_reg@ Proj[ii] @ rho0).dot(cav_proj) for ii in range(len(ev))]

    #apply the function
    Pow = 0

    for ii in range(len(ev)):
        if PowList[ii]==0:
            Pow = Pow
        else:
            Pow += PowList[ii]/ev[ii]


    return -np.pi * np.real(Pow)


#example run:

grange = np.linspace(0.001,10,40)

dat = np.array([power_int(g, 1, 1) for g in grange])
运行这段代码会导致非常不稳定的结果,我希望得到一条平滑的曲线。我怀疑这个错误是由于确定特征向量的准确性差造成的,但我似乎找不到关于这个的任何文档。欢迎有任何见解