计算机数值分析:线性方程组直接法:高斯消去法(Python实现
计算机数值分析:
线性方程组的直接解法:高斯消去法
书本上的流程图如下:
这里也是使用的文件录入数据
文件如下:
代码如下:
#coding=gbk;
import numpy as np;
def GaussEliminate(datas,x):
rows=datas.shape[0]; #这个行数其实同时也是变量的个数
cols=datas.shape[1];
account=1;
varity=1;
while account<rows: #对第account个变量的系数进行操作
for varity in range(account,rows): #现在操作到了第几行
#由于使用了np datas[1]指代的就是矩阵中下标为1的那一行
datas[varity]=datas[varity]/datas[varity][account];
#如果正好操作的行数等于自己要操作的变量的下标 那个就不用减去了
#不然自己减去自己 岂不是等于0
if varity==account:
continue;
datas[varity]-=datas[account];
account+=1;
print("处理之后,矩阵为:\n{t}".format(t=datas));
rowNow=rows-1;
lastCol=cols-1; #最后一列 也就是常数
lastVarity=cols-2; #最后一列 指的就是最末那个变量
x[rows-1]=data[rowNow][lastCol]; #初始化最后一个变量的值
while rowNow>=1:
temp=0;
for tempCol in range(lastVarity,rowNow,-1): #倒着取值 所以要将第三个参数设置为-1
temp+=datas[rowNow][tempCol]*x[tempCol];
x[rowNow]=datas[rowNow][cols-1]-temp;
rowNow-=1;
return x;
data=np.loadtxt("GaussEliminate.txt",comments="#",delimiter=",");
#故意在data中插入一行 值全部为0 方便后面的计算而已
temp1=np.zeros([1,data.shape[1]]);
data=np.r_[temp1,data];
#在data前面插入一列 方便计算 其实就是为了让计算的下标都从1开始
temp2=np.zeros([data.shape[0],1]);
data=np.c_[temp2,data];
#这里X的计算时候的下标也要从1开始算 方便理解
#因为这个时候data.shape[0]的大小变了
X=np.zeros(data.shape[0]);
X=GaussEliminate(data, X);
print("解得的结果如下:");
for i in range(1,X.shape[0]):
print("X{t0}等于{t1:.3f}".format(t0=i,t1=X[i]));
代码运行结果:
课本上的矩阵经过处理之后为:
课本上结果为:
遇事不决,可问春风。