雅可比法

在数值线性代数中,雅可比法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
end (j-loop)
end (i-loop)
检查是否收敛
end (未收敛时继续循环)

收敛编辑

标准的收敛情况是当迭代矩阵的谱半径

[1]

保证收敛的条件是矩阵A为严格或不可约地对角占优矩阵。严格的行对角占优矩阵指对于每一行,对角线上的元素之绝对值大于其余元素绝对值的和,即

有时即使不满足此条件,雅可比法仍可收敛。

举例编辑

一个形如 的线性方程,估计初始

我们用上文描述的方程 来估计 。首先,将等式写为 以方便计算,其中 。注意 中的 的严格递增和递减部分。变成如下数值:

as

解出C为:

用计算出来的T和C,我们估计

继续迭代得:

这个过程一直重复直到收敛(直到 足够小)。这个例子在25次迭代之后的解是

一個用Fortran解的例子编辑

subroutine solve(A,b,x,x0,n)implicit real*8(a-z)integer::n,imax=200integer::i,j,kreal*8::tol=1d-15real*8::A(n,n),b(n),x(n),x0(n),x1(n),x2(n)write(102,501)501 format('Jacobi iteration',/)x1=x0do 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))enddox=x2end subroutine solveprogram  mainimplicit real*8(a-z)integer,parameter::n=3real*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 guessb=(/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)',x501 format('jacobi result',//,<n>(1x,a25),/,<n>(1x,1pd25.15))end program main

参考文献编辑

  1. ^ 1.0 1.1 [1]页面存档备份,存于互联网档案馆),解线性方程组的迭代法

外部链接编辑