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