原理:Ax=b, A:n×n, x:n×1,b:n×1
Aij:Aij-lamda×Akj,j=k,k+1,…n,其中k 是约化次数,如n行的矩阵需要约化n-1次
bi:bi-lamda×bk,其中lamda=Aik/Akk,Akk是主对角线元素,Aij 是被约化元素
约化后的进行回代就可解算出x
代码如下:
import numpy as np
a=[[1,2,3],[2,3,4],[7,5,6]]
b=[[12,3,4]]
def gaussEliminate(a,b):
a=np.array(a)
b=np.array(b).reshape(-1,1)
n=len(a)
if a.shape[0]>=a.shape[1]:
print("the numbers of equation is bettter than unknown parameters")
for k in range(0,n-1):#
for i in range(k+1,n):
if a[i,k] != 0:
lam = a[i,k]/a[k,k]
a[i,k:n] = a[i,k:n] - lam*a[k,k:n]
b[i]=b[i]-lam*b[k]
x=np.zeros((a.shape[1],1))
for i in range(n-1,-1,-1):
x[i]=(b[i]-np.dot(a[i,i+1:n],x[i+1:n]))/a[i,i]
print(x)
else:
print("the number of equations are less")
gaussEliminate(a,b)
输出结果:
[[ 6.33333333]
[-51.66666667]
[ 36.33333333]]
验证:x=inv(a)*b
[[ 6.33333333],
[-51.66666667],
[ 36.33333333]]