《数值分析课程设计指导书.docx》由会员分享,可在线阅读,更多相关《数值分析课程设计指导书.docx(49页珍藏版)》请在第一文库网上搜索。
1、散面分析诿彳基设豺瑟乡-121刖S课程设计是高等教育中一个重要的实践环节,它与实验、实习、毕业设计共同构成了学校的实践性教学体系。课程设计是用所学的理论知识结合相关经验,构成一个有效、可行、适用的、简单的系统,来达到一个或多个实际需求的一种有目的的活动。它不同于实验室里的实验和科研,实验是借助于实验软硬件条件,验证某些已成熟或尚在形成的理论或成果;科研则是对未知世界的探索;而课程设计则是为解决生产、生活等人类社会实际问题,如:开发产品、实现算法等等。与实验、科研和工程设计相比较,课程设计具有两个显著的特征:一是教学性,学生在教师指导下针对某一门课程的学习进行工程设计;二是实践性,软件类的课程设
2、计包括基础理论的应用、算法设计、算法实现、程序编制、程序调试、数据分析等实践内容。通过课程设计,学生能进一步理解理论教学内容,同时能培养初步的工程应用和实践能力。课程设计与其他工程技术一样,有一定的规律性,主要体现为“明确目标一制定方案T实现方案一资料整理一撰写报告”等认知规律。古人云:“没有规矩,不成方圆”,依照一定的规律和方法进行设计不但可以使设计工作做得全面细致,少走许多弯路,而且还能培养科学的思维方法和工程设计习惯。因此,利用现有资源,结合自身实际,努力提高理论水平和工程应用能力是完成好课程设计的基本方法和基本目的。数值分析是一门实践性很强的课程,尤其是随着计算机科学的发展,数值分析成
3、为一门日益受到工程领域欢迎和越来越具有实践性的课程。在越来越多的学校开设数值分析课程的同时,开设数值分析课程设计正在成为一种趋势,目前巳有浙江大学等一些著名大学开设了这个实践性教学环节。我校数学类专业决定从2008级开始开设这一实践环节,目的是加强学生编程能力的训练与培养,通过这一课程设计,使学生能够用C语言编写数值分析课程中涉及的主要算法。本课程设计共有七个问题,分别是插值、拟合、线性方程组的直接法求解和迭代求解、数值积分、非线性方程的求解、常微分方程初值问题的数值解。每个课程设计问题分为目的、基本知识回顾、基本问题、算法描述、程序实现和编程问题六个部分来叙述,其中算法描述是使我们编写的程序
4、结构合理,思路清晰的一个重要步骤。程序实现部分是我们给出的实例,编程问题则是需要学生完成的作业。课程设计1插值函数的编程实现1课程设计2曲线拟合的编程实现15课程设计3数值积分的编程实现25课程设计4线性方程组直接解法的编程实现30课程设计5线性方程组迭代解法的编程实现40课程设计6非线性方程求解的编程实现47课程设计7常微分方程数值解的编程实现50课程设计1插值函数的编程实现一、课程设计目的:1 .巩固多项式插值的概念、理解插值的具体方法;2 .掌握几种常用插值方法的编程实现,如1agrange插值、分段线性插值、分段二次插值等。二、基本知识回顾:1 .插值问题的定义:设函数y=f(x)在区
5、间句上有定义,且己知在点%x1一(七)3 .分段线性插值在数值分析课程中,我们已经知道高次多项式插值是不稳定的,因此,需要用分段低次插值来解决数据点较多的情形,我们先讨论分段线性插值。简单地说,将每两个相邻的节点用直线连起来,如此形成的一条折线就是分段线性插值函数,将这个函数记作/(X),则它满足,(xz)=X,且/”(外在每个小区间Xy,X*上是线性函数(=0,1,!)可以表示为W=y7j=0其中:0,xixxy(=oW舍去)Xjj+(j=时舍去)其它/“(X)有良好的收敛性,即对于x,加有,1im.(x)=g(x),0o用/“(X)计算X点的插值时,只用到X左右的两个节点,计算量与节点个数
6、无关。但越大,分段越多,插值误差越小。实际上用函数表作插值计算时,分段线性插值就足够了,如数学、物理中用的特殊函数表,数理统计中用的概率分布表等。4 .分段二次插值具体计算中,如需更高精度,则可考虑使用分段二次插值,分段二次插值的数学定义为:设/()是区间凡句上的函数,在节点a=x0x1)+(-2i)(-2)(x(X2iWi+1)(电:-x2i+2)(x21+1%2i)*2i+1-X2i+2)(x-x2i)(x-x2i+,)r.r1+(qfx2i+2)XE,x2i+21x2i+2x2ix2i+2-2+1)其整体表达式为:Ph(X)=Ef(Xi)Ii(X)/=Oxa,b2m其中也次是由各小区间上
7、的抛物线或直线连接而成的分段拉格朗日插值基函数。(X-X1)(X-X2)!Jxx0,x2,o(x)=(“0一再)(x。-*2)Oxx0,x2。一九2,)(工一注2)4+1(X)=(无2i+1-X2i(X2M-Wi+2)Ox,+2xx2i,x2i+2(X-Wt)*-*2i-)(-2)(-)(%一沁1)(工一工2,+2)(*2i-X2i+)(2x2i+2)OXEX2i_29X2iX1-22i+21xx2/_2,x2/+2,2,(X)=(*2j-x2m-1)(m-x2m-)Oen-2*X任工2吁2,/,J5 .牛顿(NeWtOi1)插值对于已知的数据关系:M=/(M),可以构造牛顿插值多项式如下:N
8、,(x)=/U0)+/,x(X-)+/,为,工2(X-XO)(x-xI)+x0,x(x-x0)(x-xm.1)其中:/5小,S川为3的、阶差商余项为:&(冗)=f(x)-NH(X)=fx,xo,x1,xj(x)三、基本问题:编程实现拉格朗日(1agrange)插值和分段线性插值。四、算法描述:(一)拉格朗日插值的算法:1 .定义拉格朗日插值基函数:doub1einter_1_Base(doub1eX_set,doub1ex,intn,intk)其中:X_set用来存放节点Xj的值,X用来传递需求的X值,n用来存放小区间的个数,k表示第攵个基函数,返回类型为doub1e;2 .定义拉格朗日插值函
9、数,调用基函数;doub1einter_1(doub1eX_set,doub1eY_set!,doub1ex,intn)其中:X_set用来存放节点再的值,Y_set用来存放对应于看点的H值,X用来传递需求的X值,n用来存放小区间的个数,返回类型为doub1e;3 .定义主函数,调用插值函数。这里主要完成数据的输入和输出,功能函数的调用。(-)分段线性插值的算法:1 .定义分段线性插值基函数:doub1einter_1in_Sec_Base(doub1eX_set,doub1ex,intn,intk)其中:X_set口用来存放节点Xj的值,X用来传递需求的X值,n用来存放小区间的个数,k表示第
10、Z个基函数,返回类型为doub1e;2 .定义拉格朗日插值函数,调用基函数;doub1einter_inter_Sec_1(doub1eX_set,doub1eY_setJ,doub1ex,intn)其中:X_set用来存放节点Xi的值,Y_set口用来存放对应于芭点的必值,x用来传递需求的X值,n用来存放小区间的个数,返回类型为doub1e;3 .定义主函数,调用插值函数。这里主要完成数据的输入和输出,功能函数的调用。五、程序实现:(一)拉格朗日插值的C语言实现:(1)插值基函数的定义:#inc1ude#defineN10doub1einter_1_Base(doub1eX_set,doub
11、1ex,intn,intk)(inti;doub1ey=1;for(i=0;ik;i+)(y*=(x-X_seti)/(X_setk-X_seti);1for(i=k+1;i=n;i+)(y*=(x-X_seti)/(X_setk-X_seti);return(y);(2)插值函数的定义:doub1einter_1(doub1eX_set,doub1eY_set,doub1ex,intn)(inti;doub1ey=0;for(i=0;i=n;i+)(y+=Y_seti*inter_1_Base(X_set,x,ni);)return(y);)(3)主函数的定义和插值函数的调用:voidmai
12、n()(doub1ex,resou1t;doub1eXN=0,1,2,3,4,5,6,7,8,9;doub1eYN=0,1,4,9,16,25,36,49,64,81);printf(,P1easeinputthex=);scanf(%1f,&x);resou1t=inter_1(X,Y,x,N);printf(theresou1tis%1fn,resou1t);)(4)将数据存储在磁盘文件中时程序的处理方法:在大多数情况下,数据是以磁盘文件的形式存储在计算机里的,因此,我们的程序需要处理数据文件,这个时候,我们可以用下面的程序来实现:voidmain()(inti,n;doub1ex,resou1t,*X,*Y;FI1E*fp_in,*fp_out;fpJn=fopen(,DAdataJn.txt7r);fp_out=fopen(D:data_ou1.txt,w);fscanf(fpJn,%d,n);printf(%dn,n);X=(doub1e*)ma11oc(sizeof(doub1e)*(n+1);Y=(doub1e*)ma11oc(sizeof(doub1e)*(n+1);for(i=0;i=n;i+)(fscanf(fp-in,%1f,X+i);)for(i=0;i=n;i+)(fscanf(