计算方法上机作业插值及拟合实验报告_第1页
计算方法上机作业插值及拟合实验报告_第2页
计算方法上机作业插值及拟合实验报告_第3页
计算方法上机作业插值及拟合实验报告_第4页
计算方法上机作业插值及拟合实验报告_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算方法实验题目: 班级:学号:姓名:22计算方法与实习实验报告目录计算方法实验11 实验目的32 实验步骤32.1环境配置:32.2添加头文件32.3主要模块33 代码43.1主程序部分43.2多项式方程部分43.3核心算法部分83.4数据结构部分134运行结果194.1拉格朗日插值法运行结果194.2牛顿插值法运行结果204.3多项式拟合运行结果205总结21拉格朗日插值法21牛顿插值法21多项式拟合216参考资料221 实验目的1. 通过编程对拉格朗日插值法、牛顿插值法以及多项式拟合数据的理解2. 观察上述方法的计算稳定性和求解精度并比较各种方法利弊2 实验步骤2.1环境配置:VS201

2、3,C+控制台程序2.2添加头文件#include "stdio.h"#include "stdlib.h"#include "stdafx.h"2.3主要模块程序一共分成三层,最底层是数据结构部分,负责存储数据,第二层是交互部分,即多项式方程部分,负责输入输出获得数据,最上层是核心的算法部分,负责处理已获得的数据。具体功能如下:l 数据结构部分数据结构部分是整个程序的最底层,负责存储部分。因方程系数作为数据元素插入和删除操作较少,而顺序表空间利用率大且查看方便,故此程序选用顺序表保存系数。数据结构文件中写的是有关顺序表的所有基本操作

3、以供其他文件调用。本次实验使用列主元高斯消元法作为求解方程组的方法,所以也用了二维顺序表存储数组。综上,数据结构部分文件是前两个试验的文件内容和,稍作修改。l 常系数微分方程部分多项式方程部分是程序的第二层,内容主要是常系数微分方程导数的计算和显示菜单部分。l 算法部分算法部分分为两个文件,一个是插值部分,一个是拟合部分。插值部分文件负责有关插值的核心算法,处于整个程序最上层部分,负责拉格朗日插值法和牛顿插值法的具体实现过程。调用方程文件的函数,将获得的数据进行处理运算,将结果返回给方程主函数和输出的第二层。每种方法有两个函数,一个为仅仅实现一次插值的算法,另一个是和方程部分联系的函数,负责交

4、互中想实现的整体的算法。拟合部分文件主要负责多项式拟合的算法实现,因为要用到列主元高斯消去法所以也将此部分算法移入其中。主函数负责获取方程系数并显示,算法和方程作为后台程序,顺序表作为存储手段。3 代码3.1主程序部分/ Interpolationandfitting.cpp : 定义控制台应用程序的入口点。/#include "stdafx.h"#include"equation.h"#include "stdafx.h"int _tmain(int argc, _TCHAR* argv)GetEquation();while (E

5、xflag)ShowMenu();return 0;3.2多项式方程部分l 方程部分头文件#ifndef _EQUATION_H#define _EQUATION_H#include "squencelist.h"#include "stdio.h"#include "stdlib.h"extern int Numberx;extern int Exflag;extern sequenlist *B;extern sequenlist *D;extern sequenlist *L;void GetEquation(void);voi

6、d ShowMenu(void);void printres(sequenlist *A);void printfunction2(datacoa *A);void printfunctionf(datacoa *A);void Tip(void);#endifl 方程部分CPP文件#include "stdafx.h"#include "equation.h"#include "math.h"#include "alfitting.h"#include "alinterpolation.h"#

7、include "squencelist.h"#include "stdio.h"#include<iostream>#include <iomanip>/全局变量int Numberx=0;int Exflag = 1;sequenlist *B;sequenlist *D;sequenlist *L;/获得给定数据/void GetEquation(void)int j = 0;datatype x = 0;B = InitList();D = InitList();cout << "输入给定数据的个数:

8、" << endl;cin >> Numberx;cout << "从小到大输入x,输入00结束(如y=x2+2x+1输入1 2 1 00):" << endl;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=x2+2x+1输入1 2 1 00):"

9、<< endl;cin >> x;while (x != 00)for (j = 1; j <= Numberx; j+)if (!Insert(D, x, j)exit(0);cin >> x;printres(B);printres(D);/显示交互/void ShowMenu(void)int c1, c2;cout << "选择插值的方法:" << endl;cout << "1.拉格朗日插值法" << endl;cout << "2.

10、牛顿插值法" << endl;cout << "3.直接拟合" << endl;cout << "0.退出" << endl;cin >> c1;switch (c1)case 0:Tip();break;case 1:Langmethod();break;case 2:Newtonmethod();break;case 3:break;default:break;cout << "选择拟合方式:" << endl;cout &l

11、t;< "1.多项式拟合" << endl;cout << "2.返回插值" << endl;cout << "0.退出" << endl;cin >> c2;switch (c2)case 0:Tip();break;case 1:Fpolynomial();Tip();break;case 2:break;default:break;/打印结果/void printres(sequenlist *A)int i;for (i = 1; i <= A

12、->last; i+)cout << setw(12) << A->datai;cout << endl;/打印输出矩阵/void printfunction2(datacoa *A)int i, j;cout << "矩阵=" << endl;for (i = 1; i <= A->m; i+)for (j = 1; j <= A->n; j+)cout << setw(12) << A->dataij;cout << endl;/打印

13、输出函数/void printfunctionf(datacoa *A)int i = 1;cout << "f="cout << A->dataiA->n;for (i = 2; i <= A->m; i+)if (A->dataiA->n< 0)cout << A->dataiA->n << "*" << "x" << i - 1;else cout << "+" <&

14、lt; A->dataiA->n << "*" << "x" << i - 1;cout << endl;/返回提示/void Tip(void)int flag;cout << "输入000退出,其余返回:" << endl;cin >> flag;if (flag = 000)Exflag = 0;3.3核心算法部分l 插值部分头文件#ifndef _ALINTERPOLATION_H#define _ALINTERPOLATION_H

15、#include "stdio.h"#include "stdlib.h"void Langmethod(void);datatype Langarange(sequenlist *X, sequenlist *F, datatype x);datatype Newtoninterpolation(sequenlist *X, sequenlist *F, datatype x);void Newtonmethod(void);#endifl 插值部分CPP文件#include "alinterpolation.h"#include

16、"stdafx.h"#include "squencelist.h"#include "equation.h"#include "math.h"/拉格朗日插值/datatype Langarange(sequenlist *X, sequenlist *F, datatype x)int i, j;datatype temp = 0;L = InitList();for (i = 1; i <= Numberx; i+)Insert(L, F->datai, i);for (j = 1; j <=

17、 Numberx; j+)if (j = i)continue;L->datai = L->datai * (x - X->dataj) / (X->datai - X->dataj);temp = temp + L->datai;return temp;void Langmethod(void)int i;datatype x, f;cout << "请输入插值点:" << "t"cin >> x;f = Langarange(B, D, x);i = Findi(B, x);In

18、sert(B, x, i);Insert(D, f, i);printres(B);printres(D);/牛顿多项式插值/datatype Newtoninterpolation(sequenlist *X, sequenlist *F, datatype x)int i, j, k;datacoa *FX;datatype temp1 = 0, temp2 = 0, Nn = 0;double temp = 1;FX = InitStruct();for (i = 1; i <= Numberx; i+)InsertA2(FX, X->datai, i, 1);InsertA

19、2(FX, F->datai, i, 2);for (j = 3; j <= Numberx + 1; j+)for (i = 1; i <= Numberx - j + 2; i+)temp1 = FX->datai + 1j - 1 - FX->dataij - 1;temp2 = FX->datai + j - 21 - FX->datai1;InsertA2(FX, temp1 / temp2, i, j);Nn = FX->data12;for (j = 3; j <= Numberx + 1; j+)for (k = 1; k

20、<= j - 2; k+)temp = temp*(x - FX->datak1);Nn = Nn + temp*FX->data1j;temp = 1;return Nn;void Newtonmethod(void)int i;datatype x, f;cout << "请输入插值点:" << "t"cin >> x;f = Newtoninterpolation(B, D, x);i = Findi(B, x);Insert(B, x, i);Insert(D, f, i);printres(

21、B);printres(D);l 拟合部分头文件#ifndef _ALFITTING_H#define _ALFITTING_H#include "stdio.h"#include "stdlib.h"void ColumnGaussmethod(datacoa *A, int Xnumbers);void Fpolynomial(void);#endifl 拟合部分CPP文件#include "alfitting.h"#include "stdafx.h"#include "squencelist.h&

22、quot;#include "equation.h"#include "math.h"/列主元高斯消元法/void ColumnGaussmethod(datacoa *A, int Xnumbers)int i, j, i2, flagc, k, j2;int Fnumber = Xnumbers - 1;datatype temp, res;for (i = 1; i < Fnumber; i+)flagc = i;for (i2 = i + 1; i2 <= Fnumber; i2+)if (fabs(A->datai2i)>

23、;(fabs(A->dataflagci)flagc = i2;if (flagc != i)for (k = i; k <= Xnumbers; k+)temp = A->dataik;A->dataik = A->dataflagck;A->dataflagck = temp;for (i2 = i + 1; i2 <= Fnumber; i2+)temp = A->datai2i / A->dataii;for (j2 = i; j2 <= Xnumbers; j2+)A->datai2j2 = A->datai2j

24、2 - temp*A->dataij2;for (i = Fnumber; i >= 1; i-)for (j = Fnumber; j >= i + 1; j-)A->dataiXnumbers = A->dataiXnumbers - A->dataij * A->datajXnumbers + 1;res = A->dataiXnumbers / A->dataii;InsertA2(A, res, i, Xnumbers + 1);/多项式拟合/void Fpolynomial(void)int Xnumbers;int i, j,

25、 k;datatype s = 0, t = 0;datacoa *A;A = InitStruct();cout << "请输入拟合次数:" << "t"cin >> Xnumbers;for (i = 1; i <= Xnumbers + 1; i+)for (j = 1; j <= Xnumbers + 1; j+)for (k = 1; k <= B->last; k+)s = s + pow(B->datak, j + i - 2);InsertA2(A, s, i, j);s

26、= 0;for (k = 1; k <= B->last; k+)t = t + pow(B->datak, i - 1)*D->datak;InsertA2(A, t, i, Xnumbers + 2);t = 0;ColumnGaussmethod(A, A->n);printfunctionf(A);3.4数据结构部分l 数据结构头文件#ifndef _SQUENCELIST_H#define _SQUENCELIST_H#include "stdio.h"#include "stdlib.h"#include &qu

27、ot;stdafx.h"#include<iostream>using namespace std;#define maxsize 1024/*sequenlist*/typedef double datatype;typedef structdatatype datamaxsizemaxsize;int m, n;datacoa;typedef structdatatype datamaxsize;int last;sequenlist;sequenlist *InitList();int Length(sequenlist*);int Insert(sequenlis

28、t*, datatype, int);int Delete(sequenlist*, int);int Locate(sequenlist*, datatype);void del_node(sequenlist*, datatype);void PrintList(sequenlist*);int Compare_L(sequenlist*, sequenlist*);int Findi(sequenlist*L, datatype x);void Invert(sequenlist*);datacoa *InitStruct();int InsertA2(datacoa*, datatyp

29、e, int, int);void DeleteLie(datacoa*L, int j);void DeleteLine(datacoa*L, int i);/*linklist*/typedef char linkdatatype;typedef struct nodelinkdatatype data;struct node*next;linklist;linklist* CreateListF();#endifl 数据结构CPP文件#include "stdafx.h"#include "squencelist.h"/数据结构部分/sequenl

30、ist/sequenlist *InitList()sequenlist*L = (sequenlist*)malloc(sizeof(sequenlist);L->last = 0;return L;/sequenlist*L = new sequenlist;int Length(sequenlist*L)return L->last;int Insert(sequenlist*L, datatype x, int i)int j;if (L->last >= maxsize - 1)cout << "表已满" << en

31、dl;return 0;for (j = L->last; j >= i; j-)L->dataj + 1 = L->dataj;L->datai = x;L->last+;return 1;int Delete(sequenlist*L, int i)int j;if (i<1) | (i>L->last)cout << "非法删除位置" << endl;return 0;for (j = i; j <= L->last; j+)L->dataj = L->dataj +

32、 1;L->last-;return 1;int Locate(sequenlist*L, datatype x)int i = 1;while (i <= L->last)if (L->datai != x)i+;else return i;return 0;/*顺序表中删除所有元素为x的结点*/void del_node(sequenlist*L, datatype x)int i = Locate(L, x);while (i != 0)if (!Delete(L, i)break;i = Locate(L, x);void PrintList(sequenlis

33、t*L)int i = 1;for (i = 1; i <= L->last; i+)cout << L->datai << ' 'cout << endl;int Compare_L(sequenlist*A, sequenlist*B)int j = 1;int i = 0;int n, m;n = A->last;m = B->last;while (j <= n) && (j <= m)if (A->dataj = B->dataj)i = 0;if (A->

34、dataj < B->dataj)i = -1;break;if (A->dataj > B->dataj)i = 1;break;j+;if (i != 0)return i;elseif (m < n)i = 1;if (n < m)i = -1;if (m = n)i = 0;return i;int Findi(sequenlist*L,datatype x)int i;for (i = 1; i < L->last; i+)if (L->datai>x)break;return i;void Invert(sequen

35、list*L)int i;datatype temp;for (i = 1; i <= L->last / 2; i+)temp = L->datai;L->datai = L->dataL->last + 1 - i;L->dataL->last + 1 - i = temp;/ARRAY/datacoa *InitStruct()datacoa*L = (datacoa*)malloc(sizeof(datacoa);L->m = 0;L->n = 0;return L;/datacoa*L = new datacoa;int InsertA2(datacoa*L, datatype x, int i, int j)int k;if (L->m >= maxsize - 1) | (L->n >= maxsize - 1)cout << "表已满" << endl;return 0;for (k = L->n; k >= j; k-)L->dataik + 1 = L->dataik;L->dataij = x;if (i > L->m)L->m+;i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论