C++编写
高斯列主元消去法解线性方程组
作者:刘俊 班级B0503791 软件学院 学号1050379016
试验原理:
1. 高斯消去法是一个古老的求解线性方程组的方法,但它的改进、变形得到的主元素
消去法仍然是计算机上常用的计算方法。
2. 列主元消去法
a. 构造增广矩阵
设系数矩阵为
a11 A= a n1 a1n ann
设增广矩阵为
a11 a21 B=
an1 a1na2n|| | annb1 b2 bn
b.找到每列的绝对值的最大的数
c.行变换(重复b-c)
d.消去
mik aik(k)/akk
(k)(k),(k 1,2, ,n); (k)aij
bi(k 1) aijk mikakj(k),(i,j k 1, ,n); (k 1) bi mikb,(i k 1, ,n);
e. 回代
Xn bn(n)/ann(n);
(k)n
Xk (bk(k)
j k 1akjxj)/akk(k);
C++编写
实验过程:
#include<stdio.h>
#include<conio.h>
#include<math.h>
#define N 100
#define epsilon 1e-6
float a[N][N+1];
void main( )
{
int i,j,k,n;
float t,s=0;
printf("Input juzhen jieshu:");
scanf("%d",&n);
printf("\n");
for(i=0;i<n;i++)
{
printf("\n\n请输入a%d1--a%d%d系数和向量b%d:",i+1,i+1,n,i+1);
/*实现将每一行中的系数和向量一次性输入,数之间用空格格开,输完后回车确定*/
for(j=0;j<n+1;j++) /*将刚才输入的数存入数组*/
scanf("%f",&a[i][j]);
}
/*交换两列*/
for(k=0;k<n-1;k++)
{
for(i=k+1;i<n;i++)
if( abs(a[i][k]) > abs(a[k][k]) )
for(j=k;j<n+1;j++)
{
t=a[k][j];
a[k][j]=a[i][j];
a[i][j]=t;
}
if( abs(a[k][k]) < epsilon)
{
printf("\nError,zhuyuan xiaoqufa cann\'t be durable,break at %d!\n",k+1);
return;
}
for(i=k+1;i<n;i++)
{
a[i][k]=a[i][k] / a[k][k];
for(j=k+1;j<n+1;j++)
C++编写
a[i][j]=a[i][j]-a[i][k] * a[k][j]; }
}
a[n-1][n]=a[n-1][n] / a[n-1][n-1];
for(k=n-2;k>=0;k--)
{
s=0;
for(j=k+1;j<n;j++)
s+=a[k][j]*a[j][n];
a[k][n]=( a[k][n]-s ) / a[k][k]; }
printf("\n*****The Result*****\n"); for(i=0;i<n;i++)
printf(" x[%d]=%.4f\n",i+1,a[i][n]); getch( );
}
实验结果:
-2.000 1.072 5.643 6.564
0.000 3.569 1.868 0.269
0.001 6.232 1.368 0.698
解得:
x1=-3.5527
x2=0.1394
x3=-0.1224
代入原方程,与结果非常吻合。
由此可见,高斯列主元消去法精度很高,是一种好方法。