Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.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.sparse'构造简单线性系统`_Python_Numpy_Scipy_Sparse Matrix - Fatal编程技术网

Python 使用'scipy.sparse'构造简单线性系统`

Python 使用'scipy.sparse'构造简单线性系统`,python,numpy,scipy,sparse-matrix,Python,Numpy,Scipy,Sparse Matrix,想象一个简单的3x3矩阵,我在它上面施加以下“边界条件”。下面是一个数组,显示了相应的索引(如果展平)和边界值 I = B = 0 3 6 3 0 1 1 4 7 3 0 1 2 5 8 3 0 1 很容易看出,展平的边值数组 b = 3 3 3 0 0 0 1 1 1 我还有一个连接性结构C,以一组对的形式给出 C = 0 0 1 1 2 3 3 4 4 5 6 7 1 3 2 4 5 4 6 5 7 8 6 8 我想构造一个表示这个线性系统的矩阵a,使用sps

想象一个简单的3x3矩阵,我在它上面施加以下“边界条件”。下面是一个数组,显示了相应的索引(如果展平)和边界值

I =     B = 
0 3 6   3 0 1
1 4 7   3 0 1
2 5 8   3 0 1
很容易看出,展平的边值数组

b = 
3 3 3 0 0 0 1 1 1
我还有一个连接性结构C,以一组对的形式给出

C = 
0 0 1 1 2 3 3 4 4 5 6 7
1 3 2 4 5 4 6 5 7 8 6 8
我想构造一个表示这个线性系统的矩阵a,使用spsolve(a,b)得到

A =
 1  0  0  0  0  0  0  0  0
 0  1  0  0  0  0  0  0  0
 0  0  1  0  0  0  0  0  0
 1  0  0 -3  1  0  1  0  0
 0  1  0  1 -4  1  0  1  0
 0  0  1  0  1 -3  0  0  1
 0  0  0  0  0  0  1  0  0
 0  0  0  0  0  0  0  1  0
 0  0  0  0  0  0  0  0  1

x = 
3 3 3 2 2 2 1 1 1
这是非常简单的使用numpy和操作密集矩阵,零列,等等。然而,随着矩阵变得越来越大,我开始耗尽内存,解算器的速度非常慢

我想我应该用以下逻辑构建稀疏矩阵:

  • 使用连接性数组和
    np.ones\u like
    其中一个向量初始化矩阵
  • 添加矩阵及其转置以填充LD区域
  • 其中
    b
    为非零:清除行并在对角线处放置1(这表示初始条件)
  • 其中
    b
    为零:沿
    轴=1对矩阵求和,并将求和的负值放入每个对角线中(这将平衡汇和源)

  • 这在
    numpy
    中非常有效,但我发现在初始化
    sparse
    矩阵之后,绝对不可能对它们做任何有用的事情。它们不处理项目删除、转置等操作。我能了解一下这些操作吗?

    我想我到目前为止都会这么做

    看起来有点模糊,好像我做错了什么

    b = np.array([3, 3, 3, 0, 0, 0, 1, 1, 1])
    i = (0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 7)
    j = (1, 3, 2, 4, 5, 4, 6, 5, 7, 8, 7, 8)
    
    f = b!=0
    A = sparse.lil_matrix((b.size, b.size))
    A[f,f] = 1
    C = sparse.coo_matrix((np.ones_like(i+j), (i+j,j+i)), shape=(b.size, b.size)).tolil()
    D = sparse.diags(np.asarray(C.sum(axis=1).T)[0], 0).tocsr()
    A[~f,:] = C[~f, :] - D[~f]
    
    print A.toarray()
    

    是的!我今天要把它写下来。