运用高斯消去法的心得体会
2019-10-06许俊豪
许俊豪
【摘 要】数学上,高斯消元法(或译:高斯消去法),是线性代数规划中的一个算法,可用来为线性方程组求解。但其算法十分复杂,不常用于加减消元法,求出矩阵的秩,以及求出可逆方阵的逆矩阵。不过,如果有过百万条等式时,这个算法会十分省时。一些极大的方程组通常会用迭代法以及花式消元来解决。当用于一个矩阵时,高斯消元法会产生出一个“行梯阵式”。高斯消元法可以用在电脑中来解决数千条等式及未知数。亦有一些方法特地用来解决一些有特别排列系数的方程组。该方法以数学家高斯命名,由拉布扎比。伊丁特改进,发表于法国但最早出现于中国古籍《九章算术》,成书于约公元前150年。
【关键词】高斯消去法;线性方程组;算法;矩阵
一、我对高斯消去法感兴趣的原因
在刚开始听周老师讲高斯消去法时我一下子提起了兴趣,因为从小我就对高斯这个伟大的数学家充满兴趣,高斯是一位天才,知道他用99+1=100这种首尾相加解决了求和问题,那个故事我还记忆犹新,这也许是高斯消去法的灵感源泉,因为把矩阵化为上三角或者下三角相当于化整,我觉得这种方法的灵感值得我们学习数学的人员借鉴,并且高斯公式也运用的很广泛。
当听到高斯这个名字,我立马打起精神来学习,然后我发现它和我们之前学习的高等代数有关,确实是一个古老的求解线性方程的方法,而我国在古代《九章算术》中就有涉及,但我觉得越古老就越经典,它可以拿出来用,就说明它的基本思想是很经典的,果然在学习了数值分析的高斯消去法后,它把高斯消去法原理不断运用衍生出选主元素消去法、三角分解法,而这两种方法利用计算机是非常方便展示出来的。
其最基本的原理就是:用行的初等变换将原线性方程组系数矩阵化为简单形式(上三角矩阵),从而将求解原线性方程的问题转化为求解简单方程组的问题。所以在电脑上输入代码无论多大的矩阵计算机都可以计算,并且书中解释了消元过程,如果A是非奇异矩阵就可以得到求解公式:
其次书中还介绍其运用在矩阵的三角分解和列主元消去法,这些在计算机上的运用是比较重要的,矩阵的三角分解法是由消元法演变而来的解线性方程组的一类方法。设方程组的矩阵形式为Ax=b,三角分解法是将系数矩阵A分解为一个下三角矩阵L和一个上三角矩阵U之积:A=LU,然后依次解两个三角形方程组Ly=b和Ux=y,而得到原方程组的解。
二、高斯消去法在MATLAB中的运用
首先是用主列元高斯消去法解线性方程组:
%%求解任意线性方程组的解
clc;
clear all;
format long e
disp(‘线性方程组求解,请输入参数);
n=input(‘维数n=);
A=input(‘矩阵A=);
b=input(‘右端项b=);
eps=input('控制精度eps=');
b=b; %%变为列向量
A=[A b]; %%矩阵增广
for k=1:n-1
B=A(k:n,k);%%先将第k列可能作为主元的元素取出方至矩阵B
P=max(abs(B)); %%选主元P
if(P disp(‘无解); break; else u=find((abs(B))==P); %%计算主元所在行相对与k行的位置 if(u~=1) A([k,u],:)=A([u,k],:); ?%%换行 end m=A(k+1:n,k)/A(k,k); %%求出各行行乘数并放至矩阵m for i=1:length(m) A(k+i,k:n+1)=A(k+i,k:n+1)-m(i)*A(k,k:n+1); %%消元按行进行 end end end if A(n,n)==0 disp(‘无解) %%若矩阵A不满秩,则无解 else x(n)=A(n,n+1)/A(n,n); %%由最后一行首先求出方程组的第一个解x(n) for i=n-1:-1:1 %%计算第i个解x(i) for j=1:1:n-i %%利用回代思想 A(i,n+1)=A(i,n+1)-A(i,i+j)*x(i+j); %%减去已知部分 end x(i)=A(i,n+1)/A(i,i); end end disp(‘方程组的解); x=x %%输出方程组的解 其流程图可用如下表述: 在书中p178頁的第二题我套用用了该代码然后解出两个线性方程组,还是计算时间是比较快的,不然手算的话,做半年都不一定能做的对和做的出。 接着我又在网上查询了矩阵LU的分解,了解以下程序: A=[1,2,3;1,3,5;1,3,6]; b=[2,3,4]; x=grout(A,b); function x=grout(B,c) n=size(B,1); L=eye(n); U=zeros(n); for i=1:n s=0; t=0; for j=1:i-1 s=s+L(i,j)*U(j,i:n); t=t+L(i+1:n,j)*U(j,i); end U(i,i:n)= B(i,i:n)-s; L(i+1:n,i)=(B(i+1:n,i)-t)/U(i,i); end y=grout1(L,c); x=grout2(U,y); function y=grout1(B,c) n=size(B,1); y=zeros(n,1); for i=1:n s=0; for j=1:i-1 s=s+B(i,j)*y(j); end y(i)=c(i)-s; end end function x=grout2(U,y) n=size(U,1); x=zeros(n,1); for i=n:-1:1 s=0; for j=n:-1:i+1 s=s+U(i,j)*y(j); end x(i)=(y(i)-s)/U(i,i); end end 个人认为其核心内容总的来说是分解获得L和U,从而解出X。在MATLAB中仅我了解到的是这种算法很方便,但不知其实际作用,然后在好奇心驱使通过查找高斯消去法在各方面各领域中的应用,结果真的令人大吃一惊! 三、高斯消去法在实际生活中的运用: 我通过中国知网的论文库查到利用高斯消去法有效求解带电路分析。在电路系统的分析和设计中,在进行交流小信号分析时,所列的方程是线性代数方程,可以采用高斯消元法或LU分解法;对于直流非线性分析,所列方程是非线性代数方程,可以采用牛顿一拉夫森方法迭代求解。 例如在电路的直流分析中,电容开路,电感短路,计算电路的静态工作点。在交流小信号分析中,电路也先要进行直流分析,以确定半导体器件的跨导等小信号参数。在瞬态分析中,需求出电路在指定时间区间上的解,这时电路的方程是常微分方程,求解常微分方程必须先求出电路储能元件上的初始电流或电压值,这也由直流分析来完成。 线性电路的直流分析所建立的方程是线性代数方程组。对于建立电路线性代数方程组方法可以应用节点法或改进节点法,也可以采用表矩阵法和双图法,这些方法都可以利用计算机自动建立。如果我们建立好了电路的代数方程组AX=B,一般可以利用高斯消去法和LU分解法来解方程组。实际上对于稍大些的电路(Cn>40),建立的矩阵A是个稀疏矩阵,矩阵含有大量的零元素。可以用高斯主元消去法来算。 这相当与建模的一部分,先列出物理模型然后再运用数学发现方程为大量的线性代数方程,则可以用到数学中的高斯消去法来算。我下面列出物理上高斯消去法的运用: 以带权图的形式给出一个用n个结点和m个电阻连接的电路,求点1与点n两点间的电阻。 解法基于两个事实: 1.<基尔霍夫定律>:所有点的电流总流入等于总流出(除了1和n两点)。 2.<欧姆定律>:I=U/R=(Ex-Ey)/R 因为电流方向不好确定,不妨令电流可正可负,那么定律1可以表示成“总流出之和等于0”,于是对每个节点列一方程,高斯消去法解之即可。 四、掌握高斯消去法对于我的好处 熟练掌握了高斯消去法,对于许多矩阵问题我都可以轻而易举地解决,尤其是10阶乘以上的线性方程组矩阵我可以利用计算机来求出其解,真的非常方便,我觉得这个算法的核心是化简。运用各种方法把矩阵化简然后把复杂的问题简单化则成了高斯消去法。但其算法十分复杂,不常用于加减消元法,求出矩阵的秩,以及求出可逆方阵的逆矩阵。不过,如果有过百万条等式时,这个算法会十分省时。一些极大的方程组通常会用迭代法以及花式消元来解决。当用于一个矩阵时,高斯消元法会产生出一个“行梯阵式”。高斯消元法可以在电脑中来解决数千条等式及未知数。亦有一些方法特地用来解决一些有特别排列的系数的方程组。 我觉得左方的消元过程是我最喜欢的,这就是高斯消去法的精髓,我在学习中慢慢体会到了高斯消去法能解决许多复杂问题。再熟练运用MATLAB,再难得问题也可以被计算简化。 五、我感受到這种算法的魔力 在学习这种算法的过程中,我学会了一种重要的思想那就是消元,在初中高中我们也都用过消元法,这是比较经典的,所以在大学我们学会了高斯将这种消元法衍生,所以我懂得了,我们不是不可以做到伟大,我们只需站在前人的肩膀上,将前人的智慧衍生改进,就像高斯消去法其衍生出的列主元消去法和LU解法,我们也可以像那些数学家一样。这种算法使我着迷,使我想要了解它的一切,它既是一切的捷径又是数学家的心血,只要我们好好读书,好好专研,就能发现更优的算法,算法的魔力是不言而喻的,让人觉得巧妙却又在情理之中。