线性方程组数值解法.docx
- 文档编号:30833351
- 上传时间:2024-01-30
- 格式:DOCX
- 页数:20
- 大小:38.82KB
线性方程组数值解法.docx
《线性方程组数值解法.docx》由会员分享,可在线阅读,更多相关《线性方程组数值解法.docx(20页珍藏版)》请在冰豆网上搜索。
线性方程组数值解法
计算方法实验
题目班级:
学号:
姓名:
计算方法实验仁
1实验目的3..
2实验步骤3..
2.1环境配置:
3.
2.2添加头文件3.
2.3主要模块3.
3代码4..
3.1主程序部分4.
3.2多项式方程部分4.
3.3核心算法部分8.
3.4数据结构部分1.2
4运行结果14
4.1列主元高斯消去法运行结果14
4.2LU三角分解法运行结果15
4.3雅克比迭代法运行结果16
边界情况调试1.7
5总结1.8
输入输出18
列主元高斯消元法1.8
雅克比迭代法18
6参考资料18
1实验目的
1.通过编程加深对列主元高斯消去法、LU三角分解法和雅克比迭代法等求解多项式方程方法的理解
2.观察上述三种方法的计算稳定性和求解精度并比较各种方法利弊
2实验步骤
2.1环境配置:
VS2013,C++控制台程序
2.2添加头文件
#include"stdio.h"
#include"stdlib.h"
#include"stdafx.h"
#include
2.3主要模块
程序一共分成三层,最底层是数据结构部分,负责存储数据,第二层是交互部分,即多项式方程部分,负责输入输出获得数据,最上层是核心的算法部分,负责处理已获得的数据。
具体功能如下:
数据结构部分
数据结构部分是整个程序的最底层,负责存储部分。
因数组作为数据元素插入和删除操作较少,而顺序表空间利用率大且查看方便,故此程序选用二维顺序表保存系数。
数据结构文件中写的是有关其的所有基本操作以供其他文件调用。
多项式方程部分
多项式方程部分是程序的第二层,内容是有关方程组的所有函数、构建方程、输出方程等等,同时在此文件中获得方程系数并储存,同时此文件还负责显示菜单部分。
算法部分
此文件负责核心算法,处于整个程序最上层部分,负责列主元高斯消去法、
LU三角分解法和雅克比迭代法的具体实现过程。
通过调用方程文件的函数,将获得的数据进行处理运算,可以得到结果返回给方程主函数和输出的第二
总结:
主函数负责获取方程系数并显示,算法和方程作为后台程序,顺序表作为存储手段。
3代码
3.1主程序部分
//Solutionoflinearquations.cpp:
定义控制台应用程序的入口点。
//
#include"stdio.h"
#include"stdlib.h"
#include"stdafx.h"
#include"squencelist.h"
#include"equation.h"
#include"algorithm.h"
#include
while(Exflag)
{
GetEquation();ShowMenu();
}
return0;
}
3.2多项式方程部分
方程部分头文件
#ifndef_EQUATION_H
#define_EQUATION_H#include"stdio.h"
#include"stdlib.h"#include"squencelist.h"externintXnumbers;externintFnumber;externintExflag;
externdatacoa*A;
voidGetEquation(void);
voidShowMenu(void);
voidprintfunction(datacoa*A);
voidprintresx(datacoa*A);
voidTip(void);
#endif
方程部分CPP文件
#include"stdafx.h"
#include"equation.h"
#include"math.h"
#include"algorithm.h"
#include"stdio.h"
#include"stdlib.h"
#include
#include
////////////////////////多项式函数系数/////////////////////////voidGetEquation(void)
{
inti,j,flag=1;
floatx;
A=InitStruct();
while(flag)
{
cout<<"方程未知量和解总个数:
"<
cout<<"方程个数:
"< cin>>Fnumber; cout<<"输入方程系数,输入00结束(如输入215或者21534100"< cout<<"34100): "< cin>>x; while(x! =00) { for(i=1;i<=Fnumber;i++) { for(j=1;j<=Xnumbers;j++) { if(! Insert(A,x,i,j))exit(0);cin>>x; }} } j=1; printfunction(A); if(Xnumbers==Fnumber+1)flag=0; else { cout<<"方程可能无解"< A->m=0;A->n=0; } }}//////////////////////////显示交互/////////////////////////////voidShowMenu(void) { intx; cout<<"选择求解方程根的方法: "< cout<<"1.列主元高斯消去法"< cout<<"2.三角分解法"< cout<<"3.迭代法"< cin>>x; switch(x) { case1: ColumnGaussmethod(A); Tip();break; case2: LUmethod(A); Tip(); break; case3: ISODATAmethod(A); Tip(); break; default: break; } } ////////////////////////打印输出函数/////////////////////////// voidprintfunction(datacoa*A) { inti,j; cout<<"矩阵="< for(i=1;i<=A->m;i++) { for(j=1;j<=A->n;j++) { cout< } cout< } } ////////////////////////打印结果/////////////////////////// voidprintresx(datacoa*A) { inti; for(i=1;i<=A->m;i++) { cout<<"X"<data[i][Xnumbers+1];cout< } } ////////////////////////返回提示/////////////////////////// voidTip(void) { intflag; cout<<"输入000退出,其余返回: "< if(flag==000)Exflag=0; 3.3核心算法部分 算法部分头文件#ifndef_ALGORITHM_H#define_ALGORITHM_H #include"stdio.h" #include"stdlib.h" #include"stdafx.h"intJudge(doublex1,doublex0,doublee);voidColumnGaussmethod(datacoa*A);voidLUmethod(datacoa*A); voidISODATAmethod(datacoa*A);#endif 算法部分CPP文件 #include"algorithm.h" #include"stdafx.h" #include"squencelist.h" #include"equation.h" 误差判别//////////////////////////// #definemax100////////////////////////// inlineintJudge(doublex1,doublex0,doublee){ if(e==0) return0; if(x1==0) { if(fabs(x0) elsereturn0; } if(x0==0) { if(fabs(x1) elsereturn0; } if(fabs(x1-x0) return1; elsereturn0; } //////////////////////////列主元高斯消元法////////////////////////////voidColumnGaussmethod(datacoa*A) { cout<<"///////////////////列主元高斯消元法///////////////////"< inti,j,i2,flagc,k,j2; floattemp,res; for(i=1;i { flagc=i; for(i2=i+1;i2<=Fnumber;i2++) if((fabs(A->data[i2][i]))>(fabs(A->data[flagc][i])))flagc=i2; if(flagc! =i) for(k=i;k<=Xnumbers;k++) { temp=A->data[i][k]; A->data[i][k]=A->data[flagc][k];A->data[flagc][k]=temp; } for(i2=i+1;i2<=Fnumber;i2++) { temp=A->data[i2][i]/A->data[i][i]; for(j2=i;j2<=Xnumbers;j2++)A->data[i2][j2]=A->data[i2][j2]-temp*A->data[i][j2]; } } for(i=Fnumber;i>=1;i--) { for(j=Fnumber;j>=i+1;j--)A->data[i][Xnumbers]=A->data[i][Xnumbers]A->data[i][j]*A->data[j][Xnumbers+1]; res=A->data[i][Xnumbers]/A->data[i][i];Insert(A,res,i,Xnumbers+1); } printresx(A); } //////////////////////////直接三角分解法////////////////////////////voidLUmethod(datacoa*A) { datacoa*L,*U; inti,j,k,q; floattemp=0.0; L=InitStruct(); U=InitStruct(); for(i=1;i<=Fnumber;i++) { for(j=1;j<=Xnumbers;j++) { Insert(L,0,i,j); Insert(U,0,i,j); } } for(j=1;j<=Xnumbers;j++) Insert(U,A->data[1][j],1,j); for(i=2;i<=Fnumber;i++) Insert(L,A->data[i][1]/A->data[1][1],i,1); for(k=2;k<=Fnumber;k++) { for(j=k;j<=Xnumbers;j++) { for(q=1;q temp=temp+L->data[k][q]*U->data[q][j]; Insert(U,A->data[k][j]-temp,k,j); temp=0; } for(i=k+1;i<=Fnumber;i++) { for(q=1;q temp=temp+L->data[i][q]*U->data[q][k]; temp=A->data[i][k]-temp; Insert(L,temp/U->data[k][k],i,k); temp=0; } } Insert(U,U->data[Fnumber][Xnumbers]/U->data[Fnumber][Xnumbers-1],Fnumber,Xnumbers+1); for(k=Fnumber-1;k>=1;k--) { for(q=k+1;q temp=temp+U->data[k][q]*U->data[q][Xnumbers+1]; temp=U->data[k][Xnumbers]-temp; Insert(U,temp/U->data[k][k],k,Xnumbers+1);temp=0; }printresx(U); } //////////////////////////迭代法//////////////////////////// voidISODATAmethod(datacoa*A) { inti=1,j,k=0; floatx0=0,x1=1,temp=0; for(i=1;i<=Fnumber;i++) Insert(A,0,i,Xnumbers+1); while (1) { for(i=1;i<=Fnumber;i++) { for(j=1;j<=Fnumber;j++) { if(j==i)continue; temp=temp+A->data[i][j]*A->data[j][Xnumbers+1]; } temp=A->data[i][Xnumbers]-temp; temp=temp/A->data[i][i]; Insert(A,A->data[i][Xnumbers+1],i,Xnumbers+2); Insert(A,temp,i,Xnumbers+1);temp=0; } k++; for(i=1;i<=Fnumber;i++) temp=temp+fabs(A->data[i][Xnumbers+1]-A->data[i][Xnumbers2]); if((temp<0.000001)||k>max) break; temp=0; } DeleteLie(A,Xnumbers+2); printfunction(A); cout< cout< } 3.4数据结构部分 数据结构头文件#ifndef_SQUENCELIST_H#define_SQUENCELIST_H #include"stdio.h" #include"stdlib.h" #include"stdafx.h"#include #definemaxsize1024 /***sequenlist*/typedeffloatdatatype; typedefstruct { datatypedata[maxsize][maxsize];intm,n; }datacoa; datacoa*InitStruct(); intLength(datacoa*); intInsert(datacoa*,datatype,int,int);voidDeleteLie(datacoa*L,intj);voidDeleteLine(datacoa*L,inti); #endif 数据结构CPP文件 #include"stdafx.h" #include"squencelist.h" /////////////////////////////////// 数据结构部分 12/18 /////////////////////////////////////////// ///////////////////////////////////sequenlist///////////////////////////////////////////datacoa*InitStruct() { datacoa*L=(datacoa*)malloc(sizeof(datacoa)); L->m=0; L->n=0; returnL; //datacoa*L=newdatacoa; } intLength(datacoa*L) { returnL->m*L->n; } intInsert(datacoa*L,datatypex,inti,intj) { intk; if((L->m>=maxsize-1)||(L->n>=maxsize-1)) { cout<<"表已满"< return0; } for(k=L->n;k>=j;k--) L->data[i][k+1]=L->data[i][k]; L->data[i][j]=x; if(i>L->m)L->m++; if(j>L->n)L->n++; return1; } voidDeleteLie(datacoa*L,intj) { intk,i; if((j<1)||(j>L->n)) { cout<<"非法删除位置"< } for(i=1;i<=L->m;i++) { for(k=j;k<=L->n;k++) L->data[i][j]=L->data[i][j+1];} L->n--; } voidDeleteLine(datacoa*L,inti) { intk,j; if((i<1)II(i>L->m)) { cout<<"非法删除位置"< } for(j=1;j<=L->n;j++) { for(k=i;k<=L->m;k++) L->data[i][j]=L->data[i+1][j];} L->m--; } 4运行结果 4.1列主元高斯消去法运行结果 4.2LU三角分解法运行结果 4.3雅克比迭代法运行结果 输入方程系数■辅入圃结束: 如输入215或者215341k<0 341BA): 4-1-101 -140-12 -1«4-10 0-1-14100 矩牢 4-1-101 r的去片sfe解一my求王異出境-i Lt■■■■ _b 7 ■ 0 快代逑热12搜狗折盲渝A法全弋 边界情况调试 超疋方程等可能无解的情况 迭代法迭代次数超出100次的情况 匚: Windows\sysTem32\cmd+exe 4.? 31.21 3.531.4& 5.054M 3.541.04 圧阵- 4 -1.^8 2.92 2.S1 3.47 77 93 &3 05 2.4 1.21 1.46 4.B4 3.方古羅解元建来王東岀择列三迭退 1: F- 里 54鸞般 •」l-g陥 l_bb 丄-丄 1.31 £.01 1.BZ 1 1 1 1 1 迭代起过100;灯 U- 的去館法力葛解解灵曜*干梟岀囁三迭退选」;«. -32-U4-20.07 -S.K3飞.3-12・11今 5总结 这次的程序设计题看似简单实则临界代码区很多,调试时很容易出错 输入输出 使用二维顺序表存储数据对于此题更加方便,也解决了C++/C语言数组下标从0开始的不便,将下标转换成习惯下标。 在迭代法的时候。 将两次的x值分 别存储在二维表后面,不需要另开空间,节省变量。 列主元高斯消元法 1.循环的顺序很重要 2.边界条件单独处理 雅克比迭代法 1.设置最大循环次数不能进入死循环 6参考资料 《计算方法与实习》孙志忠等著第五版---东南大学出版社《软件技术基础》周大为等著第一版---西安电子科技大学出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 线性方程组 数值 解法