scipy.linalg.

fiedler#

scipy.linalg.fiedler(a)[источник]#

Возвращает симметричную матрицу Фидлера

Для заданной последовательности чисел a, Матрицы Фидлера имеют структуру F[i, j] = np.abs(a[i] - a[j]), и, следовательно, нулевые диагонали и неотрицательные элементы. Матрица Фиделера имеет доминирующее положительное собственное значение, а другие собственные значения отрицательны. Хотя это не всегда справедливо, для определенных входных данных обратная матрица и определитель могут быть выведены явно, как указано в [1].

Параметры:
a(…, n,) array_like

Массив коэффициентов. N-мерные массивы обрабатываются как пакет: каждый срез вдоль последней оси — это одномерный массив коэффициентов.

Возвращает:
F(…, n, n) ndarray

Матрица Фидлера. Для пакетного ввода каждый срез формы (n, n) вдоль последних двух измерений выхода соответствует срезу формы (n,) вдоль последнего измерения входных данных.

Смотрите также

circulant, toeplitz

Примечания

Добавлено в версии 1.3.0.

Ссылки

[1]

J. Todd, "Basic Numerical Mathematics: Vol.2 : Numerical Algebra", 1977, Birkhauser, DOI:10.1007/978-3-0348-7286-7

Примеры

>>> import numpy as np
>>> from scipy.linalg import det, inv, fiedler
>>> a = [1, 4, 12, 45, 77]
>>> n = len(a)
>>> A = fiedler(a)
>>> A
array([[ 0,  3, 11, 44, 76],
       [ 3,  0,  8, 41, 73],
       [11,  8,  0, 33, 65],
       [44, 41, 33,  0, 32],
       [76, 73, 65, 32,  0]])

Явные формулы для определителя и обратной матрицы, по-видимому, справедливы только для монотонно возрастающих/убывающих массивов. Обратите внимание на трехдиагональную структуру и углы.

>>> Ai = inv(A)
>>> Ai[np.abs(Ai) < 1e-12] = 0.  # cleanup the numerical noise for display
>>> Ai
array([[-0.16008772,  0.16666667,  0.        ,  0.        ,  0.00657895],
       [ 0.16666667, -0.22916667,  0.0625    ,  0.        ,  0.        ],
       [ 0.        ,  0.0625    , -0.07765152,  0.01515152,  0.        ],
       [ 0.        ,  0.        ,  0.01515152, -0.03077652,  0.015625  ],
       [ 0.00657895,  0.        ,  0.        ,  0.015625  , -0.00904605]])
>>> det(A)
15409151.999999998
>>> (-1)**(n-1) * 2**(n-2) * np.diff(a).prod() * (a[-1] - a[0])
15409152