高斯消元法,简单迭代法(Jacobi迭代),高斯迭代法(Gauss-Seidel迭代)。参考文章,该参考文章可以让你明白简单迭代和高斯迭代的方法。
总结:高斯迭代和简单迭代法会遇到矩阵存在解但迭代不收敛的情况,推荐使用高斯消元法。
- 高斯消元 O(n3)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
def solveByGauss(matrix): array = [] for i in range(0, len(matrix) - 1): aii = matrix[i][i] if aii == 0: continue for j in range(i + 1, len(matrix)): aji = matrix[j][i] for k in range(i, len(matrix[j])): matrix[j][k] = matrix[j][k] - aji / aii * matrix[i][k] for i in range(len(matrix) - 1, -1, -1): if matrix[i][i] == 0: return ["The system has no roots of equations or has an infinite set of them."] array.append(matrix[i][-1] / matrix[i][i]) for j in range(0, i): matrix[j][-1] -= matrix[j][i] * array[-1] array.reverse() return array |
- 简单迭代 O(k*n2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
def simpleIteration(matrix, epsilon): n = len(matrix) solutions = [0 for i in range(n)] temp = solutions[:] epsilons = [float("inf") for i in range(n)] for i in range(n): if matrix[i][i] == 0: for j in range(n + 1): matrix[i][j] += 1 while max(epsilons) > epsilon: for i in range(n): solution = matrix[i][-1] for j in range(n): if j == i: continue solution -= matrix[i][j] * solutions[j] temp[i] = solution / matrix[i][i] epsilons = [abs(solutions[i] - temp[i]) for i in range(n)] solutions = temp[:] if max(epsilons) >= float("inf"): return ["The system has no roots of equations or has an infinite set of them."] solutions = list(map(lambda x: round(x, 3), solutions)) return solutions |
- 高斯迭代基本思路和简单迭代差不多 O(k*n2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
def gaussIteration(matrix, epsilon): n = len(matrix) solutions = [0 for i in range(n)] temp = solutions[:] epsilons = [float("inf") for i in range(n)] for i in range(n): if matrix[i][i] == 0: for j in range(n + 1): matrix[i][j] += 1 while max(epsilons) > epsilon: for i in range(n): solution = matrix[i][-1] for j in range(n): if j == i: continue elif i > j: solution -= matrix[i][j] * solutions[j] else: solution -= matrix[i][j] * temp[j] temp[i] = solution / matrix[i][i] epsilons = [abs(solutions[i] - temp[i]) for i in range(n)] solutions = temp[:] if max(epsilons) >= float("inf"): return ["The system has no roots of equations or has an infinite set of them."] solutions = list(map(lambda x: round(x, 3), solutions)) return solutions |