您的当前位置:首页正文

列主元消元法

2022-04-14 来源:榕意旅游网
数值算法之列主元消元法

下面的代码直接复制就可以用,代码都做了解释,比较容易看懂。方便学数值算法的同学。供大家交流。 #include #include #include

#include

#include //包含输出格式设置的头文件 typedef double array[4][5];

double answer[4]; //answer[4]代表借的数组; /*void Init_array(array a) //数组的初始化并赋值; {

int i,j; //i数组的代表行,j代表数组的列; for (i=0;i<4;i++) { for (j=0;j<5;j++)

{

cout<<\"请输入数组的第\"<cin>>a[i][j]; } } }

//改进的Init_array(array a)函数 void Init_array(array a) {

int i,j;

cout<<\"请输入数组:\"<for(j=0;j<5;j++) { }

cout<cout<<\"a[\"<>a[i][j];

}*/

void cout_array(array a) //输出数组的函数,无返回值; {

int i,j;

for(i=0;i<4;i++)

{

for (j=0;j<5;j++) { cout<}

cout<} }

int maxelem(array a,int k) //a代表数组a,k代表第k次选组员;函数的返回值是int类型的值,代表最大组员所在的行; {

double i; //i用来传参

int j,m; //j用来返回最大数组所在的列;

k--; //使k值与数组对应起来,方便下面操作; i=a[k][k]; m=k; j=k+1;

for(;k<3;k++) {

{ j=k+2; } }

if(a[k+1][m]>a[k][m])

return j; }

void swapline(array a,int k,int l) //a代表数组a,k代表第k次选组员,l代表最大组员所在的行;函数用来交换组,无返回值; {

}

void cancellist(array a,int k) //a代表数组a,k代表第k次选组员,函数用来消元,把数组转换成上三角,无返回值; {

double m; //m用来传参 k--; //方便后面的使用 l--;

for(int j=0;j<5;j++) { }

m=a[k][j]; a[k][j]=a[l][j]; a[l][j]=m;

double m; //m代表消组员时的乘数;

int j; j=k; //让k的值赋给j;因为k的值和含义后面会变,而后面要用到k的初值;

for(;k<4;k++)

if(a[j-1][j-1]!=0)

{

m=a[k][j-1]/a[j-1][j-1]; //计算消元时乘的乘数; cout<<\"第\"<{

a[k][i]=a[k][i]-a[j-1][i]*m; }

{

///////////////////////////////////////

// if(a[3][2]<1e-16) // cout<////////////////////////////////////

} else

{

cout<<\"无法进行列主元求解\"<}

}

exit(0);

}

void main() {

array a; array b;

int i,j; //验证精度用的

double m(0),n(0); //精度验证 //Init_array(a); //用改进的方法初始化任意数组 //为数组赋值;

a[0][0]=1 ,a[0][1]=-1,a[0][2]= 1,a[0][3]=-4,a[0][4]= 2,

a[1][0]=5 ,a[1][1]=-4,a[1][2]= 3,a[1][3]=12,a[1][4]= 4, a[2][0]=2 ,a[2][1]= 1,a[2][2]= 1,a[2][3]=11,a[2][4]= 3, a[3][0]=2 ,a[3][1]=-1,a[3][2]= 7,a[3][3]=-1,a[3][4]= 0; for( i=0;i<4;i++) {

}

for( j=0;j<5;j++) {

b[i][j]=a[i][j]; }

/*a[0][0]=5 ,a[0][1]=1,a[0][2]=1 ,a[0][3]=1,a[0][4]=8 , a[1][0]=6 ,a[1][1]=1,a[1][2]=1 ,a[1][3]=1,a[1][4]=9 ,

a[2][0]=7 ,a[2][1]=1,a[2][2]=1 ,a[2][3]=1,a[2][4]=10 ,

a[3][0]=8 ,a[3][1]=1,a[3][2]=1 ,a[3][3]=1,a[3][4]=11 ; */ //用来测试能不能满足算法要求的一组数据

cout_array(a);

cout<<\"最大组员所在的行:\"<cout<<\"第一次换行后的数组:\"<cancellist(a,1);

cout<<\"第一次消元后的数组:\"<cout_array(a);

cout<<\"最大组员所在的行:\"<cout<<\"第二次换行后的数组:\"<cout<<\"第二次消元后的数组:\"<cout_array(a);

cout<<\"最大组员所在的行:\"<cout<<\"第三次换行后的数组:\"<cancellist(a,3);

cout<<\"第三次消元后的数组:\"<//人工手代反求解降低算法的重复度 answer[3]=a[3][4]/a[3][3];

answer[2]=(a[2][4]-a[2][3]*answer[3])/a[2][2];

answer[1]=(a[1][4]-a[1][3]*answer[3]-a[1][2]*answer[2])/a[1][1];

answer[0]=(a[0][4]-a[0][3]*answer[3]-a[0][2]*answer[2]-a[0][1]*answer[1])/a[0][0]; cout<<\"则解得方程的解为:\"<cout<cout<}

// 验证精度 for(i=0;i<4;i++) { m=0; for (j=0;j<4;j++)

{

m=m+answer[j]*b[i][j];

}

n=n+fabs(b[i][4]-m); //fabs()求绝对值得函数

}

cout<<\"精度为\"<if(n<1e-8) cout<<\"满足精度要求\"<

因篇幅问题不能全部显示,请点此查看更多更全内容