c++下编写高斯列主元消去解方程组
1个回答
展开全部
这个~
因为熟悉C.所以用C写的~
改下就可以用C++了
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<math.h>
#define n 3 /*方程组的阶数*/
#define precision 1e-16
static double aa[n][n+1]={{1,2,-1,3},{1,-1,5,0},{4,1,-2,2}};
/*增广矩阵的原始数据*/
void main()
{int i,j,det;double a[n+1][n+2],x[n+1];
int GaussElimination_ColumnSelect();
for(i=1;i<=n;i++) for(j=1;j<=n+1;j++)
/*用a[1][1]~a[n][n+1]存放增广矩阵*/
a[i][j]=aa[i-1][j-1];
det=GaussElimination_ColumnSelect(a,x);
/*调用求解方程的函数,获取返回标志值*/
if(det!=0)
for(i=1;i<=n;i++)
printf("\nx[%d]=%f\n",i,x[i]);printf("\n");
getch();
}
int GaussElimination_ColumnSelect(double a[][n+2],double x[n+1])
/*用列主元高斯消去法求解线性方程组的函数*/
{int i,j,k,r;double c;
for(k=1;k<=n-1;k++) /*消元过程*/
{r=k;
for(i=k;i<=n;i++) /*选列主元*/
if(fabs(a[i][k])>fabs(a[r][k]))r=i;
if(fabs(a[r][k])<precision)
{printf("\n det A=0.Elimination faild!");exit(0);}
if(r!=k)
{for(j=k;j<=n+1;j++) /*交换k,r两行*/
{c=a[k][j];a[k][j]=a[r][j];a[r][j]=c;}
}
for(i=k+1;i<=n;i++) /*进行消元计算*/
{c=a[i][k]/a[k][k];
for(j=k+1;j<=n+1;j++)
a[i][j]=a[i][j]-c*a[k][j];
}
}
if(fabs(a[n][n])<precision)
{printf("\n det A=0.Algorithm faild!");exit(0);}
for(k=n;k>=1;k--) /*回代过程*/
{x[k]=a[k][n+1];
for(j=k+1;j<=n;j++)
x[k]=x[k]-a[k][j]*x[j];
x[k]=x[k]/a[k][k];
}
return(1);
}
因为熟悉C.所以用C写的~
改下就可以用C++了
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<math.h>
#define n 3 /*方程组的阶数*/
#define precision 1e-16
static double aa[n][n+1]={{1,2,-1,3},{1,-1,5,0},{4,1,-2,2}};
/*增广矩阵的原始数据*/
void main()
{int i,j,det;double a[n+1][n+2],x[n+1];
int GaussElimination_ColumnSelect();
for(i=1;i<=n;i++) for(j=1;j<=n+1;j++)
/*用a[1][1]~a[n][n+1]存放增广矩阵*/
a[i][j]=aa[i-1][j-1];
det=GaussElimination_ColumnSelect(a,x);
/*调用求解方程的函数,获取返回标志值*/
if(det!=0)
for(i=1;i<=n;i++)
printf("\nx[%d]=%f\n",i,x[i]);printf("\n");
getch();
}
int GaussElimination_ColumnSelect(double a[][n+2],double x[n+1])
/*用列主元高斯消去法求解线性方程组的函数*/
{int i,j,k,r;double c;
for(k=1;k<=n-1;k++) /*消元过程*/
{r=k;
for(i=k;i<=n;i++) /*选列主元*/
if(fabs(a[i][k])>fabs(a[r][k]))r=i;
if(fabs(a[r][k])<precision)
{printf("\n det A=0.Elimination faild!");exit(0);}
if(r!=k)
{for(j=k;j<=n+1;j++) /*交换k,r两行*/
{c=a[k][j];a[k][j]=a[r][j];a[r][j]=c;}
}
for(i=k+1;i<=n;i++) /*进行消元计算*/
{c=a[i][k]/a[k][k];
for(j=k+1;j<=n+1;j++)
a[i][j]=a[i][j]-c*a[k][j];
}
}
if(fabs(a[n][n])<precision)
{printf("\n det A=0.Algorithm faild!");exit(0);}
for(k=n;k>=1;k--) /*回代过程*/
{x[k]=a[k][n+1];
for(j=k+1;j<=n;j++)
x[k]=x[k]-a[k][j]*x[j];
x[k]=x[k]/a[k][k];
}
return(1);
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询