2013-04-09 86 views
12

Tôi đã xây dựng một mã nhỏ mà tôi muốn sử dụng để giải quyết các vấn đề eigenvalue liên quan đến ma trận thưa thớt lớn. Nó hoạt động tốt, tất cả những gì tôi muốn làm bây giờ là thiết lập một số phần tử trong ma trận thưa thớt bằng 0, tức là những phần tử trong hàng trên cùng (tương ứng với việc thực hiện các điều kiện biên). Tôi chỉ có thể điều chỉnh các vectơ cột (C0, C1 và C2) bên dưới để đạt được điều đó. Tuy nhiên, tôi tự hỏi nếu có một cách trực tiếp hơn. Rõ ràng, chỉ mục NumPy không hoạt động với gói thưa thớt của SciPy.Làm thế nào để thay đổi các yếu tố trong ma trận thưa thớt trong SciPy của Python?

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() 

Đây là hình ảnh hóa của ma trận được tạo bởi mã bên trên. Tôi muốn thiết lập các phần tử trong hàng đầu tiên bằng không. enter image description here

+0

Tôi đã tìm được một công việc. Các định dạng tôi đang sử dụng (dia_matrix) là không tốt cho muốn tôi muốn đạt được. Tôi sẽ sử dụng csr_matrix để thay thế. Tôi có nên đóng bài đăng này sau đó không? – seb

+0

đó là một câu hỏi hay và có thể hữu ích cho những người khác trong tương lai. Làm thế nào về việc đăng những gì bạn tìm thấy như là một câu trả lời? – YXD

+0

ok, tôi sẽ làm điều đó – seb

Trả lời

13

Như được đề xuất trong nhận xét, tôi sẽ đăng câu trả lời mà tôi đã tìm thấy cho câu hỏi của riêng mình. Có một số lớp ma trận trong gói thưa thớt của SciPy, chúng được liệt kê here. Người ta có thể chuyển đổi ma trận thưa thớt từ lớp này sang lớp khác. Vì vậy, cho những gì tôi cần phải làm, tôi chọn để chuyển đổi ma trận thưa thớt của tôi vào csr_matrix lớp, đơn giản bằng cách

H = sp.csr_matrix(H) 

Sau đó, tôi có thể thiết lập các yếu tố trong hàng đầu tiên đến 0 bằng cách sử dụng các ký hiệu NumPy thường xuyên:

H[0,0] = 0 
H[0,1] = 0 
H[0,2] = 0 

Để hoàn thành, tôi đăng đoạn mã được sửa đổi đầy đủ bên dưới.

#SciPy Sparse linear algebra takes care of sparse matrix computations 
#http://docs.scipy.org/doc/scipy/reference/sparse.linalg.html 
import scipy.sparse as sp 
import scipy.sparse.linalg as la 

import numpy as np 
import matplotlib.pyplot as plt 

#discretize x-axis 
N = 1100 
x = np.linspace(-100,100,N) 
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. 

H = sp.spdiags([C2, C1, C0, C1, C2],[-2,-1,0,1,2], N, N) 
H *= hi2 * (- 1./12.) * (- 1./2.) 
H = sp.csr_matrix(H) 
H[0,0] = 0 
H[0,1] = 0 
H[0,2] = 0 

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

EV = la.eigsh(H,return_eigenvectors = False) 
+1

Nếu bạn có nhiều hàng hơn cột, csr nhanh, nhưng nếu bạn có nhiều cột hơn hàng, csc sẽ nhanh hơn. –