加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

高斯约当消去法

(2011-04-13 22:13:37)
标签:

delphi

高斯约当消去法

分类: 常用算法---Delphi代码

    高斯约当消去法是用来解线性方程组的。其算法的思路类似于我们在线性代数中把矩阵化成单位阵的工作。也就是说要求得一个方程组的解,只需要把矩阵化成单位阵就可以很轻松的得到方程组的解了。

    单位阵:

    增广矩阵就是在系数矩阵的右边添上一列,这一列是线性方程组的等号右边的值。
    人去求增广矩阵的单位阵很简单,将某一列的元素选为主元,然后用该主元依次减该列的其他元素把该列的其他元素化为零。那么计算机该怎么做呢?
  
   1.将方程组的第一个方程等式两边同时除以a11就可以得到X1的值同时也将X1的系数化为1了。
   2.将上一步中的X1的值代入下面的方程组中就会把该行的X1的系数化为零。重复上述两步,直到把除主对角线以外系数矩阵中的所有元素都化为零即完成了解线性方程组的工作。将X1代入其他方程里系数是有规律的,可以动手计算下举个例子将X1代入二式中得到的Xn的系数为:a2n-a21*a1n/a11  这就是我们算法中的关键
   下面就把具体代码贴出来:
01 procedure TForm1.Gauss_Jordan(Var B:XValue;A:Matrix2;N:Integer);     //高斯约当消去法
02 //B是用来存放解的数组  A是方程组的增广矩阵,N是方程的个数,也就是系数矩阵的行。
03 Var
04   Row,Col:Integer;
05   i,j,k:Integer;
06   temp:real;
07 begin
08   Row:=N;
09   Col:=N+1;
10   for k:=0 to Row-1 do
11   begin
12     temp:=A[k][k];         //取出矩阵对角线上的值
13     for j:=k to Col-1 do A[k][j]:=A[k][j]/temp;   //将该行对角线上的元素化为1
14       for i:=0 to Row-1 do       //将每一行的第k列元素除对角线以外的元素都化为零
15       begin
16         if i=k then continue;
17         //当前将要被化为零的元素--注意K代表的是第K列是不变的也就是说第K列的所有元素除了主对角线上的元素都会被化为零
18         temp:=A[i][k];  
19         for j:=k to Col-1 do
20           A[i][j]:=A[i][j]-temp*A[k][j];   //这就是我上面说的那个表达式的代码,在代入的过程中换算系数的值
21       end;
22   end;
23   for k:=0 to Row-1 do
24     B[k]:=A[k][col-1];
25 end;
注意:高斯约当消去法的前提是系数矩阵对角线上的值不能为零,从代码中也看的出来。高斯约当消去法在解一些小的方程组来说效果很好(少于20000至30000个未知数:对计算机来说这当然算未知数小的啦),但对于未知数很多的比如几十万甚至几百万个未知数的方程组就不行了。这就要用迭代法来解决了。  

0

阅读 收藏 喜欢 打印举报/Report
前一篇:学习没目标了
后一篇:TChart的用法
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有