问题描述
为求解一个线性方程组,使用高斯赛德尔迭代法,采用欧几里得距离判定是否收敛。精度delta为1E-9,最大迭代次数为20。
输入形式
在屏幕上依次输入方阵阶数n,系数矩阵A,常数矩阵B和起始点P。
输出形式
输出实际迭代次数,然后每一行输出一个根。
样例输入
3
4 -1 1
4 -8 1
-2 1 5
7
-21
15
1
2
2
样例输出
10
[[2.]
[4.]
[3.]]
样例说明
输入:第1行为方阵阶数3,第2行至4行为系数矩阵A,第5行至7行为常数矩阵B,第8行至10行为起始点。输出:实际迭代次数为10,然后每行依次输出方程解:x1, x2, x3。
代码
# 高斯赛德尔迭代法
import numpy as np
from numpy.linalg import norm
def Input():
n = int(input())
A = np.zeros([n, n], dtype=np.double())
for r in range(n):
A[r:] = np.array(input().split(), dtype=np.double)
B = np.zeros([n, 1], dtype=np.double)
for r in range(n):
B[r:] = np.array(input(), dtype=np.double)
P = np.zeros([n, 1], dtype=np.double)
for r in range(n):
P[r:] = np.array(input(), dtype=np.double)
return A, B, P
def Gseid(A, B, P, delta, max_iteration):
n = len(B)
X = np.zeros((n, 1), dtype=np.double)
epslion = np.finfo(np.float32).eps
for i in range(max_iteration):
for j in range(n):
if j == 0:
X[0] = (B[0] - (A[0, 1:n] @ P[1:n])) / A[0, 0]
elif j == n - 1:
X[n - 1] = (B[n - 1] - (A[n - 1, 0:n - 1] @ X[0:n - 1])) / A[n - 1, n - 1]
else:
X[j] = (B[j] - A[j, 0:j] @ X[0:j] - A[j, j + 1:n] @ P[j + 1:n]) / A[j, j]
err = np.abs(norm(X - P))
relerr = err / (norm(X) + epslion)
P = X.copy()
if err < delta or relerr < delta:
return i, X
def out(x):
print(x)
def main():
A, B, P = Input()
delta = 1e-9
max_iteration = 20
iteration, X = Gseid(A, B, P, delta, max_iteration)
out(iteration)
out(X)
if __name__ == '__main__':
main()