高斯消去复合辛普森龙贝格数值分析法数值分析课程设计.docx
- 文档编号:29938562
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:30
- 大小:1.02MB
高斯消去复合辛普森龙贝格数值分析法数值分析课程设计.docx
《高斯消去复合辛普森龙贝格数值分析法数值分析课程设计.docx》由会员分享,可在线阅读,更多相关《高斯消去复合辛普森龙贝格数值分析法数值分析课程设计.docx(30页珍藏版)》请在冰豆网上搜索。
高斯消去复合辛普森龙贝格数值分析法数值分析课程设计
华北科技学院
课程设计说明书
班级:
计算B101姓名:
设计题目:
高斯消去、复合辛普森、龙贝格数值分析法
设计时间:
2013.01.12至2013.01.16
指导教师:
评语:
评阅成绩:
评阅教师:
目录
设计总说明I
前言II
第1章总体设计方案1
第2章算法分析及设计2
2.1高斯消去法2
2.1.1高斯消去法法分析:
2
2.1.2高斯消去算法设计3
2.2复合辛普森3
2.2.1复合辛普森法算法分析3
2.2.2复合辛普森法算法设计4
2.3龙贝格算法4
2.3.1龙贝格算法分析4
2.3.2龙贝格算法设计5
第3章软件详细设计6
3.1主界面设计6
3.2功能设计7
3.2.1高斯消去法的实现7
3.2.2复合辛普森法的实现7
3.2.3龙贝格算法的实现9
第4章软件测试10
4.1高斯消法的测试10
4.1.1软件计算10
4.1.2Matlab计算10
4.2复合辛普森法的测试11
4.2.1软件计算11
4.2.2Matlab计算11
4.3龙贝格法的测试12
4.3.1软件计算12
4.3.2Matlab计算12
4.4测试结果12
第5章总结13
参考文献14
附录15
设计总说明
在实际处理高等数学的问题时常常需要计算积分。
有些数值方法,如微分方程和积分方程的求解,也都和积分计算相联系。
因此这类问题的解决是十分重要的。
一般我们通过寻找原函数的方法求解,但实际使用这种求积方法往往有困难,因为有大量的被积函数是找不到用初等函数表示的原函数的。
因此有必要研究积分的数值计算问题。
而一般书中所讲的算法又大多比较繁杂,难算。
如果运用笔算则不仅耗时而且很有可能算错,精度一般也不理想。
无疑借助计算机编程解决这类问题是最佳的选择。
因此,通过编写一个软件来借助于计算机的强大的运算能力来解决这个问题是十分紧迫的。
通过书中的算法编写出几段程序作为积分计算的内核,再以VisualC++6.0设计一个前台界面供用户操作将能很好的处理这个问题。
本次设计一切遵循实际应用原则,所做出的界面和功能也一切以方便各类用户为基准。
这样就可以方便用户的熟练使用,防止误操作。
此外,本次设计过程还遵循简便性原则。
作为一项庞大工程,设计过程将尽量简洁明了,消除一些不必要的冗余成分。
程序的结构也将尽可能的清晰,因为一个结构不清晰的程序将无法获得好的调试效果,也不容易修改。
当数据量很大时运算是十分耗时的,因此如果要提高这个系统本身的响应时间还必须设计一个高效的算法。
这会大大提高响应速度。
软件内部的代码页将尽可能的简洁,以加快软件本身的响应时间。
本软件实现了三个功能高斯消去法解线性方程组、辛普森和龙贝格数值积分
关键词:
消去;辛普森;龙贝格
前言
数值分析本身是解决用一般方法难以解决的数学问题,通过诸如拟合,逼近之类的方法去求近似值。
正是由于它自身的这个特点,决定了它所适合解决的问题的复杂性和易于用程序解决的特性。
本课程设计是在学习了数值分析和C语言等有关课程后,通过实际的操作来熟悉数值分析和相关软件的应用,培养独立的完成对相关课题或者项目的分析能力、设计能力和调试能力。
好的数值积分软件可以方便的为我们求解出积分值。
课程设计,着重培养的是学生的自学能力,以及独立分析互联网上和图书馆里的各种资料,用来丰富自己的知识并且提高对Matlab、VC++等软件的实际操作能力。
通过这次的课程设计,使我们对已经学习过的数值分析课程的进一步的掌握,对知识进行最大程度的消化融汇。
因此这次的课程设计对我们来说具有非常重要的作用:
为以后学习工作做必要的准备和实践,提高自身对数值分析的认识以及软件开发的能力。
本次课程设计就是针对它的这个特点,我针对所学课程中,高斯消去法解线性方程组、辛普森和龙贝格数值积分相关内容,制作了一个基于MFC的数学软件,最后得出一个可视化的窗口,在窗口中点击相应按钮,输进数值就可以直接计算出解。
第1章总体设计方案
1.1软件结构设计
图1软件功能结构图
第2章算法分析及设计
2.1高斯消去法
2.1.1高斯消去法法分析:
对于一般的
阶方程组,将高斯消去法归纳如下:
为了便于区分,对所有常数加上一个上标,即
此处需说明上标的含义
消去过程
第一步:
若
,消去方程
的第一项,令
用
乘第一个方程,加到第
个方程上,即
这样得到的
原方程转化为同解方程组
同样的方法,到第
步
若
,令
做到第
步的时侯,原方程组转化成同解的上三角方程组
回代过程
若
,就可以回代得原方程组的解
2.1.2高斯消去算法设计
CStringAstr=A,Bstr=B,str="",strTemp="",d;
inti;
double*a,*b;
a=(double*)malloc(n*n*sizeof(double));
b=(double*)malloc(n*sizeof(double));
a=change(n*n,A);
b=change(n,B);
if(rgauss(n,a,b)!
=0)
for(i=0;i<=n-1;i++)
{
strTemp.Format("x(%d)=%f\n",i+1,b[i]);
if(i==0)
str=str+strTemp;
else
str=str+","+strTemp;
}
else
{
MessageBox("无法计算!
");
}
Xstr=str;
UpdateData(false);
2.2复合辛普森
2.2.1复合辛普森法算法分析
复合辛普森公式为
,计算过程为:
令
;
对
计算
。
2.2.2复合辛普森法算法设计
floatSimpson(float(*f)(float),floata,floatb,intn)
{
intk;
floats,s1,s2=0.0;
floath=(b-a)/n;
s1=f(a+h/2);
for(k=1;k<=n-1;k++)
{
s1+=f(a+k*h+h/2);
s2+=f(a+k*h);
}
s=h/6*(f(a)+4*s1+2*s2+f(b));
returns;
}
2.3龙贝格算法
2.3.1龙贝格算法分析
2.3.2龙贝格算法设计
floatRomberg(floata,floatb,float(*f)(float),floatepsilon)
{
intn=1,k;
floath=b-a,x,temp;
floatT1,T2,S1,S2,C1,C2,R1,R2;
T1=(b-a)/2*((*f)(a)+(*f)(b));
while
(1)
{
temp=0;
for(k=0;k<=n-1;k++)
{
x=a+k*h+h/2;
temp+=(*f)(x);
}
T2=(T1+temp*h)/2;
if(fabs(T2-T1) returnT2; S2=T2+(T2-T1)/3.0; if(n==1){T1=T2;S1=S2;h/=2;n*=2;continue;} C2=S2+(S2-S1)/15; if(n==2){C1=C2;T1=T2;S1=S2;h/=2;n*=2;continue;} R2=C2+(C2-C1)/63; if(n==4){R1=R2;C1=C2;T1=T2;S1=S2;h/=2;n*=2;continue;} if(fabs(R2-R1) returnR2; R1=R2;C1=C2;T1=T2;S1=S2;h/=2;n*=2;} 第3章软件详细设计 3.1主界面设计 数值积分软件主界面如图2所示,包括三大功能: 三个功能高斯消去法解线性方程组、辛普森和龙贝格数值积分。 为了使软件美观,还可以为软件添加背景图片,这样就使软件显得不再单调。 图2主界面 添加背景图片关键代码: voidCAutoTrap: : OnPaint() { CPaintDCdc(this);//devicecontextforpainting CRectrect; GetClientRect(&rect); CDCdcMem; dcMem.CreateCompatibleDC(&dc); CBitmapbmpBackground; bmpBackground.LoadBitmap(IDB_BITMAP2); BITMAPbitmap; bmpBackground.GetBitmap(&bitmap); CBitmap*pbmpOld=dcMem.SelectObject(&bmpBackground); dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY); } 3.2功能设计 3.2.1高斯消去法的实现 通过类向导为控件赋值,从界面获取矩阵的阶数和矩阵A、B,从而进行计算,将结果显示在对应框。 若输入错误的数据将进行无解提示。 图3高斯消去法 3.2.2复合辛普森法的实现 同样,通过类向导为控件赋值,从界面获取上下界、划分区间及运算次数,从而进行计算,将结果显示在列表框。 图4复合辛普森法 关键代码: (1)列表框表头初始化代码: BOOLCSimpson: : OnInitDialog() { Cdialog: : OnInitDialog(); //TODO: Addextrainitializationhere m_combo.SetCurSel(0); m_List1.SetExtendedStyle(LVS_EX_FLATSB |LVS_EX_FULLROWSELECT |LVS_EX_HEADERDRAGDROP |LVS_EX_ONECLICKACTIVATE |LVS_EX_GRIDLINES); m_List1.InsertColumn(0,”s[n]”,LVCFMT_LEFT,80); m_List1.InsertColumn(1,”值”,LVCFMT_LEFT,140); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //EXCEPTION: OCXPropertyPagesshouldreturnFALSE } (2)结果显示代码: for(intj=0;j { if(index==0) s=Simpson(f7,m_xiajie,m_shangjie,n); if(index==1) s=Simpson(f8,m_xiajie,m_shangjie,n); if(index==2) s=Simpson(f9,m_xiajie,m_shangjie,n); p.Format("%d",n); p="s["+p+"]"; q.Format("%f",s); m_List1.InsertItem(j,""); m_List1.SetItemText(j,0,p); m_List1.SetItemText(j,1,q); n*=2; } 3.2.3龙贝格算法的实现 同样,通过类向导为控件赋值,从界面获取上下界及精度值。 点击计算按钮,即可将结果显示在结果框点击返回按钮,返回主界面。 若输入错误的数据将进行错误提示。 图5龙贝格算法 第4章软件测试 4.1高斯消法的测试 4.1.1软件计算 用本软件计算结果如下 图6高斯消去法结果显示 4.1.2Matlab计算 Matlab计算结果如下: >>symsx f=int(sin(x)/x,x,0,1) f= sinint (1) >>sinint (1) ans= 0.9461 当输入矩阵无解时会弹出无解的对话框 图7矩阵无解的对话框 4.2复合辛普森法的测试 4.2.1软件计算 本软件计算结果如下: 图8复合辛普森法结果显示 4.2.2Matlab计算 Matlab计算结果如下: >>symsx f=int(cos(x),x,0,1) f= sin (1) >>sin (1) ans= 0.8415 4.3龙贝格法的测试 4.3.1软件计算 本软件计算结果如下: 图9龙贝格算法结果显示 4.3.2Matlab计算 Matlab计算结果如下: >>symsx f=int(1/(1+x^2),x,0,1) f= pi/4=0.78539815 4.4测试结果 可以看到每一种算法都接近其真实值,所以本软件计算结果具有相当的可靠性。 可以作为简单积分的计算工具。 第5章总结 我认为数值分析是一门相对来说比较容易学会的课程,但是它的算法比较多所以学起来很复杂。 由于我们已经学习过c语言等多门编程铺垫的课程,而且在前几周我们还做了两周的mfc做前台的数据库课设,因此在做数值分析课程设计时mfc做前台的编程相对更简单点了。 通过一周的时间终于完成了数值分析软件的设计开发,由于时间有限不免存在很多问题。 在课程设计的过程中问题层层出现,很多时候觉得无可入手,想尽办法也不知道该怎么解决。 但是经过我和同学的探讨,面对各种考验,坚持不懈的努力后问题总会解决。 数值积分要求软件能够准确并快速的计算出被积函数的积分值,最主要的是一定要精确本软件界面清新,操作简单,能够快速准确的计算一定范围内的积分值。 在某种程度上还是具有一定的灵活性的,比如可以设置精度,积分区间等。 这样,在可选范围内还是能够比较准确的求解的。 用MFC编程求解数值积分的过程中最大的困难就是被积函数不能自定义,也就是被积函数是在局域范围内的,也是目前为止没有解决的问题,这是本软件有待改进的地方。 为了验证软件结果的精确度,首先我用此软件计算出相应方法的结果,又在matlab软件中进行了结果的验证和比较,最后发现此软件结果的精确度相对比较高,因此此软件有很好的可实行性。 参考文献 [1]陈越,童若峰.数值分析课程设计[M].浙江: 浙江大学出版社,2009. [2]李庆扬,王能超.数值分析[M].北京: 清华大学出版社,2011. [3]刘小石.郑准.马林伟.杨帆.精通VisualC++6.0..清华大学出版社.2000 [4]郑阿奇.丁有和.VisualC++ 教程.清华大学出版社.2005 附录 源程序清单 1.线性方程组的高斯消法: Zujiemian: : Zujiemian(CWnd*pParent/*=NULL*/) : CDialog(Zujiemian: : IDD,pParent) { //{{AFX_DATA_INIT(Zujiemian) n=0; A=_T(""); B=_T(""); Xstr=_T(""); //}}AFX_DATA_INIT } voidZujiemian: : DoDataExchange(CDataExchange*pDX) { CDialog: : DoDataExchange(pDX); //{{AFX_DATA_MAP(Zujiemian) DDX_Text(pDX,IDC_EDIT1,n); DDX_Text(pDX,IDC_EDIT2,A); DDX_Text(pDX,IDC_EDIT3,B); DDX_Text(pDX,IDC_EDIT4,Xstr); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(Zujiemian,CDialog) //{{AFX_MSG_MAP(Zujiemian) ON_BN_CLICKED(IDC_BUTTON1,OnButton1) ON_BN_CLICKED(IDC_BUTTON2,OnButton2) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// //Zujiemianmessagehandlers voidZujiemian: : OnButton1() { //TODO: Addyourcontrolnotificationhandlercodehere UpdateData(true); CStringAstr=A,Bstr=B,str="",strTemp="",d; inti; double*a,*b; a=(double*)malloc(n*n*sizeof(double)); b=(double*)malloc(n*sizeof(double)); a=change(n*n,A); b=change(n,B); if(rgauss(n,a,b)! =0) for(i=0;i<=n-1;i++) { strTemp.Format("x(%d)=%f\n",i+1,b[i]); if(i==0) str=str+strTemp; else str=str+","+strTemp; } else { MessageBox("无法计算! "); } Xstr=str; UpdateData(false); } voidZujiemian: : OnButton2() { //TODO: Addyourcontrolnotificationhandlercodehere UpdateData(true); n=0; A=""; B=""; Xstr=""; UpdateData(false); } 软件中实现消去法算法主要代码: #include"stdlib.h" #include"math.h" #include"stdio.h" intrgauss(intn,doublea[],doubleb[]) { int*js,l,k,i,j,is,p,q; doubled,t; js=(int*)malloc(n*sizeof(int));//用于记忆列交换信息的动态空间 l=1;//置非奇异标记 for(k=0;k<=n-2;k++) { d=0.0; for(i=k;i<=n-1;i++)//全选主元 for(j=k;j<=n-1;j++) { t=fabs(a[i*n+j]); if(t>d) { d=t; js[k]=j; is=i; } } if(d+1.0==1.0) l=0; else{ if(js[k]! =k) for(i=0;i<=n-1;i++)//列交换 { p=i*n+k;q=i*n+js[k]; t=a[p];a[p]=a[q];a[q]=t; } if(is! =k) { for(j=k;j<=n-1;j++)//行交换 { p=k*n+j;q=is*n+j; t=a[p];a[p]=a[q];a[q]=t; } t=b[k];b[k]=b[is];b[is]=t; } } if(l==0)//奇异返回 { free(js); printf("fail\n"); return(0); } d=a[k*n+k]; for(j=k+1;j<=n-1;j++)//归一化 { p=k*n+j;a[p]=a[p]/d; } b[k]=b[k]/d; for(i=k+1;i<=n-1;i++)//消元 { for(j=k+1;j<=n-1;j++) { p=i*n+j; a[p]=a[p]-a[i*n+k]*a[k*n+j]; } b[i]=b[i]-a[i*n+k]*b[k]; } } d=a[(n-1)*n+n-1]; if(fabs(d)+1.0==1.0)//奇异返回 { free(js); printf("fail\n"); return(0); } b[n-1]=b[n-1]/d;//计算解向量的最后一个分量 for(i=n-2;i>=0;i--)//回代 { t=0.0; for(j=i+1;j<=n-1;j++) t=t+a[i*n+j]*b[j]; b[i]=b[i]-t; } js[n-1]=n-1; for(k=n-1;k>=0;k--)//恢复解向量 if(js[k]! =k) { t=b[k];b[k]=b[js[k]];b[js[k]]=t;//解向量行交换 } free(js); return (1);//正常返回标记 } 1. 2.复合辛普森法关键代码: floatf7(floatx) { if(x==0) return1; else returnsin(x)/x; } floatf8(floatx) { returncos(x); } floatf9(floatx) { return1/(1+x*x); } floatSimpson(float(*f)(float),floata,floatb,intn) { intk; floats,s1,s2=0.0; floath=(b-a)/n; s1=f(a+h/2); for(k=1;k<=n-1;k++) { s1+=f(a+k*h+h/2); s2+=f(a+k*h); } s=h/6*(f(a)+4*s1+2*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 消去 复合 辛普森龙贝格 数值 分析 课程设计