使用spsolve求解线性方程组

时间:2018-12-16 13:21:46

标签: sparse-matrix

我有一个非常大的方程组,其中矩阵的+ 1,+ 2,-1,-2对角线被填充,其他元素都为零(右上和左下的三个元素除外)矩阵角)。我尝试使用a-solve,但这不能给出正确的结果。请问如何正确使用此方法,或者对于这种稀疏矩阵,是否有更有效的算法,我可以寻求帮助吗?

from scipy.sparse import csc_matrix
from scipy.sparse.linalg import spsolve

def single_solition(x, alpha, shift, dx):
    return 12*((alpha*(1/np.cosh(alpha*(x-shift))))**2)
    
dx = 0.1
extent = 20
x = np.arange(-1*extent, extent, dx, dtype = float)
z = single_solition(x, 1, 0, dx)

def construct_Jacobian(dim, dx,z):
    J = np.zeros((dim, dim))
    
    minus_one = (z/(2*dx)) - (1/(dx**3))

    np.fill_diagonal(J[1:], minus_one)
    plus_one = -1*(z/(2*dx)) + (1/(dx**3))

    np.fill_diagonal(J[:,1:], plus_one[1:])
    
    minus_two = 0.5*(dx**3)
    np.fill_diagonal(J[2:], minus_two)
    np.fill_diagonal(J[:,2:], -minus_two)
    
    J[0, -2], J[1, -1] = minus_two, minus_two
    J[-1, 1], J[-2, 0] = -minus_two, -minus_two
    
    J[0, -1] = minus_one[-1]
    J[-1, 0] = plus_one[0]

    return J

J = construct_Jacobian(len(z), dx, z)
A = csc_matrix(J, dtype=float)
B = csc_matrix(np.transpose([-1*z]), dtype=float)
x = spsolve(A, B)
print(A.todense()*np.transpose(np.matrix(x)) + z) 

0 个答案:

没有答案