本文简要介绍 python 语言中 scipy.linalg.solve_circulant
的用法。
用法:
scipy.linalg.solve_circulant(c, b, singular='raise', tol=None, caxis=-1, baxis=0, outaxis=0)#
为 x 求解 C x = b,其中 C 是循环矩阵。
C 是与向量 c 相关的循环矩阵。
该系统通过在傅里叶空间中进行除法求解。计算如下:
x = ifft(fft(b) / fft(c))
其中 fft 和 ifft 分别是快速傅里叶变换及其逆变换。对于大向量 c,这比使用完整循环矩阵求解系统要快得多。
- c: array_like
循环矩阵的系数。
- b: array_like
a x = b
中的右侧矩阵。- singular: str,可选
此参数控制如何处理近奇异循环矩阵。如果单数是“raise”,循环矩阵接近奇异,ascipy.linalg.LinAlgError被提出。如果单数是“lstsq”,返回最小二乘解。默认为“raise”。
- tol: 浮点数,可选
如果循环矩阵的任何特征值的绝对值小于或等于 tol,则认为该矩阵接近奇异。如果未给出,则 tol 设置为:
tol = abs_eigs.max() * abs_eigs.size * np.finfo(np.float64).eps
其中abs_eigs 是循环矩阵的特征值的绝对值数组。
- caxis: int
当 c 的维度大于 1 时,它被视为循环向量的集合。在这种情况下,caxis 是保存循环系数向量的 c 轴。
- baxis: int
当 b 的维度大于 1 时,它被视为向量的集合。在本例中,baxis 是保存右侧向量的 b 轴。
- outaxis: int
什么时候c或者b是多维的,返回的值是
solve_circulant
是多维的。在这种情况下,离轴是保存解向量的结果的轴。
- x: ndarray
解决系统
C x = b
。
- LinAlgError
如果与 c 关联的循环矩阵接近奇异。
参数 ::
返回 ::
抛出 ::
注意:
对于一维向量c有长度m, 和一个数组b有形状
(m, ...)
,solve_circulant(c, b)
返回相同的结果
solve(circulant(c), b)
其中
solve
和circulant
来自scipy.linalg
。例子:
>>> 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
.如果我们使用默认离轴,结果将具有形状 (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])
相关用法
- Python SciPy linalg.solve_continuous_lyapunov用法及代码示例
- Python SciPy linalg.solve_continuous_are用法及代码示例
- Python SciPy linalg.solve_banded用法及代码示例
- Python SciPy linalg.solve_discrete_lyapunov用法及代码示例
- Python SciPy linalg.solve_sylvester用法及代码示例
- Python SciPy linalg.solve_toeplitz用法及代码示例
- Python SciPy linalg.solve_discrete_are用法及代码示例
- Python SciPy linalg.solve_triangular用法及代码示例
- Python SciPy linalg.solve用法及代码示例
- Python SciPy linalg.solveh_banded用法及代码示例
- Python SciPy linalg.svd用法及代码示例
- Python SciPy linalg.spsolve用法及代码示例
- Python SciPy linalg.spsolve_triangular用法及代码示例
- Python SciPy linalg.splu用法及代码示例
- Python SciPy linalg.spilu用法及代码示例
- Python SciPy linalg.svdvals用法及代码示例
- Python SciPy linalg.sqrtm用法及代码示例
- Python SciPy linalg.svds用法及代码示例
- Python SciPy linalg.sinm用法及代码示例
- Python SciPy linalg.schur用法及代码示例
- Python SciPy linalg.sinhm用法及代码示例
- Python SciPy linalg.signm用法及代码示例
- Python SciPy linalg.subspace_angles用法及代码示例
- Python SciPy linalg.eigvalsh_tridiagonal用法及代码示例
- Python SciPy linalg.cdf2rdf用法及代码示例
注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.linalg.solve_circulant。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。