计算方法上机作业插值与拟合实验报告

合集下载

matlab插值与曲线拟合实验报告

matlab插值与曲线拟合实验报告

湖南大学电气与信息工程学院 《数值计算》课程 上机实验报告姓名: 班级: 学号: 日期:指导老师:本次实验题号:第 3 次实验1) 实验目的:1) 用MATLAB 实现拉格朗日插值和分段线性插值。

2) 了解matlab 实现曲线拟合方法的实际应用。

二. 实验内容:1) 插值算法的应用:题目:用拉格朗日插值程序,分段线形插值函数分别研究f (X )的数据表,计算f(0.472) X 0.46 0.47 0.48 0.49 Y0.48465550.49375420.50274980.51166832) 曲线拟合方法的实际应用用电压V=10V 的电池给电容器充电,电容器上t 时刻的电压v(t)=V-(V-V0)e^(-t/T),其中V0是电容器的初始电压,T 是充电常数。

实验测量了一组数据如下,请根据数据表确定V0和T 的大小。

t 0.5 1 2 3 4 5 7 9 V(t) 6.366.487.268.228.668.999.439.63三. 算法介绍或方法基础1.1 拉格朗日插值法对于已给定的点 00(,),...,(,)k k x y x y 和待估计的点的横坐标x ,如上述理论,将其值代入1100,011()()()()():......()()()()kj j i k j i i j j i j j j j j j kx x x x x x x x x x l x x x x x x x x x x x -+=≠-+-----==-----∏计算出插值基函数的值,然后根据公式:():()ki i j L x y l x ==∑计算出纵坐标的估计值,由此完成对该点的插值过程,其中k 为该点插值的阶数。

1.2 线性分段插值利用已给定的点 00(,),...,(,)k k x y x y 对插值区间分为1k -段,将每段的端点(,)i i x y 与 11(,)i i x y ++作为数据点利用公式100010()()()()()f x f x p x f x x x x x -=+--在所构成的区间进行线性插值。

实验2插值与拟合

实验2插值与拟合

数值分析实验报告实验2 插值与拟合2.1 实验目的掌握牛顿插值法的基本思路和步骤;掌握最小二乘法的基本思路和拟合步骤。

培养编程与上机调试能力。

2.2 算法描述2.2.1 牛顿插值法基本思路给定插值点序列())(,i i x f x ,,,1,0,n i =构造牛顿插值多项式)(u N n 。

输入要计算的函数点,x 并计算)(x N n 的值,利用牛顿插值公式,当增加一个节点时,只需在后面多计算一项,而前面的计算仍有用;另一方面)(x N n 的各项系数恰好又是各阶差商,而各阶差商可用差商公式来计算。

2.2.2 牛顿插值法计算步骤1. 输入n 值及())(,i i x f x ,,,1,0,n i =;要计算的函数点x 。

2. 对给定的,x 由[][][]00010101201101()()(),()(),,()()(),,n n n N x f x x x f x x x x x x f x x x x x x x x x f x x x -=+-+--++--- 计算()n N x 的值。

3. 输出()n N x 。

2.2.3 最小二乘法基本思路已知数据对()(),1,2,,j j x y j n = ,求多项式0()()m ii i p x a x m n ==<∑使得20110(,,,)n m in i j j j i a a a a x y ==⎛⎫Φ=- ⎪⎝⎭∑∑ 为最小,这就是一个最小二乘问题。

2.2.4 最小二乘法计算步骤用线性函数()p x a bx =+为例,拟合给定数据(),,1,2,,i i x y i m = 。

算法描述:步骤1:输入m 值,及(),,1,2,,i i x y i m = 。

步骤2:建立法方程组TA AX AY =。

步骤3:解法方程组。

步骤4:输出()p x a bx =+。

2.3 实验内容1. 给定sin110.190809,sin120.207912,sin130.22491,o o o ===构造牛顿插值函数计算'sin1130o 。

计算方法第五章拟合上机报告

计算方法第五章拟合上机报告

实验报告名称班级:学号:姓名:成绩:1实验目的1)了解最小二乘法的基本原理,通过计算机解决实际问题。

2)了解超定方程组的最小二乘法。

2 实验内容已知实验数据如下试用形如y=a+b*x^2的抛物线进行最小二乘拟合。

3实验步骤1)根据插值公式的算法编写相应的函数程序;2)将题目中所给参数带入到插值函数中得出结果;3 程序设计function zyecf(x,y,m)%mΪËùÒªÇóµÄÄâºÏÇúÏߵĴÎÊýS=zeros(1,2*m+1);T=zeros(m+1,1);for k=1:2*m+1S(k)=sum(x.^(k-1));endfor k=1:m+1T(k)=sum(x.^(k-1).*y);endA=zeros(m+1,m+1);a=zeros(m+1,1);for i=1:m+1for j=1:m+1A(i,j)=S(i+j-1);endenda=A\T;for k=1:m+1fprintf('a[%d]=%f\n',k,a(k));endfprintf('Å×ÎïÏß·½³ÌΪy=%.6f+%.6f*x.^2\n',a(1),a(k));4实验结果及分析zyecf(x.^2,y,1)a[1]=-3.495708a[2]=2.205150抛物线方程为y=-3.495708+2.205150*x.^2将x=[1.0 2.5 3.5 4.0] 代入y=-3.495708+2.205150*x.^2,发现y =[-1.290558000000000 10.286479500000000 23.517379500000001 31.786692000000002];在样本点上的数据yi(1),yi(2)误差超过了5.0,精确度很低,但从整个函数走势曲线来看平均误差比较小。

《计算方法》实验报告材料

《计算方法》实验报告材料
while(x-X[b]>c)
{
b=b+1;
}
result=Y[b]*(1-(x-X[b])/c)+Y[b+1]*((x-X[b])/c);
return result;
};
(3)牛顿插值法
#include<iostream>
#include<string>
#include<vector>
using namespace std;
cin>>b;
c=b-p;
c=c/(N-1);
for(int i=0;i<N;i++){
X[i]=p;
Y[i]=1/(1+p*p);
p=p+c;
}
cout<<"请输入要求值x的值:"<<endl;
double x;
cin>>x;
double result=Lagrange(N,X,Y,x);
cout<<"由拉格朗日插值法得出结果:"<<result<<endl;
B.分段线性插值
Xy(精确)y(拉格朗日) y(分段线性)误差(拉)误差(分)
0.5000000.8000000.8434070.750000-0.0542590.050000
4.5000000.0470591.578720 0.0486425 -32.547674-0.033649
(2)输出:
Xy(精确)y(牛顿插值)误差(牛顿插值)
cout<<"是否要继续?(y/n):";

数值分析实验报告--插值与拟合及其并行算法

数值分析实验报告--插值与拟合及其并行算法

《数值分析》实验报告实验五、插值与拟合及其并行算法一.实验目的:1.学会拉格朗日插值, 分段线性插值或三次样条插值以及曲 线拟合等数值分析问题,通过 MATLAB 编程解决这些数 值分析问题,并且加深对此次实验内容的理解。

2.加强编程能力和编程技巧,练习从数值分析角度看问题, 同时用 MATLAB 编写代码。

二.实验要求:学会在计算机上实现拉格朗日插值,分段线性插值或三次 样条插值以及曲线拟合等数值分析问题,分析几种插值方法的异 同。

三.实验内容:分别用下列题目完成①:拉格朗日插值及其误 差分析 ②:三次样条 ③: 曲线拟合及其误差分析,实验要求。

四.实验题目: (1)已知 sin 30 D = 0.5 , sin 45D = 0.707 1 ,sin 60 D = 0.866 0 ,用拉格朗日插值及其误差估计的MATLAB主程序求 sin 20D 的近似值,并估计其误差。

(2)观测得出函数 y=f(x)在若干点处的值为 f(0)=0, f(2)=16, f(4)=36, f(6)=54, f(10)=82 和 f'(0)=8, f'(10)=7, 试求 f(x)的三次样条函数,并计算 f(3)和 f(8)的近似值. ( 3 ) t=[2.1 7.9 10.1 13 14.5 15.3];r=[13.5 36.9 45.7 求出 r 与 t 之间的关系, 及三 57.3 62.78 74.9];根据给出数据, 种误差,并作出拟合曲线。

五.实验原理:(1)拉格朗日插值公式:P5 ( x) = ∑ y i l i ( x)i =05li ( x) =( x − x 0 ) " ( x − xi −1 )( x − xi +1 ) " ( x − x n ) ( xi − x0 ) " ( xi − xi −1 )( xi − xi +1 ) " ( xi − x n )(2)三次样条插值公式:Sn(x)={Si(x)=a i x +b i x +c i x+d i , x ∈ [x i −1 ,x i ] ,i=1,2,….,n}32(3)曲线拟合: 最小二乘法并不只限于多项式,也可以用于任何具体给出的函数 形式。

清华大学_计算方法(数学实验)实验2插值与拟合

清华大学_计算方法(数学实验)实验2插值与拟合

实验 2 插值与拟合系班姓名学号【实验目的】1、掌握用MATLAB计算拉格朗日、分段线性、三次样条三种插值的方法,改变节点的数目,对三种插值结果进行初步分析。

2、掌握用MATLAB作线性最小二乘的方法。

3、通过实例学习如何用插值方法与拟合方法解决实际问题,注意二者的联系和区别。

【实验内容】预备:编制计算拉格朗日插值的M文件:以下是拉格朗日插值的名为y_lagrl的M文件:function y=y_lagr1(x0,y0,x)n=length(x0);m=length(x);for i=1:mz=x(i);s=0.0;for k=1:np=1.0;for j=1:nif j~=kp=p*(z-x0(j))/(x0(k)-x0(j));endends=p*y0(k)+s;endy(i)=s;end第1题(d)选择函数y=exp(-x2) (-2≤x≤2),在n个节点上(n不要太大,如5~11)用拉格朗日、分段线性、三次样条三种插值方法,计算m个插值点的函数值(m要适中,如50~100)。

通过数值和图形输出,将三种插值结果与精确值进行比较。

适当增加n,在作比较,由此作初步分析。

运行如下程序:n=7;m=61;x=-2:4/(m-1):2;y=exp(-x.^2);z=0*x;x0=-2:4/(n-1):2;y0=exp(-x0.^2);y1=y_lagr1(x0,y0,x);y2=interp1(x0,y0,x);y3=interp1(x0,y0,x,'spline');[x'y'y1'y2'y3']plot(x,z,'w',x,y,'r--',x,y1,'b:',x,y2,'m',x,y3,'b') gtext('y=exp(-x^2)'),gtext('Lagr.'),gtext('Piece.-linear.'),gtext ('Spline'),将三种插值结果y1,y2,y3与精确值y 项比较,显然y1在节点处不光滑,拉格朗日插值出现较大的振荡,样条插值得结果是最好的.增加n 值(使n=11),再运行以上程序,得到的图形如右图所示,比较这两个图可发现,节点增加后,三种插值方法结果的准确度均有所提高,因此可近似地认为:增加节点个数可以提高插值结果的准确程度。

插值与拟合实验报告

插值与拟合实验报告

学生实验报告了解插值与拟合的基本原理和方法;掌握用MATLAB计算插值与作最小二乘多项式拟合和曲线拟合的方法;通过范例展现求解实际问题的初步建模过程;通过动手作实验学习如何用插值与拟合方法解决实际问题,提高探索和解决问题的能力。

这对于学生深入理解数学概念,掌握数学的思维方法,熟悉处理大量的工程计算问题的方法具有十分重要的意义。

二、实验仪器、设备或软件:电脑,MATLAB软件三、实验内容1.编写插值方法的函数M文件;2.用MATLAB中的函数作函数的拟合图形;3.针对实际问题,试建立数学模型,并求解。

四、实验步骤1.开启软件平台——MATLAB,开启MATLAB编辑窗口;2.根据各种数值解法步骤编写M文件;3.保存文件并运行;4.观察运行结果(数值或图形);5.写出实验报告,并浅谈学习心得体会。

五、实验要求与任务根据实验内容和步骤,完成以下具体实验,要求写出实验报告(实验目的→问题→数学模型→算法与编程→计算结果→分析、检验和结论→心得体会)。

1.天文学家在1914年8月的7次观测中,测得地球与金星之间距离(单位:米),并取得常用对数值,与日期的一组历史数据如下表:由此推断何时金星与地球的距离(米)的对数值为9.93518?解:输入命令days=[18 20 22 24 26 28 30];distancelogs=[9.96177 9.95436 9.94681 9.93910 9.93122 9.92319 9.91499]; t1=interp1(distancelogs,days,9.93518) %线性插值t2=interp1(distancelogs,days,9.93518,'nearest') %最近邻点插值t3=interp1(distancelogs,days,9.93518,'spline') %三次样条插值t4=interp1(distancelogs,days,9.93518,'cubic') %三次插值计算结果:t1 =24.9949t2 =24t3 =25.0000t4 =25.0000综上所得,可推断25日金星与地球的距离(米)的对数值为9.93518。

实验4多项式、曲线拟合与插值

实验4多项式、曲线拟合与插值
实验3 多项式、曲线拟合与插 值
1
实验要求
• 给出实验报告,形式如下 • 实验题目: • 实验目的 : • 实验内容: • 实验结果:(无需抄题,指定题目序号)
2
实验内容
• 一.上机操作本讲义(4-5)页的练习1-6 • 二.拟合曲线
– 题目见本讲义第6页和第7页 – 要求:给出代码,并附上拟合曲线对比图
6
ห้องสมุดไป่ตู้
插值
• 在某山区测得一些地点的高程如下表所示。平面区域为 1200<=x <=4000,1200 <=y <=3600. 试做出该山区的地貌图和等高线图,并对 几种插值方法('nearest' 'linear' 'spline' 'cubic‘)进行比较。
7
• 三.插值
– 题目见本讲义第8页 – 要求:给出程序代码,比较结果图以及分析结

3
4
5
曲线拟合
• 有一组实测数据如下表,而且已知该数据可 能满足的原型函数为 y(x)=a*x+b*x^2*e^(cx)+d,试求满足下面数据的最小二乘解 a,b,c,d的值 x= 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 与x相对应的y=2.3201 2.6470 2.9707 3.2885 3.6008 3.9090 4.2147 4.5191 4.8232 5.1275
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算方法实验题目:班级:学号:姓名:目录计算方法实验 (1)1 实验目的 (3)2 实验步骤 (3)2.1环境配置: (3)2.2添加头文件 (3)2.3主要模块 (3)3 代码 (4)3.1主程序部分 (4)3.2多项式方程部分 (4)3.3核心算法部分 (8)3.4数据结构部分 (13)4运行结果 (19)4.1拉格朗日插值法运行结果 (19)4.2牛顿插值法运行结果 (20)4.3多项式拟合运行结果 (20)5总结 (21)拉格朗日插值法 (21)牛顿插值法 (21)多项式拟合 (21)6参考资料 (22)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(int argc, _TCHAR* argv[]){GetEquation();while (Exflag){ShowMenu();}return 0;}3.2多项式方程部分方程部分头文件#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);void ShowMenu(void);void printres(sequenlist *A);void printfunction2(datacoa *A);void printfunctionf(datacoa *A);void Tip(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<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 << "输入给定数据的个数:" << endl;cin >> Numberx;cout << "从小到大输入x,输入00结束(如y=x^2+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=x^2+2x+1输入1 2 1 00):" << 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.牛顿插值法" << 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 << "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->last; i++){cout << setw(12) << A->data[i];}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->data[i][j];}cout << endl;}}////////////////////////打印输出函数/////////////////////////// void printfunctionf(datacoa *A){int i = 1;cout << "f=";cout << A->data[i][A->n];for (i = 2; i <= A->m; i++){if (A->data[i][A->n]< 0)cout << A->data[i][A->n] << "*" << "x^" << i - 1;else cout << "+" << A->data[i][A->n] << "*" << "x^" << i - 1;}cout << endl;}////////////////////////返回提示///////////////////////////void Tip(void){int flag;cout << "输入000退出,其余返回:" << endl;cin >> flag;if (flag == 000)Exflag = 0;}3.3核心算法部分插值部分头文件#ifndef _ALINTERPOLATION_H#define _ALINTERPOLATION_H#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);#endif插值部分CPP文件#include "alinterpolation.h"#include "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->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];}return temp;}void Langmethod(void){int i;datatype x, f;cout << "请输入插值点:" << "\t";cin >> x;f = Langarange(B, D, x);i = Findi(B, x);Insert(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->data[i], i, 1);InsertA2(FX, F->data[i], i, 2);}for (j = 3; j <= Numberx + 1; j++){for (i = 1; i <= Numberx - j + 2; i++){temp1 = FX->data[i + 1][j - 1] - FX->data[i][j - 1];temp2 = FX->data[i + j - 2][1] - FX->data[i][1];InsertA2(FX, temp1 / temp2, i, j);}}Nn = FX->data[1][2];for (j = 3; j <= Numberx + 1; j++){for (k = 1; k <= j - 2; k++)temp = temp*(x - FX->data[k][1]);Nn = Nn + temp*FX->data[1][j];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(B);printres(D);}●拟合部分头文件#ifndef _ALFITTING_H#define _ALFITTING_H#include "stdio.h"#include "stdlib.h"void ColumnGaussmethod(datacoa *A, int Xnumbers);void Fpolynomial(void);#endif●拟合部分CPP文件#include "alfitting.h"#include "stdafx.h"#include "squencelist.h"#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->data[i2][i]))>(fabs(A->data[flagc][i])))flagc = i2;if (flagc != i)for (k = i; k <= Xnumbers; k++){temp = A->data[i][k];A->data[i][k] = A->data[flagc][k];A->data[flagc][k] = temp;}for (i2 = i + 1; i2 <= Fnumber; i2++){temp = A->data[i2][i] / A->data[i][i];for (j2 = i; j2 <= Xnumbers; j2++)A->data[i2][j2] = A->data[i2][j2] - temp*A->data[i][j2];}}for (i = Fnumber; i >= 1; i--){for (j = Fnumber; j >= i + 1; j--)A->data[i][Xnumbers] = A->data[i][Xnumbers] - A->data[i][j] * A->data[j][Xnumbers + 1];res = A->data[i][Xnumbers] / A->data[i][i];InsertA2(A, res, i, Xnumbers + 1);}}//////////////////////////多项式拟合////////////////////////////void Fpolynomial(void){int Xnumbers;int i, j, 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->data[k], j + i - 2);InsertA2(A, s, i, j);s = 0;}for (k = 1; k <= B->last; k++)t = t + pow(B->data[k], i - 1)*D->data[k];InsertA2(A, t, i, Xnumbers + 2);t = 0;}ColumnGaussmethod(A, A->n);printfunctionf(A);}3.4数据结构部分数据结构头文件#ifndef _SQUENCELIST_H#define _SQUENCELIST_H#include "stdio.h"#include "stdlib.h"#include "stdafx.h"#include<iostream>using namespace std;#define maxsize 1024/***sequenlist*/typedef double datatype;typedef struct{datatype data[maxsize][maxsize];int m, n;}datacoa;typedef struct{datatype data[maxsize];int last;}sequenlist;sequenlist *InitList();int Length(sequenlist*);int Insert(sequenlist*, 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*, datatype, int, int);void DeleteLie(datacoa*L, int j);void DeleteLine(datacoa*L, int i);/***linklist*/typedef char linkdatatype;typedef struct node{linkdatatype data;struct node*next;}linklist;linklist* CreateListF();#endif数据结构CPP文件#include "stdafx.h"#include "squencelist.h"///////////////////////////////////数据结构部分//////////////////////////////////////////////////////////////////////////////sequenlist/////////////////////////////////////////// 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 << "表已满" << endl;return 0;}for (j = L->last; j >= i; j--)L->data[j + 1] = L->data[j];L->data[i] = 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->data[j] = L->data[j + 1];L->last--;return 1;}int Locate(sequenlist*L, datatype x){int i = 1;while (i <= L->last){if (L->data[i] != 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(sequenlist*L){int i = 1;for (i = 1; i <= L->last; i++)cout << L->data[i] << ' ';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->data[j] == B->data[j])i = 0;if (A->data[j] < B->data[j]){i = -1;break;}if (A->data[j] > B->data[j]){i = 1;break;}j++;}if (i != 0)return i;else{if (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->data[i]>x)break;return i;}void Invert(sequenlist*L){int i;datatype temp;for (i = 1; i <= L->last / 2; i++){temp = L->data[i];L->data[i] = L->data[L->last + 1 - i];L->data[L->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->data[i][k + 1] = L->data[i][k];L->data[i][j] = x;if (i > L->m)L->m++;if (j > L->n)L->n++;return 1;}void DeleteLie(datacoa*L, int j){int k, i;if ((j<1) || (j>L->n)){cout << "非法删除位置" << endl;}for (i = 1; i <= L->m; i++){for (k = j; k <= L->n; k++)L->data[i][j] = L->data[i][j + 1];}L->n--;}void DeleteLine(datacoa*L, int i){int k, j;if ((i<1) || (i>L->m)){cout << "非法删除位置" << endl;}for (j = 1; j <= L->n; j++){for (k = i; k <= L->m; k++)L->data[i][j] = L->data[i + 1][j];}L->m--;}///////////////////////////////////linklist/////////////////////////////////////////// linklist* CreateListF(){linklist *head, *p;char ch;head = (linklist*)malloc(sizeof(linklist));head->next = NULL;cin >> ch;while (ch != '\n'){p = (linklist*)malloc(sizeof(linklist));p->data = ch;p->next = head->next;head->next = p;}return head;}4运行结果4.1拉格朗日插值法运行结果4.2牛顿插值法运行结果4.3多项式拟合运行结果5总结拉格朗日插值法拉格朗日插值法和牛顿算法比起来比较简单,注意迭代的次序。

相关文档
最新文档