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

1.目的:通过高斯消去法求线性代数方程组的解算法的设计,培养学生综合利用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的邮箱里面。。谢谢了~~这分就给你了~~
展开
 我来答
潘占峰
推荐于2016-03-21 · TA获得超过6075个赞
知道大有可为答主
回答量:885
采纳率:0%
帮助的人:903万
展开全部
计算方法留的上机作业,难度比前几次提高数倍。感觉从来还没写过这么复杂的数学题程序- -!

#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

YcdoiT
2009-06-26 · TA获得超过269个赞
知道小有建树答主
回答量:143
采纳率:0%
帮助的人:93.7万
展开全部
给你一个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;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yanhe0116
2009-06-18 · TA获得超过4759个赞
知道大有可为答主
回答量:3218
采纳率:0%
帮助的人:3544万
展开全部
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

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2009-06-18
展开全部
垃圾大学生真多啊!难怪大学生找不到工作!连民工都不如!民工不知道比你们勤奋多少!你们花费父母的钱,耗费社会的教育资源,却在学校里不好好学习! 连最起码的作业都要请别人来做!真是社会的败类!!!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2009-06-20
展开全部
I am passing by!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式