c高斯消元法解方程课程设计报告.docx
《c高斯消元法解方程课程设计报告.docx》由会员分享,可在线阅读,更多相关《c高斯消元法解方程课程设计报告.docx(12页珍藏版)》请在冰豆网上搜索。
c高斯消元法解方程课程设计报告
学号
2016-2017学年第2学期
1608220203
《高级语言程序设计》
课程设计报告
题目:
高斯消元法解方程
专业:
网络工程(对口)
班级:
16网工(3)
姓名:
代应豪
指导教师:
成绩:
计算机学院
2017年4月25日
目录
一设计内容及要求1
1.设计内容2
2.设计要求3
二概要设计3
三设计过程或程序代码8
四设计结果与分析12
五参考文献14
1设计内容及要求
1.1设计内容:
高斯消去法的解题思路:
反代
来求得所要的答案.矩阵的基本列运算规则为:
(1)任一列均可乘以一非零的常数;
(2)将任一列乘以一常数后加到其他列;(3)可任意对调任两列。
第1步消元——在增广矩阵(A,b)第一列中找到绝对值最大的元素,将其所在行与第一行交换,再对(A,b)做初等行变换使原方程组转化为如下形式:
第2步消元——在增广矩阵(A,b)中的第二列中(从第二行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A,b)做初等行变换使原方程组转化为:
第3步消元——在增广矩阵(A,b)中的第三列中(从第三行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A,b)做初等行变换使原方程组转化为:
按x4x3x2x1的顺序回代求解出方程组的解
按照解题的思路,整个程序大概由以下几个部分组成:
输入方程组;判断用户输入的维数是否大于自定义10的维数;输入各行未知项的系数;开始反代;开始计算;退出程序。
除了以上主要部分外,程序还用到了if和for选择语句,对程序的进一步简化起到重要作用,使源程序显的更加简洁明了。
1.2要求:
输入是N(N<10)元线性方程组Ax=B,输出是方程组的解,也可能无解或有多组解。
2概要设计
总体流程图
反代的函数流程图
核心技术的实现方法及程序段
源程序主要由三个函数和一个主函数组成,其中主函数以菜单的形式调用其他函数来实现要求的所有功能。
在这些函数中交换行的距函数、比较系数大小的函数和实现菜单选择的函数是程序中较为核心的部分,下面分别进行说明:
1、 此模块改变矩阵行的顺序 ,具体程序段如下:
for(j=1;j<=n-1;j++)
{
for(i=j+1;i<=n;i++)
{
temp=a[i][j]/a[j][j];
for(k=1;k<=n;k++)
a[i][k]=a[i][k]-temp*a[j][k];
b[i]=b[i]-temp*b[j];
}
}
2、 此模块反代的函数 ,具体程序段如下:
///*开始反代*/
x[n]=b[n]/a[n][n];
for(j=n-1;j>=1;j--)
{
x[j]=b[j];
for(k=n;k>=j+1;k--)
x[j]=x[j]-x[k]*a[j][k];
x[j]=x[j]/a[j][j];
}
1)简化矩阵:
如何利用高斯消元的方法将方程组的系数矩阵,简化为上三角阵的方法。
如图:
这部分的难点主要是寻找消元的通项公式我们把第k行分别乘上某一系数,加到它以下的各行中使得与第k行同列的数据化为0,反复向下循环,即可得到最终的上三角阵。
其具体运算公式是:
a[i][j]=a[i][j]-a[i][j]*a[k][j]/a[k][k]
下面是一种典型的错误编写:
for(intk=0;kfor(inti=k+1;ifor(j=k;ja[i][j]=a[i][j]-a[i][k]*a[k][j]/a[k][k];
这样写出公式,直接利用循环内套循环,再套循环是不对的,因为循环内层要用到最外层的变量,直接用,是不可以的,所以要借助参量c来完成。
下面是正确的编写:
for(intk=0;kfor(inti=k+1;i{
c=a[i][k]/a[k][k];
for(j=k;ja[i][j]=a[i][j]-c*a[k][j];
}
2)回代:
这部分的主要工作依然是寻找运算的规律,总结归纳出求解的一般公式。
x[k]=(b[k]-∑x[i]*a[k][i])/a[k][k];
其中∑x[i]*a[k][i]依然需要我们借助一个for循环来完成.3)计算中断:
要考虑在消去过程中,以及在消去完毕后出现的计算中断的情况,这时我们要给与及时提示,指出方程组没有唯一解,中断解的输出。
给予下面程序必要的终止运行。
即系数矩阵为奇异的:
①消元过程中发现没有找到零主元素,计算中断。
②消元过程能够进行到底,但最终得到的主对角线元为零(a[n-1][n-1]==0)
3设计过程或程序代码
#include
#include
#include
#definedim10//定义最大的维数10,为防止计算值溢出
doublea[dim+1][dim+1],b[dim+1],x[dim+1];//定义双精度数组
intmain()
{
intn,i,j,k;
doubletemp;
printf("请输入方程的元数(行数):
");
scanf("%d",&n);
printf("\n");
if(n>dim)//判断用户输入的维数是否大于自定义10的维数
{
printf("错误:
元数超过初设定的最大元数%d\n",dim);
exit(0);
}
printf("****以下开始输入各行未知项的系数****\n");
printf("\n");
for(i=1;i<=n;++i)
{
for(j=1;j<=n;++j)
{
printf("请输入第%d元(第%d行)第%d个未知数的系数:
",i,i,j);
scanf("%lf",&a[i][j]);
}
printf("请输入第%d元(第%d行)的结果:
",i,i);
scanf("%lf",&b[i]);
printf("\n");
}
for(j=1;j<=n-1;j++)
{
for(i=j+1;i<=n;i++)
{
temp=a[i][j]/a[j][j];
for(k=1;k<=n;k++)
a[i][k]=a[i][k]-temp*a[j][k];
b[i]=b[i]-temp*b[j];
}
}
///*开始反代*/
x[n]=b[n]/a[n][n];
for(j=n-1;j>=1;j--)
{
x[j]=b[j];
for(k=n;k>=j+1;k--)
x[j]=x[j]-x[k]*a[j][k];
x[j]=x[j]/a[j][j];
}
for(j=1;j<=n;j++)
printf("第%d个未知数的解:
%10.5e\n",j,x[j]);
}
4设计结果与分析
根据输入的数据判断某一特定的线性方程组是否存在唯一解,如果没有,输出提示;如果存在有唯一解,按顺序输出各个解。
1)编制的程序能完成的功能求解二元、三元、.......十元的线性方程组有序的输出方程组的解。
2)准备的测试数据及运行结果:
范例1.
以下是运行结果的抓图:
范例2.
以下是运行结果的抓图:
5参考文献
[1]尚广豪.高斯消元法解方程.淮南师范计算机学院.2017