高斯列主消元法求解方程c语言程序报告_第1页
高斯列主消元法求解方程c语言程序报告_第2页
高斯列主消元法求解方程c语言程序报告_第3页
高斯列主消元法求解方程c语言程序报告_第4页
高斯列主消元法求解方程c语言程序报告_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、hunan university程序设计训练报 告 专业班级 材料科学与工程四班 指导老师 院长 (系主任) 2012 年 6 月30 日目录1软件开发平台12软件功能说明12.1功能分析说明12.2功能说明图43软件设计详细内容53.1采用的主要数据结构类型53.2流程图54软件测试114.1软件测试用例114.2软件测试报告165总结和致谢166附录.176.1源码17 6.2 二人分工说明.226.3参考文献22221 软件开发平台visul c+ 6.02 软件功能说明用高斯列主消元法求解方程个数不超过15个的线性方程组2.1 功能分析说明线性方程组可以表示为以下形式:通解于:方程等价

2、于ax=b对其增广矩阵进行初等行换不改变方程组的解,从而将其化为简单形式来求解方程组。|a|= (-1)aaa &calculate(intn,int m)功能:quanpailie_a()功能:计算一个全排列(-1)aaa的值gauss_row_xiaoqu()功能:将增广矩阵通过交换两行的方法使得第一列中a绝对值最大第二行各元素分别减去第一行对应元素的a/a倍,使得a化为零;第三行各元素分别减去第一行对应元素的a/a倍,使得a化为零;同理将a,aa都化为零;通过交换两行的方法使得第一列中a绝对值最大第三行各元素分别减去第二行对应元素的a/a倍,使得a化为零;第四行各元素分别减去第二

3、行对应元素的a/a倍,使得a化为零;同理将a,aa都化为零;以此类推,可将主对角线下的元素全化为零,变为上三角矩阵。gauss_calculate()功能化为上三角矩阵之后,增广矩阵最后一行可以表示为x=解得x=/倒数第二行可以表示为ax+ax=b解得x= (b- ax)/2依次按照此法可以求出个未知量对应的值gauss_row()功能:调用函数calculate_a(n,m)计算行列式| a|的值,调用函数gauss_row_xiaoqu()将(a |b)化为上三角矩阵,调用函数gauss_calculate()计算未知量的值。若行列式不为零,输出“系数行列式不为零,有唯一解”,并输出解;若

4、行列式为零,输出“系数行列式为零,无唯一解”。exchange _han(m,n)功能:交换a与b即(a |b)中m行和n行对应元素的值。exchange(m,i)功能:交换a_ym与a_yi的值。input()功能:输入函数个数,若大于15,则提醒重新输入;若小于15,则按照提示输入方程组对应得增广矩阵,并备份数据。 2.2 功能说明图 高斯列主消元法求解线性方程组 输入增广矩阵:输出结果:系数行列式不为零,方程有唯一解a=b=c=d=3 软件设计详细内容3.1 采用的主要数据结构类型#include<iostream>#include<stdlib.h>#inclu

5、de<iomanip.p>#include"bios.h"一位数组二维数组 3.2 流程图 主流程图:yny 开始 结束输入方程个数nn>15?输入方程对应的增广矩阵(a|b)调用函数calculate()计算系数行列式|a|的值|a|=0?调用函数gauss_row_xiaoqu将a化为上三角矩阵调用函数gauss_calculate()计算未知量的值输出个未知量对应的值输出“行列式为零,方程无唯一解”n函数calculate_a()流程图:yn结束输出a_suma_sum+=quanpailie_a()exchange(m,m+i)calculate_

6、a(n-1,m+1)exchange(m,m+i)i<n?i=0n=1?开始yn函数gauss_row_xiaoqu()流程图1开始k=01k<lenth?j=ki=k,maxi=ii<lenth?|aij |>|amaxij |?maxi=ii+maxik?exchange_hang(k,maxi)k<lenth-1i=k+1lik=aik/akk,j=kj<lenth?aij= aij- akj*likbi= bi-bk*liki+k+yn结束yynnynnyyn函数exchange_hang()流程图:开始j=0j<lenth?temp=amja

7、mj=anjj+temp=bmbm=bnbn=temp结束yn函数gauss_calculate()流程图:开始blenth-1= blenth-1/alenth-1lenth-1i=lenth-222i0?j=i+1sum_ax=oj<lenth?sum_ax+=aij*bjbi=( bi- sum_ax)/ aijj+结束yynn4软件测试4.1软件测试用例一方程组有唯一解得情况:1开始界面 2.输入方程个数3.输入方程的增广矩阵4.输出结果二方程组无唯一解得情况: 1.开始界面 2.输入方程个数 3.输入方程的增广矩阵 4.输出结果三方程个数大于15的情况 1.开始界面 2.输入大

8、于15的数,提示重新输入4.2软件测试报告标号项目预期结果实际结果出错原因出错频率01input()能正常输入数据完成预期结果细节没处理好数次02calculate_a()计算行列式的值完成预期结果循环出错经常03quanpailie()计算一个全排列的值完成预期结果公式搞错数次04gauss_row()求解方程完成预期结果无无05gauss_row_xiaoqu()将矩阵化为上三角完成预期结果各种原因最多06gauss_calculate()计算结果完成预期结果数组用错数次07exchange_hang()交换两行完成预期结果无无08exchange()交换两个数据完成预期结果无无5总结和致

9、谢在c程序的编写当中,发现很多很棘手的问题。线性方程组的求解是抽象的数学问题,其中涉及大量变量,因此采用了数组。在进行矩阵的初等行变换时,由于细节问题处理的不够好,导致了多次编译不得通过,最后是反复修改,反复试验,再请同学指导的情况下才最终使得编译成功。后期主要完成对程序进行细节上的完善,和训练报告的写作。期间流程图的画法以及word的使用也花费了大把精力。虽然过程需要一定的耐心和细心,最终在两人的合作下共同完成了报告,最终还是感觉受益很多。6附录6.1源码#include<iostream.h>#include<iomanip.h>#include<stdlib

10、.h>#include<math.h>/-全局变量定义区#define number 15 /方程最大个数double anumbernumber, bnumber, copy_anumbernumber, copy_bnumber; /系数行列式int a_ynumber; /a中随着横坐标增加列坐标的排列顺序,如a00,a12,a21.则a_y=0,2,1.;int lenth, copy_lenth; /方程的个数double a_sum; /计算行列式的值char *x; /未知量a,b,c的载体/-函数声明区void input(); /输入方程组void prin

11、t_menu(); /打印主菜单void gauss_row(); /gauss列主元解方程组double quanpailie_a(); /根据列坐标的排列计算的值,如a_y=0,2,1,得sum=a0 a_y0 * a1 a_y1 * a2a_y2 =a00*a12*a21;double &calculate_a(int n,int m);void exchange(int m, int i); /交换a_ym,a_yivoid exchange_hang(int m, int n); /分别交换a和b中的m与n两行void gauss_row_xiaoqu(); /gauss列主

12、元消去法void gauss_calculate(); /根据gauss消去法结果计算未知量的值/主函数void main() input(); /输入方程 print_menu(); /打印主菜单 gauss_row(); /函数定义区void print_menu() system("cls"); cout << "-方程系数和常数矩阵表示如下:n" for(int j = 0; j < lenth; j+) cout << "系数" << j + 1 << " &q

13、uot; cout << "t常数" cout << endl; for(int i = 0; i < lenth; i+) for(j = 0; j < lenth; j+) cout << setw(8) << setiosflags(ios:left) << aij; cout << "t" << bi << endl; void input() int i, j; do cout << "方程的个数:" ci

14、n>>lenth; if(lenth>15) cout<<"it's too big."<<endl; while(lenth>15); x = new charlenth; for(i = 0; i < lenth; i+) xi = 'a' + i; /输入方程矩阵 /提示如何输入 cout << "=n" cout << "请在每个方程里输入" << lenth << "系数和一个常数:n&qu

15、ot; cout << "例:n方程:a" for(i = 1; i < lenth; i+) cout << "+" << i + 1 << xi; cout << "=10n" cout << "应输入:" for(i = 0; i < lenth; i+) cout << i + 1 << " " cout << "10n" cout <<

16、 "=n" /输入每个方程 for(i = 0; i < lenth; i+) cout << "输入方程" << i + 1 << ":" for(j = 0; j < lenth; j+) cin >> aij; cin >> bi; /备份数据 for(i = 0; i < lenth; i+) for(j = 0; j < lenth; j+) copy_aij = aij; for(i = 0; i < lenth; i+) copy_

17、bi = bi; copy_lenth = lenth; double &calculate_a(int n, int m) /计算行列式 int i; if(n = 1) a_sum += quanpailie_a(); else for(i = 0; i < n; i+) exchange(m, m + i); calculate_a(n - 1, m + 1); exchange(m, m + i); return a_sum;double quanpailie_a() /计算行列式中一种全排列的值 int i, j, l; double sum = 0, p; for(i

18、 = 0, l = 0; i < lenth; i+) for(j = 0; a_yj != i && j < lenth; j+) if(a_yj > i) l+; for(p = 1, i = 0; i < lenth; i+) p *= aia_yi; sum += p * (l % 2 = 0) ? (1) : (-1); return sum;/高斯列主法求解方程void gauss_row() int i, j;double sum; gauss_row_xiaoqu(); /用高斯列主元消去法将系数矩阵变成一个上三角矩阵 for(i = 0

19、; i < lenth; i+) for(j = 0; j < lenth; j+) cout << setw(10) << setprecision(5) << aij; cout << setw(10) << bi << endl; for(i = 0; i < lenth; i+) a_yi = i; sum = calculate_a(lenth, 0); if(sum != 0) cout << "系数行列式不为零,方程有唯一的解:n" gauss_calcula

20、te(); for(i = 0; i < lenth; i+) /输出结果 cout << xi << "=" << bi << "n" else cout << "系数行列式等于零,方程没有唯一的解.n"void gauss_row_xiaoqu() /高斯列主元消去法 int i, j, k, maxi; double lik; cout << "用gauss列主消元法结果如下:n" for(k = 0; k < lenth - 1; k+) j = k; for(maxi = i = k; i < lenth; i+) if(fabs(aij) > fabs(amaxij) maxi = i; /添加绝对值运算符 if(maxi != k) exchange_hang(k, maxi); / for(i = k + 1; i < lenth; i+) lik = aik / akk; for(j =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论