(一)目的
通过设计、编制、调试2~3个求n阶线性方程组数值解的程序,加深对其数值计算方法及有关的基础理论知识的理解。
(二)要求
用编程语言实现用高斯(Gauss)消元法求n阶线性方程组的解、用列主元高斯(Gauss)消元法求n阶线性方程组的解、用库郎(Courant)列主直接分解法求n阶线性方程组的解的程序。
二、示例
1、问题
用高斯(Gauss)消元法求n阶线性方程组的解。
2、算法描述
(略)
3、程序中变量说明
(略)
4、源程序清单及运行结果
(略)
5、按以上4点要求编写上机实验报告。
Gauss-Seidel迭代法基本原理:
python实现:
import numpy as np
def Jacobi(a,b,k):#k迭代次数
m,n=a.shape
if(m!=n):
print("NO answer")
times=0
X=np.zeros(n)#初次迭代X[0,0,0]
x=np.zeros(n)#迭代后更新x
while times<k:
for i in range(n):
sum=0
for j in range(n):
if(i!=j):
sum=sum+a[i][j]*X[j]
x[i]=(b[i]-sum)/a[i][i]
X[i]=x[i].copy() #每算出一个x[i],就更新一个X[i],
print(X)
times=times+1
X=x.copy() #迭代X
a=np.array([[2.0,-1.0,0.0],[-1.0,3.0,-1.0],[0.0,-1.0,2.0]])
b = np.array([1.0,8.0,-5.0])
Jacobi(a,b,20)
#[2.0,3.0,-1.0]
#高斯-赛德尔迭代法于Jacobi迭代法只有一点细微的差别。
结果如下:
Gauss-Seidel迭代法输出结果:
E:\shuzhifenxishiyan\Gauss-Seidel\venv\Scripts\python.exe E:/shuzhifenxishiyan/Gauss-Seidel/main.py
[ 0.5 2.83333333 -1.08333333]
[ 1.91666667 2.94444444 -1.02777778]
[ 1.97222222 2.98148148 -1.00925926]
[ 1.99074074 2.99382716 -1.00308642]
[ 1.99691358 2.99794239 -1.00102881]
[ 1.99897119 2.99931413 -1.00034294]
[ 1.99965706 2.99977138 -1.00011431]
[ 1.99988569 2.99992379 -1.0000381 ]
[ 1.9999619 2.9999746 -1.0000127]
[ 1.9999873 2.99999153 -1.00000423]
[ 1.99999577 2.99999718 -1.00000141]
[ 1.99999859 2.99999906 -1.00000047]
[ 1.99999953 2.99999969 -1.00000016]
[ 1.99999984 2.9999999 -1.00000005]
[ 1.99999995 2.99999997 -1.00000002]
[ 1.99999998 2.99999999 -1.00000001]
[ 1.99999999 3. -1. ]
[ 2. 3. -1.]
[ 2. 3. -1.]
[ 2. 3. -1.]
Process finished with exit code 0
可以看出同样是迭代20次,高斯——赛德尔迭代法比Jacobi迭代法更快的收敛于精确解。