目录
一、提要
雅克比迭代法就是众多迭代法中比较早且较简单的一种,其命名也是为纪念普鲁士著名数学家雅可比。雅克比迭代法的计算公式简单,每迭代一次只需计算一次矩阵和向量的乘法,且计算过程中原始矩阵A始终不变,比较容易进行计算。
雅可比迭代是数字解法,然而该方法是有一定条件,如果不能正确地辨别这些条件是不可能得到正确解的,本文将针对这种算法的原理进行介绍,和程序实现。
二、雅可比迭代的矩阵原理
对于方程,首先将方程组中的系数矩阵A分解成三部分,即:
,其中D为对角阵,L为下三角矩阵,U为上三角矩阵。
因 所以
,进一步:
因此雅可比迭代公式:
(称为雅可比迭代矩阵)
三、雅可比迭代的前提
对于线性方程,用雅可比迭代求解是需要条件有三:
- 方阵A必须是非奇异的,即A的行列式必须非0
- 对角线元素必须非0
- 矩阵A对角占优
对角优势矩阵是指一矩阵的每一横行,对角线上元素的大小大于或等于同一横行其他元素大小的和,一矩阵A为对角优势矩阵若
其中aij为第i行第j列的元素。
四、程序实现
#!/usr/bin/python
# _*_ coding: UTF-8 _*_
import numpy as np
#雅可比迭代法
def Jacobi(A,B,x0,x,eps,k):
"""雅可比迭代法
Args:
A:为方程组的系数矩阵
B:为方程组右端的列向量
x:为迭代初值构成的列向量
x:迭代向量
eps :精度误差
k:最大迭代次数
Returns:
times:迭代次数
x:Array数组,方程的解
Raises:
"""
n,m = A.shape
if n!=m:
print("invalid data!")
return None
times = 0
while times<k:
for i in range(n):
temp = 0
for j in range(n):
if i != j:
temp += x0[j] * A[i][j]
x[i] = ((B[i] - temp) / A[i][i])
error = max(abs(x - x0))
times += 1
if error < eps:
print("精确度等于", eps, "时,雅可比迭代法需要迭代", times, "次收敛")
return (x, times)
else:
x0 = x.copy()
print("在最大迭代次数内不收敛","最大迭代次数后的结果为",x)
return None
if __name__ == '__main__': #当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行。
a = np.array([[8, -3, 2], [4, 11, -1], [6, 3, 12]])
b = np.array([20, 33, 36])
x = np.array([0, 0, 0]) #迭代初始值
x0=x.copy()
g = 1e-6
Jacobi( a, b, x0, x, g, 100)
print(x)
本文含有隐藏内容,请 开通VIP 后查看