defdown_triangle(A, b):
n = len(A)
x = [0for _ inrange(n)]
for i inrange(n):
y = b[i]
for j inrange(i):
y -= A[i][j] * x[j]
x[i] = y / A[i][i]
return x
defup_triangle(A, b):
n = len(A)
x = [0for _ inrange(n)]
for i inrange(n-1, -1, -1):
y = b[i]
for j inrange(i+1, n):
y -= A[i][j] * x[j]
x[i] = y / A[i][i]
return x
2. Gauss消元法
现在,我们来考察一下一般形式的多元线性方程的解法。
其核心的思路其实还是将其转换成三角矩阵然后进行求解。
我们同样给出python伪代码如下:
defgauss_elimination(A, b):
n = len(A)
for i inrange(n-1):
for k inrange(i+1, n):
c = A[k][i] / A[i][i]
for j inrange(i, n):
A[k][j] -= c * A[i][j]
b[k] -= c * b[i]
return up_triangle(A, b)
defgauss_jordan_elimination(A, b):
n = len(A)
for i inrange(n-1):
for k inrange(i+1, n):
c = A[k][i] / A[i][i]
for j inrange(i, n):
A[k][j] -= c * A[i][j]
b[k] -= c * b[i]
for j inrange(n-1, 0, -1):
for i inrange(j):
c = A[i][j] / A[j][j]
A[i][j] = 0
b[i] -= c * b[j]
res = [b[i] / A[i][i] for i inrange(n)]
return res
defdolittle_solve(A, b):
n = len(A)
L = [[0for _ inrange(n)] for _ inrange(n)]
U = [[0for _ inrange(n)] for _ inrange(n)]
for k inrange(n):
L[k][k] = 1for j inrange(k, n):
U[k][j] = A[k][j]
for r inrange(k):
U[k][j] -= L[k][r] * U[r][j]
for i inrange(k+1, n):
L[i][k] = A[i][k]
for r inrange(k):
L[i][k] -= L[i][r] * U[r][k]
L[i][k] /= U[k][k]
y = [0for _ inrange(n)]
for i inrange(n):
y[i] = b[i]
for j inrange(i):
y[i] -= L[i][j] * y[j]
x = [0for _ inrange(n)]
for i inrange(n-1, -1, -1):
x[i] = y[i]
for j inrange(i+1, n):
x[i] -= U[i][j] * x[j]
x[i] /= U[i][i]
return x
defcourant_solve(A, b):
n = len(A)
L = [[0for _ inrange(n)] for _ inrange(n)]
U = [[0for _ inrange(n)] for _ inrange(n)]
for k inrange(n):
for i inrange(k, n):
L[i][k] = A[i][k]
for r inrange(k):
L[i][k] -= L[i][r] * U[r][k]
U[k][k] = 1for j inrange(k+1, n):
U[k][j] = A[k][j]
for r inrange(k):
U[k][j] -= L[k][r] * U[r][j]
U[k][j] /= L[k][k]
y = [0for _ inrange(n)]
for i inrange(n):
y[i] = b[i]
for j inrange(i):
y[i] -= L[i][j] * y[j]
y[i] /= L[i][i]
x = [0for _ inrange(n)]
for i inrange(n-1, -1, -1):
x[i] = y[i]
for j inrange(i+1, n):
x[i] -= U[i][j] * x[j]
return x
defldl_solve(A, b):
n = len(A)
l = [[0for _ inrange(n)] for _ inrange(n)]
d = [0for _ inrange(n)]
for k inrange(n):
d[k] = A[k][k]
for r inrange(k):
d[k] -= d[r] * l[k][r] * l[k][r]
l[k][k] = 1for i inrange(k+1, n):
l[i][k] = A[i][k]
for r inrange(k):
l[i][k] -= d[r] * l[i][r] * l[k][r]
l[i][k] /= d[k]
z = [0for _ inrange(n)]
for i inrange(n):
z[i] = b[i]
for j inrange(i):
z[i] -= l[i][j] * z[j]
y = [z[i]/d[i] for i inrange(n)]
x = [0for _ inrange(n)]
for i inrange(n-1, -1, -1):
x[i] = y[i]
for j inrange(i+1, n):
x[i] -= l[j][i] * x[j]
return x