0

我对以下问题有点困惑:

我正在计算量子通道的固定点,这意味着我想计算特定矩阵的前导特征向量。该矩阵的维数为 n^2 xn^2 并以这样的方式定义:重新整形为形状为 nxn 的矩阵的前导特征值是正矩阵(具有正特征值的自伴随)。

但是,如果我这样做,scipy.sparse.linalg.eigs我会得到错误的结果。但是,精确计算(使用scipy.linalg.eig)可以正常工作。我试着玩弄求解器的参数kncv但没有让 i 正常工作,除非我k=n**2在这种情况下设置eigs只是指eig. 但是,如果我确实想到通道(super_op在下面的脚本中)实际上被编码为LinearOperator. 所以我依靠使用eigs:/

有人知道如何正确运行吗?

提前感谢大家!

import numpy as np
from numpy.random import rand
from numpy import tensordot as td
from scipy.sparse.linalg import eigs
from scipy.linalg import eig


n = 16
d = 3

kraus_op = .5 - rand(n, d, n) + 1j * (.5 - rand(n, d, n))
super_op = td(kraus_op, kraus_op.conj(), [[1], [1]]).transpose(0, 2, 1, 3)

########
# Sparse
########

vals, vecs = eigs(super_op.reshape(n**2, n**2), k=n*(n-1), which='LM')

rho = vecs[:,0].reshape(n, n)

print('is self adjoint: ', np.allclose(rho, rho.conj().T))

super_op_times_rho = td(super_op, rho, [[2, 3], [0, 1]])

print('super_op(rho) == lambda * rho :', np.allclose(rho, super_op_times_rho/vals[0]))

########
# Exact
########

vals, vecs = eig(super_op.reshape(n**2, n**2))

rho = vecs[:,0].reshape(n, n)

print('is self adjoint: ', np.allclose(rho, rho.conj().T))

super_op_times_rho = td(super_op, rho, [[2, 3], [0, 1]])

print('super_op(rho) == lambda * rho :', np.allclose(rho, super_op_times_rho/vals[0]))

结果是:

is self adjoint:  False
super_op(rho) == lambda * rho : True
is self adjoint:  True
super_op(rho) == lambda * rho : True

为了完整性:

Python 3.5.2 numpy 1.16.1
scipy 1.2.1

4

1 回答 1

0

毕竟我在同事的帮助下找到了解决方案:

虽然eig给出了特征向量 (1) 排序(按大小)和 (2),使得第一个条目是实数,eigs但有另一个排序,不能像 in 那样eig,也不会正则化特征向量的复杂相位。校正相位很容易通过将张量除以第一个条目的相位来完成(对应于确保第一个对角元素是真实的,以摆脱选择特征向量的复杂相位并使 Hermiticity 成为可能的自由......) .

因此,稀疏情况的更正代码片段是:

vals, vecs = eigs(super_op.reshape(chi**2, chi**2), k=chi*(chi-1), which='LM')
# find the index corresponding to the largest eigenvalue
arg = np.argmax(np.abs(vals))
rho = vecs[:,arg].reshape(chi, chi)
# regularize the output array 
rho *= np.abs(rho[0, 0])/rho[0, 0]
于 2019-03-12T16:10:15.750 回答