scipy.linalg.

solve_circulant#

scipy.linalg.solve_circulant(c, b, singular='raise', tol=None, caxis=-1, baxis=0, outaxis=0)[source]#

求解 C x = b 中的 x,其中 C 是循环矩阵。

C 是与向量 c 关联的循环矩阵。

通过在傅里叶空间进行除法求解该系统。该计算公式为

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

其中 fftifft 分别是快速傅里叶变换及其逆变换。对于较大的向量 c,这比使用完整循环矩阵求解系统要快得多

参数:
carray_like

循环矩阵的系数。

barray_like

a x = b 中的右手边矩阵。

奇异str,可选

此参数控制接近奇异循环矩阵的处理方式。如果 singular 为 “raise”,且循环矩阵接近奇异,将会引发 LinAlgError。如果 singular 为 “lstsq”,则返回最小二乘解。默认值为 “raise”。

tolfloat,可选

如果循环矩阵的任何特征值的绝对值小于或等于 tol,则该矩阵被认为接近奇异。如果未给出,tol 被设置为

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

其中 abs_eigs 是循环矩阵的特征值绝对值的数组。

caxisint

c 的维度大于 1 时,把它看作循环向量的集合。在这种情况下,caxisc 的循环系数向量的轴。

baxisint

b 的维度大于 1 时,把它看作向量的集合。在这种情况下,baxisb 的右手边向量的轴。

outaxisint

cb 为多维时,solve_circulant 返回的值为多维。在这种情况下,outaxis 是结果的解向量的轴。

返回值:
xndarray

系统 C x = b 的解。

引发:
LinAlgError

如果与 c 关联的循环矩阵接近奇异。

请参阅

circulant

循环矩阵

备注

对于长度为 m 的一维向量 c,以及形状为 (m, ...) 的数组 b

solve_circulant(c, b)

返回与

相同的结果。

其中,solvecirculant 来自 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) 的数组中的两个循环矩阵的向量,以及存储在形状为 (3, 5) 的数组中的三个 b 向量。例如,

>>> 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) 的数组中。当我们忽略 cb 的包含系数向量的轴时,集合的形状分别为 (2,) 和 (3,),它们不适用于广播。为获得形状为 (2, 3) 的广播结果,我们在 c 中添加一个无意义维度:c[:, np.newaxis, :] 的形状为 (2, 1, 5)。最后一个维度包含循环矩阵的系数,因此在调用 solve_circulant 时,我们可以使用默认 caxis=-1b 向量系数位于 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]]])

通过解一个 cb 向量对来检查(参见 x[1, 1, :]

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