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])