scipy.linalg.

solve_circulant#

scipy.linalg.solve_circulant(c, b, сингулярный='raise', tol=None, caxis=-1, baxis=0, outaxis=0)[источник]#

Решить уравнение C @ x = b для x, где C является циркулянтной матрицей, определённой как c.

C — это циркулянтная матрица, связанная с вектором c.

Система решается путём деления в пространстве Фурье. Вычисление:

x = ifft(fft(b) / fft(c))

где fft и ifft являются быстрое преобразование Фурье и его обратное, соответственно. Для большого вектора c, это много быстрее, чем решение системы с полной циркулянтной матрицей.

Параметры:
carray_like

Коэффициенты циркулянтной матрицы.

barray_like

Матрица правой части в a x = b.

сингулярныйstr, optional

Этот аргумент управляет обработкой почти сингулярной циркулянтной матрицы. Если сингулярный равно "raise" и циркулянтная матрица почти вырождена, LinAlgError вызывается. Если сингулярный является 'lstsq', возвращается решение методом наименьших квадратов. По умолчанию 'raise'.

tolfloat, опционально

Если любое собственное значение циркулянтной матрицы имеет абсолютное значение меньше или равное tol, матрица считается почти вырожденной. Если не задано, tol установлено в:

tol = abs_eigs.max() * abs_eigs.size * np.finfo(np.float64).eps

где abs_eigs является массивом абсолютных значений собственных чисел циркулянтной матрицы.

caxisint

Когда c имеет размерность больше 1, он рассматривается как набор циркулянтных векторов. В этом случае, caxis является осью c который содержит векторы коэффициентов циркулянта.

baxisint

Когда b имеет размерность больше 1, он рассматривается как коллекция векторов. В этом случае, baxis является осью b который содержит векторы правой части.

outaxisint

Когда c или b являются многомерными, значение, возвращаемое solve_circulant является многомерным. В этом случае outaxis является осью результата, которая содержит векторы решений.

Возвращает:
xndarray

Решение системы C x = b.

Вызывает:
LinAlgError

Если циркулянтная матрица, связанная с c почти сингулярна.

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

circulant

циркулянтная матрица

Примечания

Для 1-D вектора c с длиной m, и массив b с формой (m, ...),

solve_circulant(c, b)

возвращает тот же результат, что и

solve(circulant(c), b)

где solve и circulant взяты из scipy.linalg.

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

Примеры

>>> import numpy as np
>>> from scipy.linalg import solve_circulant, solve, circulant, lstsq
>>> c = np.array([2, 2, 4])
>>> b = np.array([1, 2, 3])
>>> solve_circulant(c, b)
array([ 0.75, -0.25,  0.25])

Сравните этот результат с решением системы с scipy.linalg.solve:

>>> solve(circulant(c), b)
array([ 0.75, -0.25,  0.25])

Единичный пример:

>>> c = np.array([1, 1, 0, 0])
>>> b = np.array([1, 2, 3, 4])

Вызов solve_circulant(c, b) вызовет LinAlgError. Для решения методом наименьших квадратов используйте опцию singular='lstsq':

>>> solve_circulant(c, b, singular='lstsq')
array([ 0.25,  1.25,  2.25,  1.25])

Сравнить с scipy.linalg.lstsq:

>>> x, resid, rnk, s = lstsq(circulant(c), b)
>>> x
array([ 0.25,  1.25,  2.25,  1.25])

Пример вещания:

Предположим, у нас есть векторы двух циркулянтных матриц, хранящиеся в массиве формы (2, 5), и три b векторы, хранящиеся в массиве формы (3, 5). Например,

>>> c = np.array([[1.5, 2, 3, 0, 0], [1, 1, 4, 3, 2]])
>>> b = np.arange(15).reshape(-1, 5)

Мы хотим решить все комбинации циркулянтных матриц и b векторов, с результатом, хранящимся в массиве формы (2, 3, 5). Когда мы игнорируем оси c и b которые содержат векторы коэффициентов, формы коллекций (2,) и (3,) соответственно, что несовместимо для трансляции. Чтобы получить результат трансляции с формой (2, 3), мы добавляем тривиальное измерение к c: c[:, np.newaxis, :] имеет форму (2, 1, 5). Последнее измерение содержит коэффициенты циркулянтных матриц, поэтому при вызове solve_circulant, мы можем использовать значение по умолчанию caxis=-1. Коэффициенты b векторы находятся в последнем измерении массива b, поэтому мы используем baxis=-1. Если мы используем значение по умолчанию outaxis, результат будет иметь форму (5, 2, 3), поэтому мы используем outaxis=-1 чтобы поместить векторы решений в последнее измерение.

>>> x = solve_circulant(c[:, np.newaxis, :], b, baxis=-1, outaxis=-1)
>>> x.shape
(2, 3, 5)
>>> np.set_printoptions(precision=3)  # For compact output of numbers.
>>> x
array([[[-0.118,  0.22 ,  1.277, -0.142,  0.302],
        [ 0.651,  0.989,  2.046,  0.627,  1.072],
        [ 1.42 ,  1.758,  2.816,  1.396,  1.841]],
       [[ 0.401,  0.304,  0.694, -0.867,  0.377],
        [ 0.856,  0.758,  1.149, -0.412,  0.831],
        [ 1.31 ,  1.213,  1.603,  0.042,  1.286]]])

Проверка путем решения одной пары c и b векторы (ср. x[1, 1, :]):

>>> solve_circulant(c[1], b[1, :])
array([ 0.856,  0.758,  1.149, -0.412,  0.831])