scipy.linalg.solve_circulant¶
- scipy.linalg.solve_circulant(c, b, singular='raise', tol=None, caxis=- 1, baxis=0, outaxis=0)[源代码]¶
求x的Cx=b,其中C是循环矩阵。
C 是与向量关联的循环矩阵 c 。
该系统在傅立叶空间中进行除法求解。计算结果为:
x = ifft(fft(b) / fft(c))
哪里 fft 和 ifft 分别是快速傅立叶变换及其逆变换。对于较大的矢量 c ,这是 much 比用全循环矩阵求解系统更快。
- 参数
- carray_like
循环矩阵的系数。
- barray_like
中的右侧矩阵
a x = b
。- singular字符串,可选
此参数控制如何处理接近奇异的循环矩阵。如果 singular 是“提升”的,并且循环矩阵接近奇异,则
LinAlgError
都被养大了。如果 singular 为“lstsq”,则返回最小二乘解。默认值为“RAISE”。- tol浮动,可选
如果循环矩阵的任何特征值的绝对值小于或等于 tol ,则该矩阵被认为是近似奇异的。如果不给, tol 设置为::
tol = abs_eigs.max() * abs_eigs.size * np.finfo(np.float64).eps
哪里 abs_eigs 是循环矩阵的特征值的绝对值数组。
- caxis集成
什么时候 c 维数大于1,则将其视为循环向量的集合。在这种情况下, caxis 是的轴 c 它保存循环系数的向量。
- baxis集成
什么时候 b 维数大于1,则它被视为向量的集合。在这种情况下, baxis 是的轴 b 它保存着右边的向量。
- outaxis集成
什么时候 c 或 b 是多维的,则由
solve_circulant
是多维的。在这种情况下, outaxis 保存解向量的结果轴。
- 退货
- xndarray
系统解决方案
C x = b
。
- 加薪
- LinAlgError
如果与该循环矩阵相关联的循环矩阵 c 几乎是单数的。
参见
circulant
循环矩阵
注意事项
对于一维矢量 c 带长度 m ,和一个数组 b 有形状的
(m, ...)
,求解循环(c,b)
返回的结果与
求解(循环式(C),b)
哪里
solve
和circulant
是来自scipy.linalg
。0.16.0 新版功能.
示例
>>> 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])