Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.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 使用SciPy模块构建稀疏二维拉普拉斯矩阵_Python_Numpy_Scipy_Sparse Matrix - Fatal编程技术网

Python 使用SciPy模块构建稀疏二维拉普拉斯矩阵

Python 使用SciPy模块构建稀疏二维拉普拉斯矩阵,python,numpy,scipy,sparse-matrix,Python,Numpy,Scipy,Sparse Matrix,我需要构造二维拉普拉斯算子,它看起来像这样: ,在哪里 ,I是单位矩阵。到目前为止,我已经使用完成了,但我想知道是否有更聪明的方法使用。有人尝试过用这种方法构建二维拉普拉斯算子吗 我当前的创建方法是通过以下函数: from scipy.sparse import diags # Defining the size of the matrix nx = 3 ny = 3 N = nx*ny main_diag = [-4.0 for i in xrange(N)] side_diag = [

我需要构造二维拉普拉斯算子,它看起来像这样:

,在哪里

,I是单位矩阵。到目前为止,我已经使用完成了,但我想知道是否有更聪明的方法使用。有人尝试过用这种方法构建二维拉普拉斯算子吗

我当前的创建方法是通过以下函数:

from scipy.sparse import diags
# Defining the size of the matrix
nx = 3
ny = 3
N  = nx*ny
main_diag = [-4.0 for i in xrange(N)]
side_diag = []
for i in xrange(1,N):
    if i%4 == 0:
        side_diag.append(0)
    else:
        side_diag.append(1)
up_down_diag = [1.0 for i in xrange(N-4)]
diagonals = [main_diag,side_diag,side_diag,up_down_diag,up_down_diag]
laplacian = diags(diagonals, [0, -1, 1,nx,-nx], format="csr")
print laplacian.toarray()

我将列表的使用替换为数组:

import numpy as np
from scipy import sparse

nx, ny = 3, 3
N  = nx*ny
main_diag = np.ones(N)*-4.0
side_diag = np.ones(N-1)
side_diag[np.arange(1,N)%4==0] = 0
up_down_diag = np.ones(N-3)
diagonals = [main_diag,side_diag,side_diag,up_down_diag,up_down_diag]
laplacian = sparse.diags(diagonals, [0, -1, 1,nx,-nx], format="csr")
print laplacian.toarray()
生产

[[-4.  1.  0.  1.  0.  0.  0.  0.  0.]
 [ 1. -4.  1.  0.  1.  0.  0.  0.  0.]
 [ 0.  1. -4.  1.  0.  1.  0.  0.  0.]
 [ 1.  0.  1. -4.  0.  0.  1.  0.  0.]
 [ 0.  1.  0.  0. -4.  1.  0.  1.  0.]
 [ 0.  0.  1.  0.  1. -4.  1.  0.  1.]
 [ 0.  0.  0.  1.  0.  1. -4.  1.  0.]
 [ 0.  0.  0.  0.  1.  0.  1. -4.  0.]
 [ 0.  0.  0.  0.  0.  1.  0.  0. -4.]]
侧对角线的[1 1 0 1 1 0]图案是否正确

对于这样的一个小例子,它可能运行相同的速度,但是对于使用数组而不是列表的大维度,它应该更快——而且它与基础稀疏的numpy代码更加一致

像这样的统一对角线
对角线
看起来不错

我只对另外一个问题使用了块格式

coo
适用于由重叠较小的矩阵组成的矩阵,如有限元刚度。但是将对角线重新编辑成
coo
是一件乏味的事情

对于它的价值,
sparse.diags
使用
dia_矩阵
,将对角线列表转换为
dia
数据矩阵。你可以看看,但它的布局并不明显。要制作
csr
矩阵,
diags
将此
dia
格式转换为
coo
,然后转换为
csr
。但通常你不应该担心所有这些转换。使用对您的问题最有意义的格式,并让
sparse
处理转换细节


如果您想进一步探索块格式,您需要概述如何将问题视为块

N维拉普拉斯算子可以表示为1D拉普拉斯算子的克罗内克积:

import scipy.sparse as sp
def laplacian2D(N):
    diag=np.ones([N*N])
    mat=sp.spdiags([diag,-2*diag,diag],[-1,0,1],N,N)
    I=sp.eye(N)
    return sp.kron(I,mat,format='csr')+sp.kron(mat,I)

请展示您当前的方法,这样我们就不会意外地再次提出相同的建议:)`diads`很好,但您应该能够使用numpy方法创建
对角线的元素。对于这种布局,我也使用了
coo
。我在运行代码时遇到一个错误:ValueError:diagonallength(偏移量3处的索引3:5)与矩阵大小(9,9)不一致。有很好的拉普拉斯矩阵图和解释。(注意:此函数的一些函数有args
nx,ny
,一些
ny,nx
)侧对角线的模式是错误的-在3x3的情况下,它应该是[1 1 0 1 1 0 1 1 1],因此需要使用
侧对角线[np.arange(1,N)%nx==0]=0
。或者在您的版本
中,如果i%nx==0: