高斯列主元消去法0425121523文档格式.docx
- 文档编号:21996480
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:14
- 大小:93.05KB
高斯列主元消去法0425121523文档格式.docx
《高斯列主元消去法0425121523文档格式.docx》由会员分享,可在线阅读,更多相关《高斯列主元消去法0425121523文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
因此我在这里做的也是列选主元高斯消去法。
二、算法的基本思想
大家知道,如果一个线性方程组的系数矩阵是上三角矩阵时,即这种方程组我们称之为上三角方程组,它是很容易求解的。
我们只要把方程组的最下面的一个方程求解出来,在把求得的解带入倒数第二个方程,求出第二个解,依次往上回代求解。
然而,现实中大多数线性方程组都不是上面所说的上三角方程组,所以我们有可以把不是上三角的方程通过一定的算法化成上三角方程组,由此我们可以很方便地求出方程组的解。
高斯消元法的目的就是把一般线性方程组简化成上三角方程组。
于是高斯消元法的基本思想是:
通过逐次消元将所给的线性方程组化为上三角形方程组,继而通过回代过程求解线性方程组。
三、算法的描述
1、设有n元线性方程组如下:
=
2、
第一步:
如果a11!
=0,令
li1=ai1/a11,I=2,3,……,n
用(-li1)乘第一个方程加到第i个方程上,得同解方程组:
a
(1)11a
(1)12...a
(1)1nx1b
(1)1
a
(1)21a
(1)22...a
(1)2nx2b
(1)2
.......=.
a
(1)n-11a
(1)n-12..a
(1)n-1nxn-1b
(1)n-1
a
(1)n1a
(1)n2...a
(1)nnxnb
(1)n
简记为:
A
(2)x=b
(2)
其中
a
(2)ij=a
(1)ij–li1*a
(1)1j,I,j=2,3,..,n
b
(2)I=b
(1)I–li1*b
(1)1,I=2,3,...,n
第二步:
如果a
(2)22!
=0,令
li2=a
(2)i2/a
(2)22,I=3,……,n
依据同样的原理,对矩阵进行化间(省略),依次下去,直到完成!
最后,得到上三角方程组:
a
(1)11a
(1)12...a
(1)1nx1b
(1)1
0a
(1)22...a
(1)2nx2b
(1)2
00..a(n-1)n-1nxn-1b(n-1)n-1
00...a(n)nnxnb(n)n
A(n)x=b(n)
最后从方程组的最后一个方程进行回代求解为:
Xn=b(n)/a(n)nn
Xi=(b(k)k-
a(k)kjxj)/a(k)kk
以上为高斯消去法的基本过程。
但是如前面我们所提到的,存在的问题。
1.一旦遇到某个主元等于0,消元过程便无法进行下去。
他的特点是:
每次在系数矩阵中依次按列在主对角线及以下的元素中,选取绝对值最大的元素作为主元,将她调到主对角线上,然后用它消去主对角线以下的元素,最后化为同解的上三角形方程组去求解。
由于列主元法相对高斯消元法来说就增加了选主元操作,其他的求解步骤是一样的。
四、程序流程图
五、程序描述
程序的名称为:
zealous.cpp
1.程序的结构如下:
程序只能最大输入60行60列的系数矩阵。
2.程序要用到的函数
(1、)matrix_getElement(array,n,m);
此函数的作用是获得用户输入的线性方程组的系数矩阵。
(2、)matrix_outputElement(array,n,m);
此函数的作用是显示用户输入的矩阵。
(3、)selectMaxElement(array,n,m,row);
此函数的作用是选择主元素,并把此时对角线上的那列元素与主元素行交换。
(4、)GAUSSProcess(array,n,m,row);
此函数的作用是用主元素列进行高斯消元,把此行以后所有的行的,此列的元素变为0。
(5、)GAUSSProcess_result(array,n,m);
此函数的作用是显示经过高斯消元后的矩阵,此时的系数矩阵为一个上下三角矩阵。
(6、)GAUSSCalculate_result(array,n,m);
此函数的作用是对已经消元好的矩阵,进行回代求解。
并将结果输出。
六、程序代码
//--------------------------***************高斯列消去法*****
#include<
stdio.h>
math.h>
iostream.h>
#include<
iomanip.h>
constintN=60;
//最大
constintM=61;
//60列,再加上等号右边的一列值
//------------------------------输入要计算方程组的矩阵-----------
voidmatrix_getElement(doubleARRAY[N][M],intn,intm)
{
for(inti=0;
i<
n;
i++)
{
cout<
<
"
请您输入第"
\t"
(i+1)<
row:
endl;
for(intj=0;
j<
m;
j++)
{
cin>
>
ARRAY[i][j];
}
}
return;
}
//----------------------------------------------------------
//---------------输出用户刚才用户输入的矩阵,以便用户检测是否输入正确
voidmatrix_outputElement(doubleARRAY[N][M],intn,intm)
cout<
yourhaveinputthematrixasfllows:
\n"
;
i<
cout<
ARRAY[i][j]<
"
endl<
//-------------------------------------------------------
//---------------------选择主元素,并把主元行与对角线上的那一行交换
voidselectMaxElement(doubleARRAY[N][M],intn,intm,intline)
doublemax=0;
doublet=0;
intj=0;
inti=line;
max=ARRAY[line][line];
for(i=line+1;
if(fabs(ARRAY[i][line])>
fabs(max))
{max=ARRAY[i][line];
j=i;
if(j>
line)
for(i=0;
t=ARRAY[j][i];
ARRAY[j][i]=ARRAY[line][i];
ARRAY[line][i]=t;
//--------------------------------------------------------
//------------------------用对角线上的元素消去后续行中此列的元素
voidGAUSSProcess(doubleARRAY[N][M],intn,intm,introw)
doubleROW1[M];
for(intt=0;
t<
(m-row);
t++)
ROW1[t]=ARRAY[row][row+t];
for(intj=(row+1);
j<
n;
j++)
doubleROW_CHANGE[M];
for(intr=0;
r<
r++)
doublemainElement=ROW1[0];
if(fabs(mainElement)<
1e-7)
{
cout<
Single!
pressanykeyreturn...\n"
getchar();
return;
}
ROW_CHANGE[r]=ROW1[r]*ARRAY[j][row]/ROW1[0];
for(inth=0;
h<
h++)
ARRAY[j][h+row]=ARRAY[j][h+row]-ROW_CHANGE[h];
//--------------------------用回代的方法求出线性方程组的解-----------
voidGAUSSCalculate_result(doubleARRAY[N][M],intn,intm)
doublea[N];
a[n-1]=ARRAY[n-1][m-1]/ARRAY[n-1][n-1];
for(intp=n-2;
p>
=0;
p--)
for(intq=n-1;
q>
p;
q--)
ARRAY[p][m-1]=ARRAY[p][m-1]-ARRAY[p][q]*a[q];
a[p]=ARRAY[q][m-1]/ARRAY[p][p];
-------------------------thefinalresultasfollows------------------:
for(inte=0;
e<
e++)
x"
e+1<
="
<
a[e]<
endl;
//------------------输出经过高斯消去法处理后得到的矩阵------------
voidGAUSSProcess_result(doubleARRAY[N][M],intn,intm)
您输入的矩阵经过高斯消去法处理后得到如下形式:
//--------------------------------main函数-----------------------
voidmain()
doublearray[N][M];
请输入您要运算的矩阵的大小!
intn=0,m=0;
请输入您要运算的矩阵的行数:
cin>
请输入您要运算的矩阵的列数:
您所输入的行为:
n<
您所输入的列为:
m<
matrix_getElement(array,n,m);
//获得矩阵的元素
matrix_outputElement(array,n,m);
//显示输入的矩阵
for(introw=0;
row<
row++)//高斯消元法的主体
selectMaxElement(array,n,m,row);
GAUSSProcess(array,n,m,row);
GAUSSProcess_result(array,n,m);
//显示消元后的矩阵
GAUSSCalculate_result(array,n,m);
//回代求解并显示解结果
cout<
Thisistheend!
七、实例
本程序可以自己选择在60个未知数的方程组,可以自己选择线性方程组的行数和列数。
例子如下:
2x1+x2-5x3+x4=8;
x1-3x2-6x4=9;
2x2-x3+2x4=-5;
x1+4x2-7x3+6x4=0;
输入您要运算的矩阵的大小!
4
5
4您所输入的列为:
请您输入第1row:
2
1
-5
8
请您输入第2row:
-3
-6
9
请您输入第3row:
-1
请您输入第4row:
-7
6
等用户输入以上的数据后,出现结果如下图所示:
此图片为用户运行程序后所看到的结果。
其中包含了实例的解。
即:
x1=3
x2=-4
x3=-1
x4=1
八、误差分析
在此例子中,讲x1,x2,x3,x4这一组解带入到原方程组,可知此解为方程组的准确解。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高斯列主元 消去 0425121523