雅可比法
在數值線性代數中,雅可比法(Jacobi Method)是一種解對角元素幾乎都是各行和各列的絕對值最大的值的線性方程組的算法。求解出每個對角元素並插入近似值。不斷疊代直至收斂[1]。這個算法是雅可比矩陣的精簡版。方法的名字來源於德國數學家卡爾·雅可比。
描述
編輯給定一個n×n的線性方程組
其中:
A 可以分解成對角部分D和剩餘部分R:
線性方程組可以重寫為:
雅可比法是一種疊代方法。在每一次疊代中,上一次算出的x被用在右側,用來算出左側的新的x。這個過程可以如下表示:
對每個元素可以用以下公式:
注意計算 xi(k+1)需要x(k)中除了自己之外的每個元素。 不像高斯-賽德爾疊代,我們不能用 xi(k+1)覆蓋xi(k),因為在接下來的計算中還要用到這些值。這是雅可比和高斯-塞德爾方法最顯著的差別,也是為什麼前者可以用並行算法而後者不能的原因。最小需要的存儲空間是兩個長度為n的向量。
算法
編輯選擇一個初始猜想值
- while 未收斂
- for i := 1 step until n do
-
- for j := 1 step until n do
- if j != i then
- end if
- if j != i then
- end (j-loop)
-
- end (i-loop)
- 檢查是否收斂
- for i := 1 step until n do
- end (未收斂時繼續循環)
收斂
編輯標準的收斂情況是當疊代矩陣的譜半徑
保證收斂的條件是矩陣A為嚴格或不可約地對角佔優矩陣。嚴格的行對角佔優矩陣指對於每一行,對角線上的元素之絕對值大於其餘元素絕對值的和,即
有時即使不滿足此條件,雅可比法仍可收斂。
舉例
編輯一個形如 的線性方程,估計初始 :
我們用上文描述的方程 來估計 。首先,將等式寫為 以方便計算,其中 和 。注意 中的 和 是 的嚴格 遞增和遞減部分。變成如下數值:
令 as
解出C為:
用計算出來的T和C,我們估計 為
繼續疊代得:
這個過程一直重複直到收斂(直到 足夠小)。這個例子在25次疊代之後的解是
一個用Fortran解的例子
編輯subroutine solve(A,b,x,x0,n)
implicit real*8(a-z)
integer::n,imax=200
integer::i,j,k
real*8::tol=1d-15
real*8::A(n,n),b(n),x(n),x0(n),x1(n),x2(n)
write(102,501)
501 format('Jacobi iteration',/)
x1=x0
do k=1,imax
do i=1,n
s=0
do j=1,n
if (j==i) cycle
s=s+A(i,j)*x1(j)
enddo
x2(i)=(b(i)-s)/A(i,i)
enddo
! the following step check if convergence is reached
dx2=0
do i=1,n
dx2=dx2+(x1(i)-x2(i))**2
enddo
dx2=dsqrt(dx2)
if (dx2<tol) exit
x1=x2
write(102,502)k,x1 ! record the iteration process
502 format(1x,i3,<n>(1x,1pd25.15))
enddo
x=x2
end subroutine solve
program main
implicit real*8(a-z)
integer,parameter::n=3
real*8 ::A(n,n),b(n),x(n),x0(n)
open(unit=101,file='result.txt')
open(unit=102,file='it_result.txt')
x0=(/0d0,0d0,0d0/) ! initial guess
b=(/9d0,7d0,6d0/)
A=reshape((/10,-1,0,-1,10,-4,0,-2,10/),(/3,3/))
call solve(A,b,x,x0,n) ! solve Ax=b
write(101,501)'x(1)','x(2)','x(3)',x
501 format('jacobi result',//,<n>(1x,a25),/,<n>(1x,1pd25.15))
end program main
參考文獻
編輯外部連結
編輯- Black, Noel; Moore, Shirley; and Weisstein, Eric W. Jacobi method. MathWorld.
- Jacobi Method from www.math-linux.com (頁面存檔備份,存於互聯網檔案館)
- Module for Jacobi and Gauss–Seidel Iteration
- Numerical matrix inversion (頁面存檔備份,存於互聯網檔案館)