日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Sherman-Morrison公式及其应用

發(fā)布時(shí)間:2023/12/31 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Sherman-Morrison公式及其应用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Sherman-Morrison公式

??Sherman-Morrison公式以 Jack Sherman 和 Winifred J. Morrison命名,在線性代數(shù)中,是求解逆矩陣的一種方法。本篇博客將介紹該公式及其應(yīng)用,首先我們來(lái)看一下該公式的內(nèi)容及其證明。
??(Sherman-Morrison公式)假設(shè)ARn×nA∈Rn×n為可逆矩陣,u,vRnu,v∈Rn為列向量,則A+uvTA+uvT可逆當(dāng)且僅當(dāng)1+vTA?1u01+vTA?1u≠0, 且當(dāng)A+uvTA+uvT可逆時(shí),該逆矩陣由以下公式給出:

(A+uvT)?1=A?1?A?1uvTA?11+vTA?1u.(A+uvT)?1=A?1?A?1uvTA?11+vTA?1u.
證明:
(?)(?)當(dāng)1+vTA?1u01+vTA?1u≠0時(shí),令X=A+uvT,Y=A?1?A?1uvTA?11+vTA?1uX=A+uvT,Y=A?1?A?1uvTA?11+vTA?1u,則只需證明XY=YX=IXY=YX=I即可,其中II為n階單位矩陣。
XY=(A+uvT)(A?1?A?1uvTA?11+vTA?1u)=AA?1+uvTA?1?AA?1uvTA?1+uvTA?1uvTA?11+vTA?1u=I+uvTA?1?uvTA?1+uvTA?1uvTA?11+vTA?1u=I+uvTA?1?u(1+vTA?1u)vTA?11+vTA?1u=I+uvTA?1?uvTA?1=IXY=(A+uvT)(A?1?A?1uvTA?11+vTA?1u)=AA?1+uvTA?1?AA?1uvTA?1+uvTA?1uvTA?11+vTA?1u=I+uvTA?1?uvTA?1+uvTA?1uvTA?11+vTA?1u=I+uvTA?1?u(1+vTA?1u)vTA?11+vTA?1u=I+uvTA?1?uvTA?1=I
同理,有YX=IYX=I.因此,當(dāng)1+vTA?1u01+vTA?1u≠0時(shí),(A+uvT)?1=A?1?A?1uvTA?11+vTA?1u.(A+uvT)?1=A?1?A?1uvTA?11+vTA?1u.
(?)(?)當(dāng)u=0u=0時(shí),顯然有1+vTA?1u=10.1+vTA?1u=1≠0.當(dāng)u0u≠0時(shí),用反正法證明該命題成立。假設(shè)A+uvTA+uvT可逆,但1+vTA?1u=01+vTA?1u=0,則有
(A+uvT)A?1u=u+u(vTA?1u)=(1+vTA?1u)u=0.(A+uvT)A?1u=u+u(vTA?1u)=(1+vTA?1u)u=0.
因?yàn)?span id="ozvdkddzhkzd" class="MathJax_Preview" style="color:inherit;">A+uvTA+uvT可逆,故A?1A?1u=0,又因?yàn)?span id="ozvdkddzhkzd" class="MathJax_Preview" style="color:inherit;">A?1A?1可逆,故u=0u=0,此與假設(shè)u0u≠0矛盾。因此,當(dāng)A+uvTA+uvT可逆時(shí),有1+vTA?1u0.1+vTA?1u≠0.

Sherman-Morrison公式的應(yīng)用

應(yīng)用1:A=IA=I時(shí)的Sherman-Morrison公式

??在Sherman-Morrison公式中,令A=IA=I,則有:I+uvTI+uvT可逆當(dāng)且僅當(dāng)1+vTu01+vTu≠0, 且當(dāng)I+uvTI+uvT可逆時(shí),該逆矩陣由以下公式給出:

(I+uvT)?1=I?uvT1+vTu.(I+uvT)?1=I?uvT1+vTu.
??再令v=uv=u,則1+uTu>01+uTu>0, 因此,I+uuTI+uuT可逆,且
(I+uuT)?1=I?uuT1+uTu.(I+uuT)?1=I?uuT1+uTu.

應(yīng)用2:BFGS算法

??Sherman-Morrison公式在BFGS算法中的應(yīng)用,可用來(lái)求解BFGS算法中近似Hessian矩陣的逆。本篇博客并不打算給出Sherman-Morrison公式在BFGS算法中的應(yīng)用,將會(huì)再寫篇博客介紹BFGS算法,到時(shí)再給出該公式的應(yīng)用,并會(huì)在之后補(bǔ)上該博客的鏈接(因?yàn)楣P者還沒(méi)寫)。

應(yīng)用3:循環(huán)三對(duì)角線性方程組的求解

??本篇博客將詳細(xì)講述Sherman-Morrison公式在循環(huán)三對(duì)角線性方程組的求解中的應(yīng)用。
??首先給給出理論知識(shí)介紹部分。
??對(duì)于ARn×nA∈Rn×n為可逆矩陣,u,vRnu,v∈Rn為列向量,1+vTA?1u01+vTA?1u≠0,需要求解方程(A+uvT)x=b.(A+uvT)x=b.對(duì)此,我們可以先求解以下兩個(gè)方程:

Ay=b,Az=uAy=b,Az=u .
然后令x=y?vTy1+vTzzx=y?vTy1+vTzz,該解即為原方程的解,驗(yàn)證如下:
(A+uvT)x=(A+uvT)(y?vTy1+vTzz)=Ay+uvTy?vTy1+vTzAz?vTy1+vTzuvTz=b+uvTy?vTyu+vTyuvTz1+vTz=b+uvTy?(1+vTz)vTyu1+vTz=b+uvTy?uvTy=b(A+uvT)x=(A+uvT)(y?vTy1+vTzz)=Ay+uvTy?vTy1+vTzAz?vTy1+vTzuvTz=b+uvTy?vTyu+vTyuvTz1+vTz=b+uvTy?(1+vTz)vTyu1+vTz=b+uvTy?uvTy=b
??這樣將原方程(A+uvT)x=b(A+uvT)x=b分成兩個(gè)方程,可以在一定程度上簡(jiǎn)化原方程。接下來(lái),我們將介紹循環(huán)三對(duì)角線性方程組的求解。
??所謂循環(huán)三對(duì)角線性方程組,指的是系數(shù)矩陣為如下形式:
A=??????????????b1a20?0cnc1b2???00c2?an?2???0?bn?2an?100?0cn?2bn?1ana10?0cn?1bn??????????????A=[b1c10?0a1a2b2c20?00???0???an?2bn?2cn?200??an?1bn?1cn?1cn0?0anbn]
循環(huán)三對(duì)角線性方程組可寫成Ax=dAx=d,其中d=(d1,d2,...,dn)T.d=(d1,d2,...,dn)T.
??對(duì)于此方程的求解,我們令u=(γ,0,0,...,cn)T,v=(1,0,0,...,a1γ)Tu=(γ,0,0,...,cn)T,v=(1,0,0,...,a1γ)T, 且A=A+uvTA=A′+uvT,其中AA′如下:
A=??????????????b1?γa20?00c1b2???00c2?an?2???0?bn?2an?100?0cn?2bn?1an00?0cn?1bn?a1cnγ??????????????A′=[b1?γc10?00a2b2c20?00???0???an?2bn?2cn?200??an?1bn?1cn?100?0anbn?a1cnγ]
AA′為三對(duì)角矩陣。根據(jù)以上的理論知識(shí),我們只需要求解以下兩個(gè)方程
Ay=d,Az=uA′y=d,A′z=u,
然后,就能根據(jù)y,zy,z求出xx.而以上兩個(gè)方程為三對(duì)角線性方程組,可以用追趕法(或Thomas法)求解,具體算法可以參考博客:三對(duì)角線性方程組(tridiagonal systems of equations)的求解 。
??綜上,我們利用Sherman-Morrison公式的思想,可以將循環(huán)三對(duì)角線性方程組轉(zhuǎn)化為三對(duì)角線性方程組求解。我們將會(huì)在下面給出該算法的Python語(yǔ)言實(shí)現(xiàn)。

Python實(shí)現(xiàn)

??我們要解的循環(huán)三對(duì)角線性方程組如下:

????????4100314100014100014120014????????????????x1x2x3x4x5????????=??????76668??????[4100214100014100014130014][x1x2x3x4x5]=[76668]
??用Python實(shí)現(xiàn)解該方程的Python完整代碼如下: # use Sherman-Morrison Formula and Thomas Method to solve cyclic tridiagonal linear equationimport numpy as np# Thomas Method for soling tridiagonal linear equation Ax=d # parameter: a,b,c,d are list-like of same length # b: main diagonal of matrix A # a: main diagonal below of matrix A # c: main diagonal upper of matrix A # d: Ax=d # return: x(type=list), the solution of Ax=d def TDMA(a,b,c,d):try:n = len(d) # order of tridiagonal square matrix# use a,b,c to create matrix A, which is not necessary in the algorithmA = np.array([[0]*n]*n, dtype='float64')for i in range(n):A[i,i] = b[i]if i > 0:A[i, i-1] = a[i]if i < n-1:A[i, i+1] = c[i]# new list of modified coefficientsc_1 = [0]*nd_1 = [0]*nfor i in range(n):if not i:c_1[i] = c[i]/b[i]d_1[i] = d[i] / b[i]else:c_1[i] = c[i]/(b[i]-c_1[i-1]*a[i])d_1[i] = (d[i]-d_1[i-1]*a[i])/(b[i]-c_1[i-1] * a[i])# x: solution of Ax=dx = [0]*nfor i in range(n-1, -1, -1):if i == n-1:x[i] = d_1[i]else:x[i] = d_1[i]-c_1[i]*x[i+1]x = [round(_, 4) for _ in x]return xexcept Exception as e:return e# Sherman-Morrison Fomula for soling cyclic tridiagonal linear equation Ax=d # parameter: a,b,c,d are list-like of same length # b: main diagonal of matrix A # a: main diagonal below of matrix A # c: main diagonal upper of matrix A # d: Ax=d # return: x(type=list), the solution of Ax=d def Cyclic_Tridiagnoal_Linear_Equation(a,b,c,d):try:# use a,b,c to create cyclic tridiagonal matrix An = len(d)A = np.array([[0] * n] * n, dtype='float64')for i in range(n):A[i, i] = b[i]if i > 0:A[i, i - 1] = a[i]if i < n - 1:A[i, i + 1] = c[i]A[0, n - 1] = a[0]A[n - 1, 0] = c[n - 1]gamma = 1 # gamma can be set freelyu = [gamma] + [0] * (n - 2) + [c[n - 1]]v = [1] + [0] * (n - 2) + [a[0] / gamma]# modify the coefficient to form A'b[0] -= gammab[n - 1] -= a[0] * c[n - 1] / gammaa[0] = 0c[n - 1] = 0# solve A'y=d, A'z=u by using Thomas Methody = np.array(TDMA(a, b, c, d))z = np.array(TDMA(a, b, c, u))# use y and z to calculate x# x = y-(v·y)/(1+v·z) *z# x is the solution of Ax=dx = y - (np.dot(np.array(v), y)) / (1 + np.dot(np.array(v), z)) * zx = [round(_, 3) for _ in x]return xexcept Exception as e:return edef main():'''equation:A = [[4,1,0,0,2],[1,4,1,0,0],[0,1,4,1,0],[0,0,1,4,1],[3,0,0,1,4]]d = [7,6,6,6,8]solution x should be [1,1,1,1,1]'''a = [2, 1, 1, 1, 1]b = [4, 4, 4, 4, 4]c = [1, 1, 1, 1, 3]d = [7, 6, 6, 6, 8]x = Cyclic_Tridiagnoal_Linear_Equation(a,b,c,d)print('The solution is %s'%x)main()

輸出結(jié)果如下:

The solution is [1.0, 1.0, 1.0, 1.0, 1.0]

參考文獻(xiàn)

  • https://en.wikipedia.org/wiki/Sherman%E2%80%93Morrison_formula
  • http://wwwmayr.in.tum.de/konferenzen/Jass09/courses/2/Soldatenko_paper.pdf
  • https://scicomp.stackexchange.com/questions/10137/solving-system-of-linear-equations-with-cyclic-tridiagonal-matrix
  • https://blog.csdn.net/jclian91/article/details/80251244
  • 總結(jié)

    以上是生活随笔為你收集整理的Sherman-Morrison公式及其应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。