Scipy трехдиагональная матрица с использованием scipy.sparse.diags - PullRequest
0 голосов
/ 11 мая 2018

Сложно сгенерировать трехдиагональную матрицу из массивов numpy.Мне удалось воспроизвести результаты, приведенные здесь , но я не могу применить эти методы к моей проблеме.Я также могу неправильно понимать применение 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 к следующей строке.Это правильно или в моем коде есть ошибка, вызывающая такое поведение?

1 Ответ

0 голосов
/ 11 мая 2018

Вывод, который вы получаете, кажется, соответствует тому, что документы, в частности, примеры там говорят. Вы можете получить желаемый результат, используя 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. ]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...