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))
其中 fft 和 ifft 分别是快速傅里叶变换及其逆变换。对于较大的向量 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 时,把它看作循环向量的集合。在这种情况下,caxis 是 c 的循环系数向量的轴。
- baxisint
当 b 的维度大于 1 时,把它看作向量的集合。在这种情况下,baxis 是 b 的右手边向量的轴。
- outaxisint
当 c 或 b 为多维时,
solve_circulant
返回的值为多维。在这种情况下,outaxis 是结果的解向量的轴。
- 返回值:
- xndarray
系统
C x = b
的解。
- 引发:
- LinAlgError
如果与 c 关联的循环矩阵接近奇异。
请参阅
circulant
循环矩阵
备注
对于长度为 m 的一维向量 c,以及形状为
(m, ...)
的数组 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) 的数组中的两个循环矩阵的向量,以及存储在形状为 (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) 的数组中。当我们忽略 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])