问题需求
对给定的线性方程组进行迭代求解。
调用条件:系数矩阵A,右端项b,初值,精度要求 。
输出结果:方程组的近似解。
给定线性方程组,和,取初始值为0
Jacobi迭代的通用程序。
Jacobi迭代法:
#Jacobi迭代法 输入系数矩阵mx、值矩阵mr、迭代次数n、误差c(以list模拟矩阵 行优先)
def Jacobi(mx,mr,n=100,c=0.0001):
if len(mx) == len(mr): #若mx和mr长度相等则开始迭代 否则方程无解
x = [] #迭代初值 初始化为单行全0矩阵
for i in range(len(mr)):
x.append([0])
count = 0 #迭代次数计数
while count < n:
nx = [] #保存单次迭代后的值的集合
for i in range(len(x)):
nxi = mr[i][0]
for j in range(len(mx[i])):
if j!=i:
nxi = nxi+(-mx[i][j])*x[j][0]
nxi = nxi/mx[i][i]
nx.append([nxi]) #迭代计算得到的下一个xi值
lc = [] #存储两次迭代结果之间的误差的集合
for i in range(len(x)):
lc.append(abs(x[i][0]-nx[i][0]))
if max(lc) < c:
return nx #当误差满足要求时 返回计算结果
x = nx
count = count + 1
return "使用Jacobi迭代法发散" #若达到设定的迭代结果仍不满足精度要求 则方程无解
else:
return False
Gauss-Seidel迭代的通用程序。
Gauss迭代法:
#Gauss迭代法 输入系数矩阵mx、值矩阵mr、迭代次数n(以list模拟矩阵 行优先)
def Gauss(mx,mr,n):
if len(mx) == len(mr): #若mx和mr长度相等则开始迭代 否则方程无解
x = [] #迭代初值 初始化为单行全0矩阵
for i in range(len(mr)):
x.append([0])
count = 0 #迭代次数计数
while count < n:
for i in range(len(x)):
nxi = mr[i][0]
for j in range(len(mx[i])):
if j!=i:
nxi = nxi+(-mx[i][j])*x[j][0]
nxi = nxi/mx[i][i]
x[i][0] = nxi
count = count + 1
return x
else:
return False
调用例子1:
调用方法:
#调用 Gauss(mx,mr,n=100) 示例
mx = [[2,-1,1],[2,2,2],[-1,-1,2]]
mr = [[-1],[4],[-5]]
print(Jacobi(mx,mr,100,0.001))
print(Gauss(mx,mr,100))
输出结果:
使用Jacobi迭代法发散
使用Gauss的结果:[[1.0], [2.0], [-1.0]]
调用例子2:
调用方法:
#调用 Jacobi(mx,mr,n=100,c=0.001) 示例
mx = [[1,2,-2],[1,1,1],[2,2,1]]
mr = [[7],[2],[5]]
print(Jacobi(mx,mr,100,0.001))
print(Gauss(mx,mr,100))
输出结果:
使用Jacobi的结果:[[1.0], [2.0], [-1.0]]
使用Gauss迭代法发散