计算方法上机作业插值与拟合实验报告.docx
- 文档编号:2442457
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:24
- 大小:90.77KB
计算方法上机作业插值与拟合实验报告.docx
《计算方法上机作业插值与拟合实验报告.docx》由会员分享,可在线阅读,更多相关《计算方法上机作业插值与拟合实验报告.docx(24页珍藏版)》请在冰豆网上搜索。
计算方法上机作业插值与拟合实验报告
计算方法实验
题目:
班级:
学号:
姓名:
1实验目的
1.通过编程对拉格朗日插值法、牛顿插值法以及多项式拟合数据的理解
2.观察上述方法的计算稳定性和求解精度并比较各种方法利弊
2实验步骤
2.1环境配置:
VS2013,C++控制台程序
2.2添加头文件
#include"stdio.h"
#include"stdlib.h"
#include"stdafx.h"
2.3主要模块
程序一共分成三层,最底层是数据结构部分,负责存储数据,第二层是交互部分,即多项式方程部分,负责输入输出获得数据,最上层是核心的算法部分,负责处理已获得的数据。
具体功能如下:
●数据结构部分
数据结构部分是整个程序的最底层,负责存储部分。
因方程系数作为数据元素插入和删除操作较少,而顺序表空间利用率大且查看方便,故此程序选用顺序表保存系数。
数据结构文件中写的是有关顺序表的所有基本操作以供其他文件调用。
本次实验使用列主元高斯消元法作为求解方程组的方法,所以也用了二维顺序表存储数组。
综上,数据结构部分文件是前两个试验的文件内容和,稍作修改。
●常系数微分方程部分
多项式方程部分是程序的第二层,内容主要是常系数微分方程导数的计算和显示菜单部分。
●算法部分
算法部分分为两个文件,一个是插值部分,一个是拟合部分。
插值部分文件负责有关插值的核心算法,处于整个程序最上层部分,负责拉格朗日插值法和牛顿插值法的具体实现过程。
调用方程文件的函数,将获得的数据进行处理运算,将结果返回给方程主函数和输出的第二层。
每种方法有两个函数,一个为仅仅实现一次插值的算法,另一个是和方程部分联系的函数,负责交互中想实现的整体的算法。
拟合部分文件主要负责多项式拟合的算法实现,因为要用到列主元高斯消去法所以也将此部分算法移入其中。
主函数负责获取方程系数并显示,算法和方程作为后台程序,顺序表作为存储手段。
3代码
3.1主程序部分
//Interpolationandfitting.cpp:
定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include"equation.h"
#include"stdafx.h"
int_tmain(intargc,_TCHAR*argv[])
{
GetEquation();
while(Exflag)
{
ShowMenu();
}
return0;
}
3.2多项式方程部分
●方程部分头文件
#ifndef_EQUATION_H
#define_EQUATION_H
#include"squencelist.h"
#include"stdio.h"
#include"stdlib.h"
externintNumberx;
externintExflag;
externsequenlist*B;
externsequenlist*D;
externsequenlist*L;
voidGetEquation(void);
voidShowMenu(void);
voidprintres(sequenlist*A);
voidprintfunction2(datacoa*A);
voidprintfunctionf(datacoa*A);
voidTip(void);
#endif
●方程部分CPP文件
#include"stdafx.h"
#include"equation.h"
#include"math.h"
#include"alfitting.h"
#include"alinterpolation.h"
#include"squencelist.h"
#include"stdio.h"
#include
#include
//全局变量
intNumberx=0;
intExflag=1;
sequenlist*B;
sequenlist*D;
sequenlist*L;
////////////////////////获得给定数据/////////////////////////
voidGetEquation(void)
{
intj=0;
datatypex=0;
B=InitList();
D=InitList();
cout<<"输入给定数据的个数:
"< cin>>Numberx; cout<<"从小到大输入x,输入00结束(如y=x^2+2x+1输入12100): "< cin>>x; while(x! =00) { for(j=1;j<=Numberx;j++) { if(! Insert(B,x,j))exit(0); cin>>x; } } cin.clear(); cout<<"输入f(x),输入00结束(如y=x^2+2x+1输入12100): "< cin>>x; while(x! =00) { for(j=1;j<=Numberx;j++) { if(! Insert(D,x,j))exit(0); cin>>x; } } printres(B); printres(D); } //////////////////////////显示交互///////////////////////////// voidShowMenu(void) { intc1,c2; cout<<"选择插值的方法: "< cout<<"1.拉格朗日插值法"< cout<<"2.牛顿插值法"< cout<<"3.直接拟合"< cout<<"0.退出"< cin>>c1; switch(c1) { case0: Tip(); break; case1: Langmethod(); break; case2: Newtonmethod(); break; case3: break; default: break; } cout<<"选择拟合方式: "< cout<<"1.多项式拟合"< cout<<"2.返回插值"< cout<<"0.退出"< cin>>c2; switch(c2) { case0: Tip(); break; case1: Fpolynomial(); Tip(); break; case2: break; default: break; } } ////////////////////////打印结果/////////////////////////// voidprintres(sequenlist*A) { inti; for(i=1;i<=A->last;i++) { cout< } cout< } ////////////////////////打印输出矩阵/////////////////////////// voidprintfunction2(datacoa*A) { inti,j; cout<<"矩阵="< for(i=1;i<=A->m;i++) { for(j=1;j<=A->n;j++) { cout< } cout< } } ////////////////////////打印输出函数/////////////////////////// voidprintfunctionf(datacoa*A) { inti=1; cout<<"f="; cout< for(i=2;i<=A->m;i++) { if(A->data[i][A->n]<0) cout< elsecout<<"+"< } cout< } ////////////////////////返回提示/////////////////////////// voidTip(void) { intflag; cout<<"输入000退出,其余返回: "< cin>>flag; if(flag==000)Exflag=0; } 3.3核心算法部分 ●插值部分头文件 #ifndef_ALINTERPOLATION_H #define_ALINTERPOLATION_H #include"stdio.h" #include"stdlib.h" voidLangmethod(void); datatypeLangarange(sequenlist*X,sequenlist*F,datatypex); datatypeNewtoninterpolation(sequenlist*X,sequenlist*F,datatypex); voidNewtonmethod(void); #endif ●插值部分CPP文件 #include"alinterpolation.h" #include"stdafx.h" #include"squencelist.h" #include"equation.h" #include"math.h" //////////////////////////拉格朗日插值//////////////////////////// datatypeLangarange(sequenlist*X,sequenlist*F,datatypex) { inti,j; datatypetemp=0; L=InitList(); for(i=1;i<=Numberx;i++) { Insert(L,F->data[i],i); for(j=1;j<=Numberx;j++) { if(j==i)continue; L->data[i]=L->data[i]*((x-X->data[j])/(X->data[i]-X->data[j])); } temp=temp+L->data[i]; } returntemp; } voidLangmethod(void) { inti; datatypex,f; cou
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算方法 上机 作业 拟合 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)