(一)目的
通过设计、编制、调试2~3个求n阶线性方程组数值解的程序,加深对其数值计算方法及有关的基础理论知识的理解。
(二)要求
用编程语言实现用高斯(Gauss)消元法求n阶线性方程组的解、用列主元高斯(Gauss)消元法求n阶线性方程组的解、用库郎(Courant)列主直接分解法求n阶线性方程组的解的程序。
Guass消去法基本原理:
pytho实现:
import numpy as np
def gauss(a, b):
m, n = a.shape # 获取矩阵的行数和列数
c = np.zeros(n) # 根据矩阵的行数构建一个一维0数组
for i in range(n):
# 限制条件
if (a[i][i] == 0): # 用高斯消去法解线性方程组时对角线元素不能为0
print("no answer")
# k表示第一层循环,(0,n-1)行
# i表示第二层循环,(k+1,n)行,计算该行消元的系数
# j表示列
for k in range(n - 1):
for i in range(k + 1, n):
c[i] = a[i][k] / a[k][k] # 计算出系数
for j in range(k,m): # 从K开始,减少不必要的计算
a[i][j] = a[i][j] - c[i] * a[k][j] # 对矩阵进行高斯消去
b[i] = b[i] - c[i] * b[k]
print(a)
#print(b)
x = np.zeros(n)
x[n - 1] = b[n - 1] / a[n - 1][n - 1] # 解出x[n-1],为回代作准备
# 回代求出方程解
for i in range(n-2, -1, -1):
sum= 0.0
for j in range(n-1, -1, -1):
sum= sum + a[i][j] * x[j]
x[i] = (b[i]-sum) / a[i][i]
#print(sum)
for i in range(n):
print("x" + str(i + 1) + " = ","%.2f" % x[i]) # 输出结果
if __name__ == '__main__':
a = np.array([[2.0, -1.0, 3.0, 2.0], [3.0, -3.0, 3.0, 2.0], [3.0, -1.0, -1.0, 2.0], [3.0, -1.0, 3.0, -1.0]])
b = np.array([6.0, 5.0, 3.0, 4.0])
gauss(a, b)
#结果 [1,1,1,1]
结果:
Guass消去法结果
E:\shuzhifenxishiyan\Gauss\venv\Scripts\python.exe E:/shuzhifenxishiyan/Gauss/main.py
[[ 2. -1. 3. 2. ]
[ 0. -1.5 -1.5 -1. ]
[ 0. 0.5 -5.5 -1. ]
[ 0. 0.5 -1.5 -4. ]]
[[ 2. -1. 3. 2. ]
[ 0. -1.5 -1.5 -1. ]
[ 0. 0. -6. -1.33333333]
[ 0. 0. -2. -4.33333333]]
[[ 2. -1. 3. 2. ]
[ 0. -1.5 -1.5 -1. ]
[ 0. 0. -6. -1.33333333]
[ 0. 0. 0. -3.88888889]]
x1 = 1.00
x2 = 1.00
x3 = 1.00
x4 = 1.00
Process finished with exit code 0