【问题标题】:Scipy tridiagonal matrix using scipy.sparse.diags使用 scipy.sparse.diags 的 Scipy 三对角矩阵
【发布时间】:2018-10-21 21:13:12
【问题描述】:

难以从 numpy 数组生成三对角矩阵。我设法复制了here 给出的结果,但我无法将这些技术应用于我的问题。我也可能对scipy.sparse.diag的申请有误解。

就上下文而言,我正在研究一个需要生成三对角矩阵以使用有限差分数值求解常微分方程的问题。

from scipy.sparse import diags
import numpy as np

v1 = [3*i**2 +(i/2) for i in range(1, 6)]
v2 = [-(6*i**2 - 1) for i in range(1, 6)]
v3 = [3*i**2 -(i/2) for i in range(1, 6)]

matrix = np.array([v1, v2, v3])

matrix 等于。

array([[3.5,   13. ,   28.5,   50. ,   77.5],
       [-5. ,  -23. ,  -53. ,  -95. , -149. ],
       [2.5,   11. ,   25.5,   46. ,   72.5]])

在完成了 Scipy 文档和上面链接中的示例之后,我期待下面的代码产生 Tridiagonal_1,而是得到 Tridiagonal_2

diags(matrix, [-1,0,1], (5, 5)).toarray() 

预计Tridiagonal_1:

array([[  -5. ,    2.5 ,     0. ,    0. ,     0. ],
       [  13. ,   -23. ,    11. ,    0. ,     0. ],
       [   0. ,    28.5.,  -53. ,   25.5,     0. ],
       [   0. ,    0. ,     50 ,   -95.,     46. ],
       [   0. ,    0. ,      0. ,   77.5., -149. ]])

代码生成 Tridiagonal_2:

array([[  -5. ,    2.5,    0. ,    0. ,    0. ],
       [   3.5,  -23. ,   11. ,    0. ,    0. ],
       [   0. ,   13. ,  -53. ,   25.5,    0. ],
       [   0. ,    0. ,   28.5,  -95. ,   46. ],
       [   0. ,    0. ,    0. ,   50. , -149. ]])

我期待 offset = [-1,0,1] 将对角线条目向左移动,但第一个偏移量是将第一个 diag 移动到下一行。这是正确的还是我的代码中有错误导致了这种行为?

【问题讨论】:

  • diags 将输入视为数组列表,并在不移位的情况下使用它们。 spdiags 将二维数组映射到顶部溢出的对角线上。只是处理长度不同的对角线的不同约定。

标签: python matrix scipy


【解决方案1】:

您得到的输出似乎与文档的内容一致,尤其是其中的示例。 你可以使用spdiags获得你想要的结果:

from scipy import sparse

matrix = np.array([[3.5,   13. ,   28.5,   50. ,   77.5],
                   [-5. ,  -23. ,  -53. ,  -95. , -149. ],
                   [2.5,   11. ,   25.5,   46. ,   72.5]]

sparse.spdiags(matrix, (1,0,-1), 5, 5).T.A
# array([[  -5. ,    2.5,    0. ,    0. ,    0. ],
#        [  13. ,  -23. ,   11. ,    0. ,    0. ],
#        [   0. ,   28.5,  -53. ,   25.5,    0. ],
#        [   0. ,    0. ,   50. ,  -95. ,   46. ],
#        [   0. ,    0. ,    0. ,   77.5, -149. ]])

【讨论】:

    猜你喜欢
    • 2011-03-07
    • 1970-01-01
    • 2015-05-21
    • 2011-08-16
    • 1970-01-01
    • 2014-05-31
    • 2021-08-26
    • 2011-06-16
    • 1970-01-01
    相关资源
    最近更新 更多