21

大きな疎行列を含む固有値問題を解くために使用したい小さなコードを作成しました。うまくいきました。ここでやりたいことは、スパース行列のいくつかの要素、つまり一番上の行 (境界条件の実装に対応する) をゼロに設定することだけです。それを実現するために、以下の列ベクトル (C0、C1、および C2) を調整するだけです。しかし、もっと直接的な方法があるのではないかと考えました。明らかに、NumPy のインデックス作成は SciPy のスパース パッケージでは機能しません。

import scipy.sparse as sp
import scipy.sparse.linalg  as la
import numpy as np
import matplotlib.pyplot as plt

#discretize x-axis
N = 11
x = np.linspace(-5,5,N)
print(x)
V = x * x / 2
h = len(x)/(N)
hi2 = 1./(h**2)
#discretize Schroedinger Equation, i.e. build 
#banded matrix from difference equation
C0 = np.ones(N)*30. + V
C1 = np.ones(N) * -16.
C2 = np.ones(N) * 1.
diagonals = np.array([-2,-1,0,1,2])
H = sp.spdiags([C2, C1, C0,C1,C2],[-2,-1,0,1,2], N, N)
H *= hi2 * (- 1./12.) * (- 1. / 2.)
#solve for eigenvalues
EV = la.eigsh(H,return_eigenvectors = False)

#check structure of H
plt.figure()
plt.spy(H)
plt.show()

これは、上記のコードによって構築されたマトリックスの視覚化です。最初の行の要素をゼロに設定したい。ここに画像の説明を入力

4

2 に答える 2

1

scipy で要素を変更するには、単純な方法よりも使用するlil_matrix方がはるかに効率的です。numpy

H = sp.csr_matrix(H)
HL = H.tolil()
HL[1,1] = 5  # same as the numpy indexing notation
print HL
print HL.todense() # if numpy style matrix is required
H = HL.tocsr()    # if csr is required
于 2021-09-24T06:43:29.587 に答える