當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy linalg.solve_circulant用法及代碼示例


本文簡要介紹 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) 的數組中。當我們忽略坐標軸時cb保存係數向量的集合的形狀分別為 (2,) 和 (3,),這與廣播不兼容。為了得到一個形狀為 (2, 3) 的廣播結果,我們添加一個平凡的維度到cc[:, 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]]])

通過解決一對來檢查cb向量(參見x[1, 1, :]):

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

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.linalg.solve_circulant。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。