C++课程设计如何高斯消去法解方程组 急急急!!

1. 目的:
通过高斯消去法求线性代数方程组的解算法的设计,培养学生综合利用C++语言进行程序设计的能力和解决数学计算问题的能力,使学生将所学知识转化为分析和设计简单实际问题的能力。加强函数的运用及学生对软件工程方法的初步认识,提高软件系统分析能力和程序文档建立、归纳总结的能力。
2. 基本要求:
(1)要求用C++语言编程,在Visual C++环境下调试完成;
(2)要求各个功能分别使用函数来完成;
(3)程序调试通过后,完成程序文档的处理,源代码加必要的注释。
设计方法和基本原理
1. 课题功能描述
课题实现的功能是通过列主元高斯消去法来求解线性代数方程组的解。
2. 问题详细描述
用列主元高斯消去法求解线性方程组AX=B的解:,如以下方程组:
a11X1+a12X2+a13X3=b1 (1)
a21X1+a22X2+a23X3=b2 (2)
a31X1+a32X2+a33X3=b3 (3)

(1) 其中A矩阵为已知系数矩阵
a11 a12 a13
a21 a22 a23
a31 a32 a33

(2) 其中B矩阵为已知常数矩阵
b1
b2
b3
其中X矩阵为待求变量矩阵 【 X1 X2 X3】
问题的解决方案:
根据问题的描述,可以按照要求的功能采用结构化的设计思想。
(1) 系数矩阵(数组)和常数矩阵(数组)的输入要求编写独立函数实现;
(2) 列主元高斯消去法(消元和回代)的算法用独立函数实现;
(3) 待求变量矩阵(数组)的输出要求编写独立函数实现。

求各位大侠帮忙啊。。会的写上注释,发到 307824830 这个QQ的邮箱里面。。谢谢了~~这分就给你了~~

计算方法留的上机作业,难度比前几次提高数倍。感觉从来还没写过这么复杂的数学题程序- -!

#include <stdio.h>
#include <stdlib.h>

#define N 10 //矩阵大小范围

/*
* 使用已经求出的x,向前计算x(供getx()调用)
* float a[][] 系数矩阵
* float x[] 方程组解
* int i 解的序号
* int n 矩阵大小
* return 公式中需要的和
*/
float getm(float a[N][N], float x[N], int i, int n)
{
float m = 0;
int r;
for(r=i+1; r<n; r++)
{
m += a[i][r] * x[r];
}
return m;
}

/*
* 解方程组,计算x
* float a[][] 系数矩阵
* float b[] 右端项
* float x[] 方程组解
* int i 解的序号
* int n 矩阵大小
* return 方程组的第i个解
*/
float getx(float a[N][N], float b[N], float x[N], int i, int n)
{
float result;
if(i==n-1) //计算最后一个x的值
result = float(b[n-1]/a[n-1][n-1]);
else //计算其他x值(对于公式中的求和部分,需要调用getm()函数)
result = float((b[i]-getm(a,x,i,n))/a[i][i]);

return result;
}

void main()
{
//float a[N][N] = {{2,1,1},{1,3,2},{1,2,2}};
//float b[N] = {4,6,5};
float a[N][N]; //系数矩阵
float b[N]; //右端项
float x[N]; //方程组解
int i,j,k;
int n=N; //矩阵大小

/*用户手工输入矩阵*/
printf("请输入系数矩阵的大小:");
scanf("%d", &n);
printf("请连续输入矩阵值:");
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
scanf("%f", &a[i][j]);
}
printf("请输入右端项:");
for(i=0; i<n; i++)
{
scanf("%f", &b[i]);
}

/*显示原始矩阵*/
printf("\n原始矩阵\n");
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
printf("%f ",a[i][j]);
printf("\t|\t%f\n",b[i]);
}
printf("\n\n");

/*进行高斯消去*/
for(j=0; j<n-1; j++)
{
for(i=j+1; i<n; i++)
{
float m = (float)(a[i][j]/a[j][j]);
for(k=j; k<n; k++)
{
a[i][k] = a[i][k]-m*a[j][k];
}
b[i] = b[i]-m*b[j];
}
}

/*显示处理后矩阵*/
printf("高斯消去后矩阵\n");
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
printf("%f ",a[i][j]);
printf("\t|\t%f\n",b[i]);
}

/*回代方式解方程组*/
for(i=n-1; i>=0; i--)
{
x[i] = getx(a,b,x,i,n);
}

/*显示方程组解*/
printf("\n\n方程组解\n");
for(i=0; i<n; i++)
{
printf("x%d = %f\n", i+1,x[i]);
}
}

VC6.0下测试通过

===================================================================

参考资料:http://home.phpchina.com/space.php?uid=34746&do=blog&id=32599

温馨提示:内容为网友见解,仅供参考
第1个回答  2009-06-26
给你一个c++的
先说如何调用的,用高斯消元法做的

//By JJ,2008

#include<iostream.h>
#include"01.h"
void main()
{
equation a;
a.InputData();
a.solve_eqution();
cin.get();
cin.get();
}

下面是以前写的类,可能要你自己修改一下

#include<iomanip.h>
const int Max_Number=20;
class equation
{
private:
int number; //方程个数
char value[Max_Number]; //未知量
double modulus[Max_Number][Max_Number]; //方程系数
double constant[Max_Number]; //右端常数
public:
equation(int _number=0); //构造函数
void InputData(); //输入数据
void solve_eqution(); //高斯全主元消去
void gauss_all_valueiaoqu(); //Gauss全主元消去法
void gauss_calculate(); //高斯消去法以后计算未知量的结果
void evaluechange_hang(int m,int n);
void evaluechange_a_lie(int m,int n);
void evaluechange_value(int m,int n);
};

equation::equation(int _number)
{
number=_number;
}

//----------------------------初始化数据为0
void equation::InputData()
{
int i,j;
if(number==0)
{
cout<<"输入方程的个数:";
cin>>number;
}

//--------------初始化变量符号为默认的a,b,c..
for(i=0;i<number;i++)
value[i]='a'+i;

//---------输入数据------01.提示如何输入
cout<<"====================================================\n";
cout<<"请在每个方程里输入"<<number<<"系数和一个常数:\n";
cout<<"例:\n方程:a";
for(i=1;i<number;i++)
{
cout<<"+"<<i+1<<value[i];
}
cout<<"=10\n";
cout<<"应输入:";
for(i=0;i<number;i++)
cout<<i+1<<" ";
cout<<"10\n";
cout<<"==============================\n";

//---------02.输入每个方程
for(i=0;i<number;i++)
{
cout<<"输入方程"<<i+1<<":";
for(j=0;j<number;j++)
cin>>modulus[i][j];
cin>>constant[i];
}
}

//高斯全主元排列求解方程
void equation::solve_eqution()
{
int i,j;
gauss_all_valueiaoqu();
if(modulus[number-1][number-1]!=0)
{

gauss_calculate();

for(i=0;i<number;i++) //输出结果
{
for(j=0;value[j]!='a'+i&&j<number;j++);
cout<<value[j]<<"="<<constant[j]<<endl;
}
}
else
cout<<"系数行列式等于零,方程没有唯一的解.\n";
}

void equation::gauss_all_valueiaoqu() //Gauss全主元消去法
{
int i,j,k,mavaluei,mavaluej;double lik;
cout<<"用Gauss全主元消去法结果如下:\n";

for(k=0;k<number-1;k++)
{

for(mavaluei=mavaluej=i=k;i<number;i++)
{
for(j=k;j<number;j++)
if(modulus[i][j]>modulus[mavaluei][ mavaluej])
{ mavaluei=i;
mavaluej=j;
}

}
if(mavaluei!=k)
evaluechange_hang(k,mavaluei);
if(mavaluej!=k)
{
evaluechange_a_lie(mavaluej,k); //交换两列
evaluechange_value(mavaluej,k);

}

for(i=k+1;i<number;i++)
{
lik=modulus[i][k]/modulus[k][k];
for(j=k;j<number;j++)
modulus[i][j]=modulus[i][j]-modulus[k][j]*lik;
constant[i]=constant[i]-constant[k]*lik;
}
}
}

void equation::gauss_calculate() //高斯消去法以后计算未知量的结果
{
int i,j;double sum_avalue;
constant[number-1]=constant[number-1]/modulus[number-1][number-1];
for(i=number-2;i>=0;i--)
{
for(j=i+1,sum_avalue=0;j<number;j++)
sum_avalue+=modulus[i][j]*constant[j];
constant[i]=(constant[i]-sum_avalue)/modulus[i][i];
}
}

void equation::evaluechange_hang(int m,int n) //交换a[][]中和b[]两行
{
int j; double temp;
for(j=0;j<number;j++)
{ temp=modulus[m][j];
modulus[m][j]=modulus[n][j];
modulus[n][j]=temp;

}
temp=constant[m];
constant[m]=constant[n];
constant[n]=temp;
}

void equation::evaluechange_a_lie(int m,int n) //交换a[]中的两列
{ double temp;int i;
for(i=0;i<number;i++)
{ temp=modulus[i][m];
modulus[i][m]=modulus[i][n];
modulus[i][n]=temp;
}
}

void equation::evaluechange_value(int m,int n) //交换未知量x[m]与x[n]
{ char temp;
temp=value[m];
value[m]=value[n];
value[n]=temp;
}
第2个回答  2009-06-18
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);
}

参考资料:http://zhidao.baidu.com/question/53427417.html?si=2

第3个回答  2009-06-18
垃圾大学生真多啊!难怪大学生找不到工作!连民工都不如!民工不知道比你们勤奋多少!你们花费父母的钱,耗费社会的教育资源,却在学校里不好好学习! 连最起码的作业都要请别人来做!真是社会的败类!!!
第4个回答  2009-06-20
I am passing by!

高斯课程
\/ 解方程组,计算x float a[][] 系数矩阵 float b[] 右端项 float x[] 方程组解 int i 解的序号 int n 矩阵大小 return 方程组的第i个解 \/ float getx(float a[N][N], float b[N], float x[N], int i, int n){ float result;if(i==n-1) \/\/计算最后一个x的值 result ...

c++ 高斯消去法 求线性方程组的解
void InputData(); \/\/输入数据 void solve_eqution(); \/\/高斯全主元消去 void gauss_all_valueiaoqu(); \/\/Gauss全主元消去法 void gauss_calculate(); \/\/高斯消去法以后计算未知量的结果 void evaluechange_hang(int m,int n);void evaluechange_a_lie(int m,int n);void e...

求C语言课程设计:用高斯列主元消元法解线性方程组
首先将矩阵A进行LU分解(将系数矩阵分解成一个上三角矩阵和一个下三角矩阵),分解的过程中用到了隐式的主元寻找法,同时利用克鲁特算法可以将两个n*n矩阵压缩到一个n*n矩阵中,大大节省了存储空间提高了计算速度。

...语言或者c++编程,实现用高斯消元法求解线性方程组Ax=b。
void gaussj(double a[], int n, double b[]){ int i,j,k,l,ll,irow,icol;double big,pivinv,dum;int ipiv[50], indxr[50], indxc[50];for (j=0;j<=n-1;j++){ ipiv[j]=0;} for (i=0;i<=n-1;i++){ big=0.0;for (j=0;j<=n-1;j++){ if(ipiv[j]!=1)...

高斯列主元消去法,求解齐次线性方程组的C语言实现
C\/C++ code #include<stdio.h> #include <math.h> #define N 20 int main() { int n,i,j,k; int mi,tmp,mx; float a[N][N],b[N],x[N]; printf("\\nInput n:"); scanf("%d",&n); if(n>N) { printf("The input n should in(0,N)!\\n");    ...

求用C++编程解方程组
如果单就你给出的这个方程来说,最简单的办法就是手工解出x,y的解析表达式,然后让计算机去执行具体的运算工作,就你的这个方程来说,应该不难。如果想实现一个通用的多元方程组求解程序则要分两种情况:对于线形多元方程组有确定的方法求解,比如线形代数中的高斯消元法、QR分解法等,但是代码量很大...

如下方程组如何求解? C++
利用高斯消元法,将方程组转化成矩阵,在解就行了,主要思路就是这样。

求用C++编程解方程组
如果单就你给出的这个方程来说,最简单的办法就是手工解出x,y的解析表达式,然后让计算机去执行具体的运算工作,就你的这个方程来说,应该不难。如果想实现一个通用的多元方程组求解程序则要分两种情况:对于线形多元方程组有确定的方法求解,比如线形代数中的高斯消元法、QR分解法等,但是代码量很大...

C++解数学方程
不知道你听没听过“克莱默”法则,那个是专门用来解n元一次方程组的,利用线性代数里的行列式。其它数学解法灵活性太高,没有统一的步骤,难以用程序实现,克莱默法则完美的解决了这个问题,它有一个固定的流程 具体你可以搜一下,一言难尽。。。

C++高斯列主元消去法,这是我写的程序,计算结果不正确,求高手修改下_百 ...
2 1 -1 3 -1 1 1 3 -1 系数矩阵输入完毕!常数项矩阵 -1 6 2 常数项矩阵输入完毕!整理完毕,此时方程组为 1 -0.333333 0.333333 2 0 1 -0.4 0 0 0 1 5 方程的解为 1 2 5 Press any key to continue \/ include <iostream.h>#include <math.h> define N 100 int ...

相似回答