版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数值分析课程设计指导书 张智丰 编 杭州电子科技大学 数学实验中心 2010 年 9 月 前 言 课程设计是高等教育中一个重要的实践环节,它与实验、实习、毕课程设计是高等教育中一个重要的实践环节,它与实验、实习、毕 业设计共同构成了学校的实践性教学体系。业设计共同构成了学校的实践性教学体系。 课程设计是用所学的理论知识结合相关经验,构成一个有效、可行、课程设计是用所学的理论知识结合相关经验,构成一个有效、可行、 适用的、简单的系统,来达到一个或多个实际需求的一种有目的的活动。适用的、简单的系统,来达到一个或多个实际需求的一种有目的的活动。 它不同于实验室里的实验和科研,实验是借助于实验软硬件条
2、件,验证它不同于实验室里的实验和科研,实验是借助于实验软硬件条件,验证 某些已成熟或尚在形成的理论或成果;科研则是对未知世界的探索;而某些已成熟或尚在形成的理论或成果;科研则是对未知世界的探索;而 课程设计则是为解决生产、生活等人类社会实际问题,如:开发产品、课程设计则是为解决生产、生活等人类社会实际问题,如:开发产品、 实现算法等等。与实验、科研和工程设计相比较,课程设计具有两个显实现算法等等。与实验、科研和工程设计相比较,课程设计具有两个显 著的特征:一是教学性,学生在教师指导下针对某一门课程的学习进行著的特征:一是教学性,学生在教师指导下针对某一门课程的学习进行 工程设计;二是实践性,软
3、件类的课程设计包括基础理论的应用、算法工程设计;二是实践性,软件类的课程设计包括基础理论的应用、算法 设计、算法实现、程序编制、程序调试、数据分析等实践内容。通过课设计、算法实现、程序编制、程序调试、数据分析等实践内容。通过课 程设计,学生能进一步理解理论教学内容,同时能培养初步的工程应用程设计,学生能进一步理解理论教学内容,同时能培养初步的工程应用 和实践能力。和实践能力。 课程设计与其他工程技术一样,有一定的规律性,主要体现为课程设计与其他工程技术一样,有一定的规律性,主要体现为“明明 确目标确目标制定方案制定方案实现方案实现方案资料整理资料整理撰写报告撰写报告”等认知规律。古等认知规律。
4、古 人云:人云:“没有规矩,不成方圆没有规矩,不成方圆”,依照一定的规律和方法进行设计不但,依照一定的规律和方法进行设计不但 可以使设计工作做得全面细致,少走许多弯路,而且还能培养科学的思可以使设计工作做得全面细致,少走许多弯路,而且还能培养科学的思 维方法和工程设计习惯。因此,利用现有资源,结合自身实际,努力提维方法和工程设计习惯。因此,利用现有资源,结合自身实际,努力提 高理论水平和工程应用能力是完成好课程设计的基本方法和基本目的。高理论水平和工程应用能力是完成好课程设计的基本方法和基本目的。 数值分析是一门实践性很强的课程,尤其是随着计算机科学的发展,数值分析是一门实践性很强的课程,尤其
5、是随着计算机科学的发展, 数值分析成为一门日益受到工程领域欢迎和越来越具有实践性的课程。数值分析成为一门日益受到工程领域欢迎和越来越具有实践性的课程。 在越来越多的学校开设在越来越多的学校开设数值分析数值分析课程的同时,开设课程的同时,开设数值分析课程数值分析课程 设计设计正在成为一种趋势,目前已有浙江大学等一些著名大学开设了这正在成为一种趋势,目前已有浙江大学等一些著名大学开设了这 个实践性教学环节。我校数学类专业决定从个实践性教学环节。我校数学类专业决定从 2008 级开始开设这一实践环级开始开设这一实践环 节,目的是加强学生编程能力的训练与培养,通过这一课程设计,使学节,目的是加强学生编
6、程能力的训练与培养,通过这一课程设计,使学 生能够用生能够用 C 语言编写数值分析课程中涉及的主要算法。语言编写数值分析课程中涉及的主要算法。 本课程设计共有七个问题,分别是插值、拟合、线性方程组的直接本课程设计共有七个问题,分别是插值、拟合、线性方程组的直接 法求解和迭代求解、数值积分、非线性方程的求解、常微分方程初值问法求解和迭代求解、数值积分、非线性方程的求解、常微分方程初值问 题的数值解。题的数值解。 每个课程设计问题分为目的、基本知识回顾、基本问题、算法描述、每个课程设计问题分为目的、基本知识回顾、基本问题、算法描述、 程序实现和编程问题六个部分来叙述,其中算法描述是使我们编写的程程
7、序实现和编程问题六个部分来叙述,其中算法描述是使我们编写的程 序结构合理,思路清晰的一个重要步骤。程序实现部分是我们给出的实序结构合理,思路清晰的一个重要步骤。程序实现部分是我们给出的实 例,编程问题则是需要学生完成的作业。例,编程问题则是需要学生完成的作业。 目 录 课程设计 1 插值函数的编程实现.1 课程设计 2 曲线拟合的编程实现.13 课程设计 3 数值积分的编程实现.23 课程设计 4 线性方程组直接解法的编程实现.28 课程设计 5 线性方程组迭代解法的编程实现.38 课程设计 6 非线性方程求解的编程实现.45 课程设计 7 常微分方程数值解的编程实现.48 课程设计 1 插值
8、函数的编程实现 一、课程设计目的:一、课程设计目的: 1巩固多项式插值的概念、理解插值的具体方法; 2掌握几种常用插值方法的编程实现,如 Lagrange 插值、分段线性插值、分 段二次插值等。 二、基本知识回顾:二、基本知识回顾: 1插值问题的定义:插值问题的定义: 设函数在区间上有定义,且已知在点)(xfy ,ba 上的值,若存在一个简单函数,使得bxxxa n 10n yyy, 10 )(xP ,成立,则称是关于节点的一个 ii yxP)(ni, 1 , 0)(xP)(xf n xxx, 10 插值函数。点称为插值节点,包含插值节点的区间称为插值区 n xxx, 10 ,ba 间,求插值
9、函数的方法称为插值法。)(xP 2拉格朗日(拉格朗日(Lagrange)插值)插值 对于已知的数据关系:,可以构造拉格朗日插值多项式如下: )( ii xfy n k kkn xlyxL 0 )()( , 其中: )()()( )()()( )( 110 110 nkkkkkk nkk k xxxxxxxx xxxxxxxx xl , ( nk, 1 , 0 ) 余项为:, )( )!1( )( )()()( 1 )1( x n f xLxfxR n n nn ),(ba )()()( 101nn xxxxxxx 3分段线性插值分段线性插值 在数值分析课程中,我们已经知道高次多项式插值是不稳定
10、的,因此,需要用 分段低次插值来解决数据点较多的情形,我们先讨论分段线性插值。 简单地说,将每两个相邻的节点用直线连起来,如此形成的一条折线就是分段 线性插值函数,将这个函数记作,则它满足,且在每个小)(xIn jjn yxI)()(xIn 区间上是线性函数。, 1jj xx), 1 , 0(nj 可以表示为)(xIn n j jjn xlyxI 0 )()( 其中: 其它 时舍去 时舍去 , 0 )(, )0(, )( 1 1 1 1 1 1 njxxx xx xx jxxx xx xx xl jj jj j jj jj j j 有良好的收敛性,即对于有,。)(xIn,bax)()(limx
11、gxIn n 用计算点的插值时,只用到左右的两个节点,计算量与节点个数)(xInxx 无关。但越大,分段越多,插值误差越小。实际上用函数表作插值计算时,分nn 段线性插值就足够了,如数学、物理中用的特殊函数表,数理统计中用的概率分布 表等。 4分段二次插值分段二次插值 具体计算中,如需更高精度,则可考虑使用分段二次插值,分段二次插值的数 学定义为: 设是区间上的函数,在节点上的函 )(xf,ba 012m axxxb 数值为,记:,如果函数满足: 012 , m fff 1 12 max() ii im hxx ( ) h px (1)(2) ( ) , h pxC a b( ),0,1,2
12、hii pxf im (3)在上,是次数的多项式。 222 , ii xx ( ) h Ix 2 则称为的分段二次插值多项式。 ( ) h Ix( )f x 由定义,分段二次插值多项式在小区间上应满足三个插值条件 222 , ii xx ,故相应的抛物线插值公式为: (),2 ,21,22 hjj pxfjiii 2122 2 221222 ()() ( )() ()() ii hi iiii xxxx pxf x xxxx 222 21 2122122 ()() () ()() ii i iiii xxxx f x xxxx 221 22222 2222221 ()() (), ()() i
13、i iii iiii xxxx f xxxx xxxx 其整体表达式为: 2 0 ( )( ) ( ) , m hii i pxf x l xxa b 其中是由各小区间上的抛物线或直线连接而成的分段拉格朗日插值 2 0 ( ) m i i l x 基函数。 12 02 01020 02 ()() , ()()( ) 0, xxxx xx x xxxxlx xx x 222 222 212212221 222 ()() , ()()( ) 0, ii ii iiiii ii xxxx xxx xxxxlx xxx 2221 222 222221 22122 222 221222 2222 ()(
14、) , ()() ( )()() , ()() 0, ii ii iiii iii ii iiii ii xxxx xxx xxxx lxxxxx xxx xxxx xxx 2221 222 2222212 222 ()() , ()()( ) 0, mm mm mmmmm mm xxxx xxx xxxxlx xxx 5. 牛顿牛顿(Newton)插值插值 对于已知的数据关系:,可以构造牛顿插值多项式如下: )( ii xfy )(,)(,)()( 102101100 xxxxxxxfxxxxfxfxNn )()(, 100 nn xxxxxxf 其中:为的 1 11020 10 , , k
15、k kkk k xx xxxfxxxf xxxf )(xf 阶差商k 余项为: )(,)()()( 110 xxxxxfxNxfxR nnnn 三、基本问题:三、基本问题: 编程实现拉格朗日(Lagrange)插值和分段线性插值。 四、算法描述:四、算法描述: (一)拉格朗日插值的算法: 1定义拉格朗日插值基函数: double inter_L_Base(double X_set,double x,int n,int k) 其中:X_set 用来存放节点的值,x 用来传递需求的值,n 用来存放小 i xx 区间的个数,k 表示第个基函数,返回类型为 double;k 2定义拉格朗日插值函数,调
16、用基函数; double inter_L(double X_set,double Y_set,double x,int n) 其中:X_set用来存放节点的值,Y_set用来存放对应于点的值,x i x i x i y 用来传递需求的值,n 用来存放小区间的个数,返回类型为 double;x 3定义主函数,调用插值函数。 这里主要完成数据的输入和输出,功能函数的调用。 (二)分段线性插值的算法: 1定义分段线性插值基函数: double inter_Lin_Sec_Base (double X_set,double x,int n,int k) 其中:X_set用来存放节点的值,x 用来传递需
17、求的值,n 用来存放小区 i xx 间的个数,k 表示第个基函数,返回类型为 double;k 2定义拉格朗日插值函数,调用基函数; double inter_inter_Sec_L(double X_set,double Y_set,double x,int n) 其中:X_set 用来存放节点的值,Y_set用来存放对应于点的值,x i x i x i y 用来传递需求的值,n 用来存放小区间的个数,返回类型为 double;x 3定义主函数,调用插值函数。 这里主要完成数据的输入和输出,功能函数的调用。 五、程序实现:五、程序实现: (一)拉格朗日插值的 C 语言实现: (1)插值基函数
18、的定义: #include #define N 10 double inter_L_Base(double X_set,double x,int n,int k) int i; double y=1; for(i=0;ik;i+) y*=(x-X_seti)/(X_setk-X_seti); for(i=k+1;i=n;i+) y*=(x-X_seti)/(X_setk-X_seti); return(y); (2)插值函数的定义: double inter_L(double X_set,double Y_set,double x,int n) int i; double y=0; for(i
19、=0;i=n;i+) y+=Y_seti*inter_L_Base(X_set,x,n,i); return(y); (3)主函数的定义和插值函数的调用: void main() double x,resoult; double XN=0,1,2,3,4,5,6,7,8,9; double YN=0,1,4,9,16,25,36,49,64,81; printf(Please input the x=); scanf(%lf, resoult=inter_L(X,Y,x,N); printf(the resoult is %lfn,resoult); (4)将数据存储在磁盘文件中时程序的处理方
20、法: 在大多数情况下,数据是以磁盘文件的形式存储在计算机里的,因此,我们的程序 需要处理数据文件,这个时候,我们可以用下面的程序来实现: void main() int i,n; double x,resoult,*X,*Y; FILE *fp_in,*fp_out; fp_in=fopen(D:data_in.txt,r); fp_out=fopen(D:data_out.txt,w); fscanf(fp_in,%d, printf(%dn,n); X=(double *)malloc(sizeof(double)*(n+1); Y=(double *)malloc(sizeof(doub
21、le)*(n+1); for(i=0;i=n;i+) fscanf(fp_in,%lf,X+i); for(i=0;i=n;i+) fscanf(fp_in,%lf,Y+i); for(i=0;i=n;i+) printf(X%d=%lf,Y%d=%lfn,i,*(X+i),i,*(Y+i); printf(Please input the x); scanf(%lf, resoult=inter_L(X,Y,x,n); printf(the resoult is %lfn,resoult); fprintf(fp_out,the resoult is %lfn,resoult); fclos
22、e(fp_in); fclose(fp_out); 其中,基本数据节点个数 n+1 和节点的数据 X,Y 两个向量存放在磁盘文件 data.txt 中,且文件存放在 D 盘根目录下。 (二)分段线性插值的程序实现: (1)分段线性插值基函数的定义: #include #define N 10 double inter_Lin_Sec_Base(double X_set,double x,int n,int j) double y=1; if(j=0) if(x=X_setj else y=0; return (y); (2)插值函数的定义: double inter_Sec_L(double
23、X_set,double Y_set,double x,int n) int i; double y=0; for(i=0;i=n;i+) y+=Y_seti*inter_Lin_Sec_Base(X_set,x,n,i); return(y); (3)主函数的定义和插值函数的调用: void main() double x,resoult; double XN=0,1,2,3,4,5,6,7,8,9; double YN=0,1,4,9,16,25,36,49,64,81; printf(Please input the x); scanf(%lf, resoult=inter_Sec_L(
24、X,Y,x,N); printf(the resoult is %lfn,resoult); (4)将数据存储在磁盘文件中时程序的处理与上面相仿。 参考程序如下: #include void main() int i,n; double x,resoult,*X,*Y; FILE *fp_in,*fp_out; fp_in=fopen(D:data_in.txt,r); fp_out=fopen(D:data_out.txt,w); fscanf(fp_in,%d, printf(%dn,n); X=(double *)malloc(sizeof(double)*(n+1); Y=(doubl
25、e *)malloc(sizeof(double)*(n+1); for(i=0;i=n;i+) fscanf(fp_in,%lf,X+i); for(i=0;i=n;i+) fscanf(fp_in,%lf,Y+i); fprintf(fp_out,X%d=,n+1); for(i=0;i=n;i+) fprintf(fp_out,%lf,*(X+i); fprintf(fp_out,n); fprintf(fp_out,Y%d=,n+1); for(i=0;i=n;i+) fprintf(fp_out,%lf,*(Y+i); fprintf(fp_out,n); printf(Please
26、 input the x); scanf(%lf, resoult=inter_Sec_L(X,Y,x,N); printf(the resoult is %lfn,resoult); for(i=0;i100;i+) s=(*(X+n)-*X)/100.0; fprintf(fp_out,X1%d=”,100); for(i=0;i100;i+) fprintf(fp_out,%lf,*X+i*s); fprintf(fp_out,n); fprintf(fp_out,Y1%d=,100); for(i=0;i=n;i+) fprintf(fp_out,%lf,inter_Sec_L(X,Y
27、,*X+i*s,N); fprintf(fp_out,n); fclose(fp_in); fclose(fp_out); 六、编程问题:六、编程问题: 试参考前面分段线性插值的程序,编写分段二次插值的程序。 七、教师参考:七、教师参考: 参考程序如下: (1) 分段二次插值基函数的定义 #include #include #define N 10 double inter_Hyp_Sec_Base(double X_set,double x,int n,int j) double y; int i,m; m=n/2; if(j=0) if(x=X_set0 else y=0; printf(
28、j=%d, y = %lfn,j,y); return (y); /(2) 插值函数的定义: double inter_Sec_L(double X_set,double Y_set,double x,int n) int i; double y=0; if(n/2*2!=n) printf(the section number is not a even number, please check!n); return(-1); for(i=0;i=n;i+) y+=Y_seti*inter_Hyp_Sec_Base(X_set,x,n,i); return(y); /(3)主函数的定义和插值
29、函数的调用: void main() double x,resoult; double XN+1=0,1,2,3,4,5,6,7,8,9,10; double YN+1=0,1,4,9,16,25,36,49,64,81,100; printf(Please input the x=); scanf(%lf, resoult=inter_Sec_L(X,Y,x,N); printf(the resoult is %lfn,resoult); 程序 2: #include #include #define N 10 double inter_Hyp_Sec_Base(double X_set,d
30、ouble x,int n,int j) double y; int i,m,mode; m=n/2; if(j=0) mode=1; else if(j=n) mode=2; else if(j/2*2=j) mode=3; else mode=4; switch (mode) case 1: if(x=X_set0 else y=0; break; default: printf(there is an errorn); printf(j=%d, y = %lfn,j,y); return (y); /(2) 插值函数的定义: double inter_Sec_L(double X_set
31、,double Y_set,double x,int n) int i; double y=0; if(n/2*2!=n) printf(the section number is not a even number, please check!n); return(-1); for(i=0;i=n;i+) y+=Y_seti*inter_Hyp_Sec_Base(X_set,x,n,i); return(y); /(3)主函数的定义和插值函数的调用: void main() double x,resoult; double XN+1=0,1,2,3,4,5,6,7,8,9,10; doubl
32、e YN+1=0,1,4,9,16,25,36,49,64,81,100; printf(Please input the x=); scanf(%lf, resoult=inter_Sec_L(X,Y,x,N); printf(the resoult is %lfn,resoult); (4)将数据存储在文件中的操作与前面的情况相仿。 下面的参考程序给出的文件操作的实际例子,数据文件 data_in.txt 存放在 D: 下,计算结果也放在 D:下,输出文件是一个可以用于 MATLAB 运行的文件,可 以直接在 MATLAB 中运行画出原始数据和插值函数的图形。 void main() in
33、t i,n; double x,resoult,*X,*Y,s; FILE *fp_in,*fp_out; fp_in=fopen(D:data_in.txt,r); fp_out=fopen(D:data_out.m,w); fscanf(fp_in,%d, printf(%dn,n); X=(double *)malloc(sizeof(double)*(n+1); Y=(double *)malloc(sizeof(double)*(n+1); for(i=0;i=n;i+) fscanf(fp_in,%lf,X+i); for(i=0;i=n;i+) fscanf(fp_in,%lf,
34、Y+i); fprintf(fp_out,X=); for(i=0;in;i+) fprintf(fp_out,%lf,*(X+i); fprintf(fp_out,%lf;n,*(X+n); fprintf(fp_out,Y=); for(i=0;in;i+) fprintf(fp_out,%lf,*(Y+i); fprintf(fp_out,%lf;n,*(Y+n); printf(Please input the x); scanf(%lf, resoult=inter_Sec_L(X,Y,x,n); printf(the resoult is %lfn,resoult); s=(*(X
35、+n)-*X)/100.0; fprintf(fp_out,X1=); for(i=0;i100;i+) fprintf(fp_out,%lf,*X+i*s); fprintf(fp_out,%lf;n,*X+100*s); fprintf(fp_out,Y1=); for(i=0;i100;i+) fprintf(fp_out,%lf,inter_Sec_L(X,Y,*X+i*s,n); fprintf(fp_out,%lf;n,inter_Sec_L(X,Y,*X+100*s,n); fprintf(fp_out,plot(X,Y,or);n); fprintf(fp_out,hold o
36、n;n); fprintf(fp_out,plot(X1,Y1,-b);n); fclose(fp_in); fclose(fp_out); 课程设计 2 曲线拟合的编程实现 一、课程设计目的:一、课程设计目的: 1巩固数据拟合的概念、理解数据拟合的具体方法; 2掌握数据拟合方法的编程实现,主要为多项式拟合。 二、基本知识回顾:二、基本知识回顾: 数据拟合是通过已知离散数据求出计算整个区间上函数近似值的另一种方法, 它与插值解决的是同一类的问题,当已知数据数量较小的时候,我们用插值来解决, 而当已知数据的数量较大时,问题就需要用拟合的方法来解决。 1数据拟合的定义:数据拟合的定义: 已知离散点
37、上的数据集,即已知自变量在点 1122 ( ,),(,),(,) nn x yxyxyx 集上的函数值,构造一个解析函数(其图形为 12 , n x xx 12 , n y yy)(xf 一曲线) ,使在原离散点上的值尽可能接近给定的值,这一构造函数( )f x i x i y 的过程称为曲线拟合。最常用的曲线拟合方法是最小二乘法,该方法就是在( )f x 一定的函数类中寻找函数使得最小。( )f x 2 1 ( ) n ii i Mf xy 多项式可以被看作是最简单的函数类,所谓的多项式函数类,就是在由基函数 张成的空间中选择一个函数作为拟合函数。一般情况下,可, 1 32 n xxxx 以
38、通过对已知数据绘图等手段,利用先验知识确定函数的基本类型,即是线性函数、 二次函数、三次函数等等。 我们以线性函数拟合和二次函数拟合为例,分别说明拟合的具体过程。 2.线性函数拟合线性函数拟合 设,则得,bxaxfy)( n i ii n i ii ybxayxfbaM 1 2 1 2 )()(),( 这样,我们要求解的问题就是要寻找适当的,使得达到最ab),(baM 小,根据多元函数求极值的方法,我们可以通过令关于,的),(baMab 导数为零,即: ,0)(2 1 n i ii ybxa a M 0)(2 1 2 n i iiii yxbxax b M 化简可得: , n i i n i
39、i n i yxba 111 1 n i ii n i i n i i yxxbxa 11 2 1 即: 可解得: , 2 11 2 111 2 1 )( )()( n i i n i i n i i n i ii n i i n i i xxn xyxxy a n i i n i i n i ii n i i n i i xnx yxnxy b 1 22 1 111 )( )( 3二次函数拟合 设,则得 2 )(cxbxaxfy n i ii yxfcbaM 1 2 )(),( ,这样,我们要求解的问题就是要寻找适当的, n i iii ycxbxa 1 22 )(a , 使得达到最小,根据
40、多元函数求极值的方法,我们可以bc),(cbaM 通过令关于, 的导数为零,即:),(cbaMabc ,0)(2 1 2 n i iii ycxbxa a M ,0)(2 1 32 n i iiiii yxcxbxax b M ,0)(2 1 2432 n i iiiii yxcxbxax c M 化简可得: , n i i n i i n i i n i yxcxba 11 2 11 1 , n i ii n i i n i i n i i yxxcxbxa 11 3 1 2 1 n i ii n i i n i i n i i yxxcxbxa 1 2 1 4 1 3 1 2 令, , ,
41、 n i a 1 11 n i i xb 1 1 n i i xc 1 2 1 n i i yd 1 1 , n i i xa 1 2 n i i xb 1 2 2 n i i xc 1 3 2 n i iiy xd 1 2 , n i i xa 1 2 3 n i i xb 1 3 3 n i i xc 1 4 3 n i ii yxd 1 2 3 可解得: 3*2*11*3*23*1*23*1*21*3*23*2*1 3*2*13*2*13*2*13*2*12*3*12*3*1 cbacabcbabcabacbca cbdbcdbdcdbccdbdcb a 3*2*11*3*23*1*23
42、*1*21*3*23*2*1 2*1*31*2*31*2*32*1*32*3*12*3*1 cbacabcbabcabacbca cdadaccaddcacdadca b 321132312312132321 132312132321321312 *c*b+a*c*a-b*c*b-a*b*c+a*b*a+c*b*c-a *d*a-b*d*b-a*b*a+d*b*d-a*d*b+a*b*da c 三、基本问题:三、基本问题: 编程实现拟合函数的求解,分别取拟合函数为线性函数和二次函数。 四、算法描述:四、算法描述: (一)线性拟合问题的求解算法: 1根据已知数据求出线性拟合函数的系数: void
43、 linearfit_fun_cof(double X_set, double Y_set, double linear_coff, int n) 其中:X_set 用来存放节点的值,Y_set 用来存放函数值的值, i x i y linear_coff用来存放求得的拟合多项式的系数; 2根据求得的拟合系数,由函数 double linfitfun(double linear_coff,double x) 即可得到区间内拟合函数在任意一点的值。x 3定义主函数,调用拟合函数。 这里主要完成数据的输入和输出,功能函数的调用。 (二)二次拟合问题的求解算法: 1根据已知数据求出二次拟合函数的系数
44、: void squ_fit_fun_cof(double X_set, double Y_set, double squ_coff, int n) 其中:X_set 用来存放节点的值,Y_set 用来存放函数值的值, i x i y squ_coff用来存放求得的拟合多项式的系数; 2根据求得的拟合系数,由函数 double squfitfun(double squ_coff,double x) 即可得到区间内拟合函数在任意一点的值。x 3定义主函数,调用插值函数。 这里主要完成数据的输入和输出,功能函数的调用。 五、程序实现:五、程序实现: (一)线性拟合问题的 C 语言实现: #incl
45、ude #include / 1计算拟合系数 void linearfit_fun_cof(double X_set,double Y_set,double linear_coff, int n) int i; double y=0,x=0,xy=0,x2=0; for (i=0;i=n;i+) y+=Y_seti; x+=X_seti; x2+=X_seti*X_seti; xy+=X_seti*Y_seti; linear_coff0=(y*x2-xy*x)/(n+1)*x2-x*x); linear_coff1=(x*y-(n+1)*xy)/(x*x-(n+1)*x2); / 2求拟合函
46、数的值 double linfitfun(double linear_coff,double x) return (linear_coff0+linear_coff1*x); / 3定义主函数,调用拟合函数,完成输入输出。 void main() int i,n; double *X,*Y,poly_coff2,resoult,x,s; FILE *fp_in,*fp_out; fp_in=fopen(d:data_in.txt,r); fp_out=fopen(d:data_out.m,w); fscanf(fp_in,%d, printf(%dn,n); X=(double *)mallo
47、c(sizeof(double)*(n+1); Y=(double *)malloc(sizeof(double)*(n+1); for (i=0;i=n;i+) fscanf(fp_in,%lf,X+i); for (i=0;i=n;i+) printf(%lf,*(X+i); for (i=0;i=n;i+) fscanf(fp_in,%lf,Y+i); for (i=0;i=n;i+) printf(%lf,*(Y+i); linearfit_fun_cof(X, Y, poly_coff, n); printf(%lf+%lfxn,poly_coff0,poly_coff1); fpr
48、intf(fp_out,X=); for(i=0;in;i+) fprintf(fp_out,%lf,*(X+i); fprintf(fp_out,%lf;n,*(X+n); fprintf(fp_out,Y=); for(i=0;in;i+) fprintf(fp_out,%lf,*(Y+i); fprintf(fp_out,%lf;n,*(Y+n); printf(Please input the x); scanf(%lf, resoult=linfitfun(poly_coff, x); printf(the resoult is %lfn,resoult); s=(*(X+n)-*X
49、)/100.0; fprintf(fp_out,X1=); for(i=0;i100;i+) fprintf(fp_out,%lf,*X+i*s); fprintf(fp_out,%lf;n,*X+100*s); fprintf(fp_out,Y1=); for(i=0;i100;i+) fprintf(fp_out,%lf, linfitfun(poly_coff, *X+i*s); fprintf(fp_out,%lf;n, linfitfun(poly_coff, *X+100*s); fprintf(fp_out,plot(X,Y,or);n); fprintf(fp_out,hold
50、 on;n); fprintf(fp_out,plot(X1,Y1,-b);n); fclose(fp_in); fclose(fp_out); (二)二次拟合问题的 C 语言实现: #include #include / 1计算拟合函数的系数 void squfit_fun_cof(double X_set,double Y_set, double squ_coff, int n) int i; double a1=0,a2=0,a3=0,b1=0,b2=0,b3=0,c1=0,c2=0,c3=0,d1=0,d2=0,d3=0; for (i=0;in;i+) a1+=1; a2+=X_se
51、ti; a3+=X_seti*X_seti; b3+=X_seti*X_seti*X_seti; c3+=X_seti*X_seti* X_seti*X_seti; d1+=Y_seti; d2+=X_seti*Y_seti; d3+=X_seti*X_seti*Y_seti; b1=a2; b2=a3; c1=b2; c2=b3; squ_coff0=(-b1*c3*d2+b1*d3*c2-c1*b2*d3+c1*d2*b3-d1*c2*b3+d1*b2*c3) /(-a1*c2*b3+c2*a3*b1+a2*c1*b3-a2*b1*c3-b2*a3*c1+a1*b2*c3); squ_co
52、ff1=-(-a1*c3*d2+a1*d3*c2+a3*c1*d2-d3*a2*c1+c3*a2*d1-a3*d1*c2) /(-a1*c2*b3+c2*a3*b1+a2*c1*b3-a2*b1*c3-b2*a3*c1+a1*b2*c3); squ_coff2=(a2*d1*b3+a1*b2*d3-a1*d2*b3+d2*a3*b1-a2*b1*d3-b2*a3*d1) /(-a1*c2*b3+c2*a3*b1+a2*c1*b3-a2*b1*c3-b2*a3*c1+a1*b2*c3); / 2求拟合函数的值 double squfitfun(double squ_coff,double x)
53、return (squ_coff0+squ_coff1*x+squ_coff2*x*x); / 3定义主函数,调用拟合函数,完成输入输出。 void main() int i,n; double *X,*Y,poly_coff3,x,s,resoult; FILE *fp_in,*fp_out; fp_in=fopen(d:data_in.txt,r); fp_out=fopen(d:data_out.m,w); fscanf(fp_in,%d, X=(double *)malloc(sizeof(double)*n); Y=(double *)malloc(sizeof(double)*n); for (i=0;i=n;i+) fscanf(fp_in,%lf,X+i); for (i=0;i=n;i+) fscanf(fp_in,%lf,Y+i); squfit_fun_cof(X, Y, poly_coff, n); fprintf(fp_out,X=); for(i=0;in;i+) fprintf(fp_out,%lf,*(X+i); fprintf(fp_out,%lf;n,*(X+n); fprintf(fp_out,Y=); for(i=0;in;i+)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年护理查房制度培训课件
- 2026年注册安全工程师考试《安全生产法》专项训练卷
- 2026年一级造价工程师考试《土建工程计量》专项训练试卷
- 2026年会计专业技术资格考试初级会计实务专项训练试卷(附答案)
- 2026年房地产估价师考试《房地产估价原理与方法》培训试卷
- 湖南省A 佳教育2025-2026学年高二上学期11月期中地理试题(含答案)
- 22必修第三册 第十二章 电能 能量守恒定律 第1-2节同步练习
- 2026年思想道德修养试题及参考答案
- 天津市2026届九年级中考模拟冲刺数学试卷(含解析)
- 2026年广东省北师大版初中物理上册第3章单元测试卷
- 《计算机制图-AutoCAD2020》课件(共六个模块)
- 2025 年小升初广州市初一新生分班考试语文试卷(带答案解析)-(人教版)
- 2025年语言文字规范化知识测试题及答案
- 2025年食品安全管理人员专业知识考核试题A卷附答案
- 呼吸训练器使用指南
- 年轻医生临床思维培养
- 《易制毒化学品企业档案》
- JG/T 336-2011混凝土结构修复用聚合物水泥砂浆
- 网络安全业务竞赛题库ctf
- 《公路桥梁伸缩装置设计指南》
- 危大工程(深基坑、高边坡、高支模)施工流程及安全注意事项
评论
0/150
提交评论