随机形成元素值在-10到10以内的20阶实系数矩阵A,随机形成解向量X的值,常向量b的元素由算法b=AX得到;分别用列主元Guass消元法和Guass-seidel迭代法求解线性方程组AX=b,比较两种方法求解的效果和所用的CPU时间
时间: 2024-02-06 09:09:13 浏览: 103
三种线性方程组求解方法的串行算法,和并行算法。包含高斯消元法,LU分解法,追赶法。
5星 · 资源好评率100%
首先,我们可以使用numpy库来生成随机的矩阵A和向量b:
```python
import numpy as np
# 生成20阶实系数矩阵A
A = np.random.randint(-10, 11, size=(20, 20)).astype(float)
# 生成解向量X的值
X = np.random.randint(-10, 11, size=(20, 1)).astype(float)
# 常向量b的元素由算法b=AX得到
b = np.dot(A, X)
```
接下来,我们可以使用列主元Guass消元法来求解线性方程组AX=b:
```python
import time
start_time = time.time()
# 列主元Guass消元法
n = len(A)
for i in range(n):
# 部分选主元
p = i + np.argmax(np.abs(A[i:, i]))
A[[i, p]] = A[[p, i]]
b[[i, p]] = b[[p, i]]
# 消元
for j in range(i + 1, n):
m = A[j, i] / A[i, i]
A[j, i:] -= m * A[i, i:]
b[j] -= m * b[i]
# 回代
X1 = np.zeros((n, 1))
for i in range(n - 1, -1, -1):
X1[i] = (b[i] - np.dot(A[i, i + 1:], X1[i + 1:])) / A[i, i]
end_time = time.time()
print("列主元Guass消元法求解结果:")
print(X1)
print("CPU时间:{:.8f}s".format(end_time - start_time))
```
最后,我们可以使用Guass-seidel迭代法来求解线性方程组AX=b:
```python
start_time = time.time()
# Guass-seidel迭代法
max_iter = 1000
tolerance = 1e-8
X2 = np.zeros((n, 1))
for k in range(max_iter):
X2_old = np.copy(X2)
for i in range(n):
X2[i] = (b[i] - np.dot(A[i, :i], X2[:i]) - np.dot(A[i, i + 1:], X2_old[i + 1:])) / A[i, i]
if np.linalg.norm(X2 - X2_old) < tolerance:
break
end_time = time.time()
print("Guass-seidel迭代法求解结果:")
print(X2)
print("CPU时间:{:.8f}s".format(end_time - start_time))
```
最后,我们对比两种方法的求解结果和所用的CPU时间。由于每次生成的随机矩阵和向量不同,因此结果会略有不同,但通常来说,列主元Guass消元法的效率更高,但是随着矩阵规模的增加,Guass-seidel迭代法的优势会逐渐显现。
阅读全文