如何在 Python 中为稀疏矩阵在整个对角线上放置一个条目

How to put one entry across an entire diagonal for a sparse matrix in Python

我正在寻求构建一个矩阵,我将计算其逆矩阵。这将用于求解非线性抛物线 PDE 的隐式方法。我目前的计算是,这将变得显而易见,给了我一个奇异(不可能的逆)矩阵。对于上下文,实际上矩阵的尺寸为 30 x 30,但在这些示例中,我使用较小的矩阵进行测试。

假设我想创建一个大的方形稀疏矩阵。使用 spdiags 仅允许您分别输入主对角线、下对角线和上对角线的成员。那么如何才能使每条对角线的所有条目都具有一个值?

示例代码:

import numpy as np 
from scipy.sparse import spdiags
from numpy.linalg import inv 

updiag = -0.25
diag = 0.5
lowdiag = -0.25
        
Jdata = np.array([[diag], [lowdiag], [updiag]])
Diags = [0, -1, 1]
J = spdiags(Jdata, Diags, 3, 3).toarray() 
print(J)
inverseJ = inv(J)
print(inverseJ)

这将生成一个 3 x 3 矩阵,但仅包含给定的每个对角线的第一个条目。我想知道使用 np.fill_diagonal 但这首先需要一个矩阵并且只需要主对角线。我是不是误会了什么?

spdiags 的第一个参数是用作对角线的值矩阵。你可以这样使用它:

Jdata = np.array([3 * [diag], 3 * [lowdiag], 3 * [updiag]])
Diags = [0, -1, 1]
J = spdiags(Jdata, Diags, 3, 3).toarray() 
print(J)
# [[ 0.5  -0.25  0.  ]
#  [-0.25  0.5  -0.25]
#  [ 0.   -0.25  0.5 ]]