数值分析课程设计题目.docx
- 文档编号:6702172
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:18
- 大小:263.77KB
数值分析课程设计题目.docx
《数值分析课程设计题目.docx》由会员分享,可在线阅读,更多相关《数值分析课程设计题目.docx(18页珍藏版)》请在冰豆网上搜索。
数值分析课程设计题目
数值分析课程设计
求解线性方程组
陈泽光
200930760106
指导教师
李娇娇讲师
学院名称
理学院
专业名称
信息与计算科学
提交日期
2011年6月10日
一、问题的提出
线性方程组是联立方程组的一种特殊的方程组,线性方程组的数值解法可以分为直接法和迭代法两种。
这两种方法各有各的特点,计算方法有何优劣,所得的结果哪种比较精确,精度的选择如何。
然后每种方法有各个因素对该方法有何影响。
迭代的法的收敛条件是什么也是我们要讨论的问题。
二、实验内容
分别用SOR方法和高斯消元的LU分解算法(lii=1,i=1,…,n)求解给定的线性方程组AX=B,以感受迭代法和直接法的不同特点。
1.设计要求:
自定义函数SOR(A,B,w,MAXN,TOL),以实现SOR方法求解线性方程组AX=B,其中
A——系数矩阵;
B——常数列向量;
w——松弛因子;
MAXN——迭代的最大次数
TOL——
达到的精度上限
返回值有以下四种可能:
a)-2:
SOR方法不收敛;(不收敛的依据为
的某个分量值超出区间[-108,108]。
)
b)-1:
矩阵有一列全为0;
c)0:
算法经过MAXN次迭代还未收敛;
d)k:
SOR方法经k次迭代收敛,求得方程组的解向量X记录下来.
2.自定义函数Direct(A,B),以实现高斯LU分解的方法求解线性方程组AX=B,其中
A——系数矩阵;
B——常数列向量;
返回值有两种可能:
e)“LUdecompsitionfailed.”:
分解过程中U的对角线元素至少一个为0;
f)X:
分解过程中
3.分别使用步骤1中定义的函数SOR(A,B,w,MAXN,TOL)和步骤2中定义的函数Direct(A,B)进行测试,记录返回值及X值(算法收敛或有效的情形,保留4位小数):
(1)测试1:
MAXN=1000,TOL=10-9,w分别取1,1.05,1.1,1.2,1.3,1.6,1.95;
(2)测试2:
MAXN=1000,TOL=10-9,w=1;
(3)测试3:
MAXN=1000,TOL=10-9,w=1.2;
(4)测试4:
MAXN=1000,TOL=10-9,w=1,1.1,1.3,1.8;
(5)测试5:
:
n阶Hilbert矩阵定义为
取n=3,
MAXN=1000,TOL=10-9,w=1,1.3,1.6,1.9;
测试6:
A为4阶Hilbert矩阵,
MAXN=10000,TOL=10-6,w=1,1.3,1.6,1.8,1.9.
4.对于步骤3的测试结果,有条理地写出你所发现的求解方程组的直接法和迭代法的特点。
三、实验结果及分析
测试
(1)松弛迭代法w=1
w=1.05
w=1.1
w=1.2
w=1.3
w=1.6
w=1.95
高斯消元法:
测试
(2)松弛迭代法
高斯消元法
测试(3)松弛迭代法
高斯消元法
测试(4)松弛迭代法
w=1
w=1.1
w=1.3
w=1.8
高斯消元法
测试(5)松弛迭代法
w=1
w=1.3
w=1.6
w=1.9
高斯消元法
测试(6)松弛迭代法:
w=1
w=1.3
w=1.6
w=1.8
w=1.9
高斯消元法:
四、关于本设计的体会
通过用编程的方法来加深松弛迭代法和高斯消元法的应用,很好的体会这两种方法的不同和思想。
迭代法的基本思想和方法完全适用于线性方程组的情况,在算法分析和讨论中,经常要遇到向量范数、矩阵范数以及序列极限概念。
而高斯消元法尽管在理论上是完善的算法,但因为实际计算时总会有舍入误差存在,所以解出来的解是准确解的近似值。
理论再结合实际的上机操作能很好解决多元线性方程组,从而能较方便和精确的求解出方程组的根。
通过这次的课程设计,我不仅的巩固了书本里面的知识点,而且使我能更熟练c语言的算法、结构和思想。
五、参考文献
数值分析/史万民,吴裕树,孙新编著.—3版.北京:
北京理工大学出版社,2004
ISBN978–7–5640–3107-7
六、附录
所用编程软件Code:
:
Blocks10.05或c++
松弛迭代法(c语言代码):
#include"stdio.h"
#include"math.h"
#defineMax20
doublea[Max][Max],l[Max][Max],u[Max][Max],b[Max],x[Max],X[Max],num[Max];
inti,j,n,k,MAXN;
doublew,sum1,sum2;
doubleTOL;
doubleSOR(intn,doublea[Max][Max],doubleb[Max],doublew,intMAXN,doubleTOL)
{
doubletemp,max;
intsum=0,q;
for(i=0;i x[i]=1; for(i=0;i { for(j=0;j { if(a[j][i]==0) sum++; } } if(sum==n)return(-1); for(i=0;i { for(j=0;j { if(i>j)l[i][j]=-a[i][j]/a[i][i]; if(i } b[i]=b[i]/a[i][i]; } for(k=1;k<=MAXN;)//迭代循环,k是计时器 { for(i=0;i { for(j=0;j sum1+=l[i][j]*X[j]; for(j=i;j sum2+=u[i][j]*x[j]; X[i]=(1-w)*x[i]+w*(sum1+sum2+b[i]); if(x[i]>100000000||x[i]<-100000000) return(-2); num[i]=fabs(X[i]-x[i]); max=num[0]; for(q=1;q if(max sum1=0; sum2=0; } for(i=0;i x[i]=X[i]; k++; if(k==MAXN) return(0); if(max } if(k return(k); } main() { inti,j; intresult; doublenuma,numb; charch; do { printf("请输入方程组的元数n="); scanf("%d",&n); printf("输入系数矩阵A: \n"); for(i=0;i {for(j=0;j { scanf("%lf",&numa); a[i][j]=numa; } } printf("输入常数列向量B: "); for(i=0;i { scanf("%lf",&numb); b[i]=numb; } printf("输入松弛因子w: "); scanf("%lf",&w); printf("输入迭代的最大次数MAXN: "); scanf("%d",&MAXN); printf("输入精度上限TOL: "); scanf("%lf",&TOL); getchar(); result=SOR(n,a,b,w,MAXN,TOL); switch(result) { case-2: printf("-------SOR方法不收敛-------\n"); break; case-1: printf("-------矩阵有一列全为0-------\n"); break; case0: printf("-------算法经过MAXN次迭代后还未收敛--------\n"); break; default: printf("--------SOR方法经k=%d次迭代收敛,求得方程组的解向量X为--------\n",result); for(i=0;i printf("X%d=%0.4f",i+1,x[i]); break; } printf("\n重新输入? (y/n)"); scanf("%c",&ch); getchar(); }while(ch=='y'); } 高斯消元法(c语言代码): #include #include #defineMax50 doublea[Max][Max],l[Max][Max],u[Max][Max],z[Max],b[Max],x[Max]; doubleFl(int,int); doubleFz(int); doubleFu(int,int); doubleFx(int); intn; main() { inti,j,k; floatnuma,numb; printf("请输入方程组的元数n="); scanf("%d",&n); printf("输入矩阵的A值: \n"); for(i=0;i {for(j=0;j { scanf("%f",&numa); a[i][j]=numa; } } printf("输入常数列向量B: "); for(i=0;i { scanf("%f",&numb); b[i]=numb; } getchar(); for(i=0;i l[i][i]=1;//求解l[i][i] for(j=0;j { for(i=0;i { if(i>j) l[i][j]=Fl(i,j);//求解l[i][j],(i! =j) else u[i][j]=Fu(i,j);//求解u[i][j],(i<=j) } } for(i=0;i for(i=n-1;i>=0;i--)x[i]=Fx(i);//求解x[i] for(i=0;i { if(u[i][i]==0) { printf("\n方程组无解"); return0; getch(); getch(); } } printf("矩阵L的值: \n");//输出 for(i=0;i { for(j=0;j printf("\n"); } printf("矩阵U的值: \n"); for(i=0;i { for(j=0;j printf("\n"); } printf("向量Z的值: \n"); for(i=0;i printf("\n方程组的解\n"); for(i=0;i } doubleFl(inti,intj) { doublesum=0; intk; if(i>j) { for(k=0;k l[i][j]=(a[i][j]-sum)/u[j][j]; } returnl[i][j]; } doubleFu(inti,intj) { doublesum=0; intk; if(i<=j) { for(k=0;k u[i][j]=a[i][j]-sum; } returnu[i][j]; } doubleFz(inti) { doublesum=0; intk; for(k=0;k z[i]=b[i]-sum; returnz[i]; } doubleFx(inti) { doublesum=0; intk; for(k=i+1;k x[i]=(z[i]-sum)/u[i][i]; returnx[i]; } 七、教师评价
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 分析 课程设计 题目