计算方法上机实验报告——拉格朗日插值问题

合集下载

拉格朗日插值公式数值分析实验报告

拉格朗日插值公式数值分析实验报告

学生学号27 实验课成绩
学生实验报告书
实验课程名称数值分析A
开课学院理学院
指导教师姓名金升平教授
学生姓名陶玮
学生专业班级统计1401
2015-- 2016学年第 2 学期
实验课程名称:__数值分析______
实验项目名称拉格朗日插值公式实验成绩
实验者陶玮专业班级统计1401 组别
同组者实验日期年月日一部分:实验预习报告(包括实验目的、意义,实验基本原理与方法,主要仪器设备及耗材,实验方案与技术路线等)
实验目的:
1、学习和掌握拉格朗日插值多项式。

2、运用拉格朗日插值多项式进行计算。

实验基本原理:
拉格朗日插值基函数的一般形式:
也即是:
所以可以得出拉格朗日插值公式的一般形式:
其中,n=1时,称为线性插值,
n=2时,称为二次插值或抛物插值,精确度相对高些,
主要仪器设备:。

数值计算方法-拉格朗日牛顿插值实验

数值计算方法-拉格朗日牛顿插值实验

3.对比牛顿前插和牛顿后插两种方法的差异, 讨论分析同一个数值两种方法的计 算结果。 答:如果插值点 x 离 x0。比较近,则一般使用牛顿前差公式;如果插值点 x
离 x0。比较远,则一般使用牛顿后差公式。但对于同一个插值点 x 来说,不管 用牛顿前差公式还是用牛顿后差公式,得到的结果是一-样的,这两种插值公式 只是形式上的差别。 4.讨论分段插值法的意义。 答:高次插值的收敛性没有保证,实际计算稳定性也没有保证,所以当插值结 点 n 较大时, 通常不采用高次多项式插值, 用低次多项式插值, 它能保证收敛性, 得到的结果也相对稳定。
《计算方法》实验报告
实验二 插值法 实验目的
1. 掌握拉格朗日插值法、牛顿插值法、牛顿前后插值法及分段插值法的原理与算法。 2. 讨论几种方法的计算精度与误差,分析拉格朗日插值与牛顿插值法的差异。 3. 学会使用 Matlab 绘图方法,并以此方法来显示插值函数,使结果更直观更形象。
算法原理
(一)拉格朗日插值法 设 是互异插值节点,则满足插值条件 的插值多项式
是存在且唯一的。那么可以得到 n+1 个插值方程,求解 这个方程组,可以得到 n 次拉格朗日插值公式: ‴ , (二)牛顿插值法
其中:
(三)牛顿前后插值法 牛顿前插法为: th t t t t t t t t t t t t t t t t
牛顿后插法为: th
程序代码
拉格朗日插值 +
牛顿插值法运行脚本
牛顿向前插值法
牛顿向后插值法
牛顿向前插值作业
牛顿向后插值
数据测试结果
(1)选取 n=7,拉格朗日插值结果为:
(2)选取 n=7,牛顿插值法结果为:
(3) (4)X1=1.3,x2=5.6,牛顿向前向后插值法结果为:

《计算方法》实验四插值法

《计算方法》实验四插值法

《计算方法》实验四插值法
一、实验目的:
掌握拉格朗日插以及多项式插值的震荡问题
二、实验任务:
考虑一个固定的区间上用插值逼近一个函数。

显然拉格朗日插值中使用的节点越多,插值多项式的次数就越高。

我们自然关心插值多项式的次数增加时,是否也更加靠近被逼近的函数。

龙格(Runge)给出一个例子是极著名并富有启发性的。

设区间[-1,1]上函数
三、实验内容:
考虑区间[-1,1]的一个等距划分,分点为
则拉格朗日插值多项式为
其中的是n次拉格朗日插值基函数。

四、上机习题:
(1)选择不断增大的分点数目n=2,3….,画出原函数f(x)及插值多项式函数在[-1,1]上的图像,比较并分析实验结果。

(2)选择其他的函数,例如定义在区间[-5,5]上的函数
重复上述的实验看其结果如何。

(3)区间[a,b]上切比雪夫点的定义为
以为插值节点构造上述各函数的拉格朗日插值多项式,比较其结果。

拉格朗日插值牛顿插值C语言实验报告

拉格朗日插值牛顿插值C语言实验报告

实验报告:数学与统计学系信息与计算科学专业实验报告一、题目1、上机作业题程序12、上机作业题程序2二、算法1、Lagrange 插值//输入被插值点的数目POINT;int main(){int n;inti,j;POINT points[MAX_N+1];double diff[MAX_N+1];doublex,tmp=0,lagrange=0,tx,ty;printf("\nInput n value:");scanf("%d",&n);if(n>MAX_N){printf("The input n is larger thenMAX_N,please redefine the MAX_N.\n");return 1;}if(n<=0){printf("Please input a number between 1 and %d\n",MAX_N);return 1;}//输入被插值点printf("Now input the (x_i,y_i),i=0,...,%d:\n",n);for(i=0;i<=n;i++)scanf("%lf%lf",&points[i].x,&points[i].y);printf("Now input the x value:"); //输入计算Lagrange插值多项式的x值scanf("%lf",&x);for(i=0;i<=n;i++){diff[i]=0;tx=1;ty=1;for(j=0;j<=n;j++){if(i!=j){tx=tx*(x-points[j].x);ty=ty*(points[i].x-points[j].x);}}diff[i]=tx/ty;}for(i=0;i<=n;i++){tmp=points[i].y*diff[i];printf("%f",tmp);lagrange+=tmp;}printf("lagrange(%f)=%f\n",x,lagrange);return 0;}2、Newton 插值//输入被插值点的数目POINT;int main(){ int n;inti,j;POINT points[MAX_N+1];double diff[MAX_N+1];doublex,tmp,newton=0;printf("\nInput n value: ");scanf("%d",&n);if (n>MAX_N){printf("The input n is larger thenMAX_N,please redefine the MAX_N.\n");return 1;}if(n<=0){printf("Please input a number between 1 and %d\n",MAX_N);// getch(); return 1;}//输入被插值点printf("Now input the (x_i,y_i),i=0,...,%d:\n",n);for (i=0;i<=n;i++)scanf("%lf%lf",&points[i].x,&points[i].y);printf("Now input the x value: ");//输入计算Newton插值多项式的x值scanf("%lf",&x);for (i=0;i<=n;i++)diff[i]=points[i].y;for (i=0;i<n;i++){for (j=n;j>i;j--){diff[j]=(diff[j]-diff[j-1])/(points[j].x-points[j-1-i].x);}//计算f(x_0,…,x_n)的差商}tmp=1;newton=diff[0];for(i=0;i<n;i++){tmp=tmp*(x-points[i].x);newton=newton+tmp*diff[i+1];}printf("newton(%f)=%f\n",x,newton);return 0;}三、C程序1、Lagrange 插值#include <stdio.h>#define MAX_N 20typedefstructtagPOINT{double x;double y;}POINT;int main(){int n;inti,j;POINT points[MAX_N+1];double diff[MAX_N+1];doublex,tmp=0,lagrange=0,tx,ty;printf("\nInput n value:");scanf("%d",&n);if(n>MAX_N){printf("The input n is larger thenMAX_N,please redefine the MAX_N.\n");return 1;}if(n<=0){printf("Please input a number between 1 and %d\n",MAX_N); return 1;}printf("Now input the (x_i,y_i),i=0,...,%d:\n",n);for(i=0;i<=n;i++)scanf("%lf%lf",&points[i].x,&points[i].y);printf("Now input the x value:");scanf("%lf",&x);for(i=0;i<=n;i++){diff[i]=0;tx=1;ty=1;for(j=0;j<=n;j++){if(i!=j){tx=tx*(x-points[j].x);ty=ty*(points[i].x-points[j].x);}}diff[i]=tx/ty;}for(i=0;i<=n;i++){tmp=points[i].y*diff[i];printf("%f",tmp);lagrange+=tmp;}printf("lagrange(%f)=%f\n",x,lagrange);return 0;}2、Newton 插值#include <stdio.h>#define MAX_N 20typedefstructtagPOINT{ double x;double y;} POINT;int main(){ int n;inti,j;POINT points[MAX_N+1];double diff[MAX_N+1];doublex,tmp,newton=0;printf("\nInput n value: ");scanf("%d",&n);if (n>MAX_N){printf("The input n is larger thenMAX_N,please redefine the MAX_N.\n");return 1;}if (n<=0){printf("Please input a number between 1 and %d.\n",MAX_N);return 1;}//输入被插值点(x_i,y_i)printf("Now input the (x_i,y_i),i=0,...,%d:\n",n);for (i=0;i<=n;i++)scanf("%lf%lf",&points[i].x,&points[i].y);printf("Now input the x value: ");scanf("%lf",&x);for (i=0;i<=n;i++)diff[i]=points[i].y;for (i=0;i<n;i++){for (j=n;j>i;j--){diff[j]=(diff[j]-diff[j-1])/(points[j].x-points[j-1-i].x);}}tmp=1;newton=diff[0];for(i=0;i<n;i++){tmp=tmp*(x-points[i].x);newton=newton+tmp*diff[i+1];}printf("newton(%f)=%f\n",x,newton);return 0;}四、运行结果1、Lagrange 插值1910年Larange插值计算得到的人口数:1965年Larange插值计算得到的人口数:2002年Larange插值计算得到的人口数:从插值计算得出的结果1910年的人口数是31872000人,1965年的人口数约为193081511人,2002年的人口数约为26138748,而1910年的实际人口数为91772000人,1960年的实际人口数为179323000人,1970年的人口数为203212000人,所以拉格朗日插值计算得出的结果只有1965年的人口数与实际值相差较近,而1910年和2002年的计算结果都与实际值相差较大,所以插值计算得到的数据准确性并不高。

拉格朗日插值上机实验报告

拉格朗日插值上机实验报告
输入nxiyix计算lixsslixyj输出s三原代码与运行结果代码如下
计算机科学与技术学院
姓名:程伟业
学号:U200714790
一、题目:完成L-插值公式的编程,并由下表求f(x*),x*=4.31.
x
1
2
3
4
5
6
7
f(x)
8
3
-1
2
-1
4
5
二、程序设计与分析
L-插值公式:
N
Yቤተ መጻሕፍቲ ባይዱ
三、原代码与运行结果
代码如下:
/*完成拉格朗日插值公式编程*/
#include<stdio.h>
float M(float x[],float y,int i,int n)
{float m=1; int j;
for(j=0;j<=n;j++)
if(j!=i)
m=m*(y-x[j]);
return m;
}/*构造函数M=(x-x[0])*(x-x[1])……(x-x[i-1])(x-x[i+1])……(x-x[n])*/
s=s+M(a,x,i,k)/M(a,a[i],i,k)*b[i];/*Largrange插值公式*/
printf("The result is %f\n",s);
}
运行结果:
void main()
{
float s=0,x;/*s用来记录结果,x是待估计的点*/
int n,k,i=0;
float a[20],b[20];/*用数组存储插值节点及其函数值*/
printf("Please enter n:\n");

数值分析上机实验报告(插值)

数值分析上机实验报告(插值)

数值分析第一次上机练习实验报告——Lagrange 插值与三次样条插值一、 问题的描述设()2119f x x =+, []1,1x ∈-,取15iix =-+,0,1,2,...,10i =.试求出10次Lagrange 插值多项式()10L x 和三次样条插值函数()S x (采用自然边界条件),并用图画出()f x ,()10L x ,()S x .二、 方法描述——Lagrange 插值与三次样条插值我们取15i ix =-+,0,1,2,...,10i =,通过在i x 点的函数值()2119i i f x x =+来对原函数进行插值,我们记插值函数为()g x ,要求它满足如下条件:()()21,0,1,2,...,1019i i i g x f x i x ===+ (1)我们在此处要分别通过Lagrange 插值(即多项式插值)与三次样条插值的方法对原函数()2119f x x=+进行插值,看两种方法的插值结果,并进行结果的比较。

10次的Lagrange 插值多项式为:()()10100i i i L x y l x ==∑ (2)其中:()21,0,1,2,...,1019i i iy f x i x ===+ 以及()()()()()()()()()011011......,0,1,2,...,10......i i n i i i i i i i n x x x x x x x x l x i x x x x x x x x -+-+----==----我们根据(2)进行程序的编写,我们可以通过几个循环很容易实现函数的Lagrange 插值。

理论上我们根据区间[]1,1-上给出的节点做出的插值多项式()n L x 近似于()f x ,而多项式()n L x 的次数n 越高逼近()f x 的精度就越好。

但实际上并非如此,而是对任意的插值节点,当n →+∞的时候()n L x 不一定收敛到()f x ;而是有时会在插值区间的两端点附近会出现严重的()n L x 偏离()f x 的现象,即所谓的Runge 现象。

lagrange插值法上机实践报告

lagrange插值法上机实践报告
3.625000000000000
五、计算结果的分析
三次Lagrange插值多项式为:

2.125000000000000; 0.375000000000000; 3.625000000000000.
六、计算中出现的问题,解决方法及体会
从上面的试验结果中我们可以看出拉格朗日插值法在实际中的巨大作用,它能使因试验得到的复杂数据处理更简单化,对于一些没有明确函数关系的数据处理,通过插值法构造的近似函数能有效的反映原数据的特性,又在插值法中,拉格朗日插值是一种多节点选取的插值法,其构造结果更加渐进真实结果,则在实际中用的更多,所以在今后的操作中,如何得到更加近似于原试验数据的构造函数,即如何减小拉格朗日插值多项式误差计算问题是我们以后做研究时要重点关注和去解决的难点。
四、数值结果五、计算结果的分析 六、计算中出现的问题,解决方法及体会
一、实验目的、内容
实验目的:
1.了解lagrange插值法的基本原理和方法;
2.掌握拉格郎日插值多项式的用法,适用范围及精确度;
3.学习掌握MATLAB软件有关的命令。
内容:
已知数据点 ,求三次Lagrange插值多项式 , 并求
二、相关背景知识介绍

其中 为以 为节点的n次插值基函数,则 是一次数不超过n的多项式,且满足
, j=0,1,…,n
再由插值多项式的唯一性,得
上式表示的插值多项式称为拉格朗日(Lagrange)插值多项式。
三、代码(Matlab)
functiony = lagrange(x0,y0,x)
n = length(x0);
m = length(x);
(3)拉格朗日插值法的概述
拉格朗日插值用来求n个节点的(n-1)次插值多项式,它就是线性插值和抛物线插值的推广和延伸。我们设有n个节点,则拉格朗日插值的表达式表示为:

计算方法实验四拉格朗日插值实验报告

计算方法实验四拉格朗日插值实验报告

实验报告学院:电子信息工程实验课程:计算方法学生姓名:学号:专业班级:通信工程17-3班级实验四 Lagrange 插值1 目的与要求(1)进一步理解和掌握Lagrange 插值的数值算法。

(2)能够根据给定的函数值表求出插值多项式和函数在某一点的近似值以解决实际问题2 实验内容已知函数表如下,通过编制程序,试用拉格朗日插值多项式求0.5,0.7,0.85三点处的近似函数值。

3 实验原理拉格朗日插值多项式:4 程序设计 (1)流程图拉格朗日插值程序流程图∑===ni 0i ii )x (l y y )x x ()x x )(x x ()x x ()x x ()x x )(x x ()x x ()x (l n i 1i i 1i i 0i n 1i 1i 0i --------=+-+-(2)程序代码#include<stdio.h>#include<math.h>#define n 5double lagrange(long double a[n],long double b[n],double x){int k,l;long double y1,m;y1=0.0;for(k=0;k<n;k++){m=1.0;for(l=0;l<n;l++){if(l!=k){m=m*(x-a[l])/(a[k]-a[l]);}}y1=y1+m*b[k];}return y1;}void main(){double x,y;long double a[n]={0.4,0.55,0.8,0.9,1};long double b[n]={0.41075,0.57815,0.88811,1.02652,1.17520};printf("\n输入要求的自变量的值\n");scanf("%lf",&x);y=lagrange(a,b,x);printf ("拉格朗日插值后的近似值%lf",y); }5 实验结果与分析0.5处的近似函数值为:0.7处的近似函数值为:0.85处的近似函数值为:分析:(1)通过完成拉格朗日插值法的编程实验,在对程序的修改中,我认为我最大的收获是我对C语言中数据类型具有了更为深刻的认识,进一步掌握了拉格朗日插值法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算方法上机实验报告——拉格朗日插值问题
一、方法原理
n次拉格朗日插值多项式为:Ln(x)=y0l0(x)+y1l1(x)+y2l2(x)+…+ynln(x) n=1时,称为线性插值,L1(x)=y0(x-x1)/(x0-x1)+y1(x-x0)/(x1-x0)=y0+(y1-x0)(x-x0)/(x1-x0) n=2时,称为二次插值或抛物线插值,精度相对高些
L2(x)=y0(x-x1)(x-x2)/(x0-x1)/(x0-x2)+y1(x-x0)(x-x2)/(x1-x0)/(x1-x
2)+y2(x-x0)(x-x1)/(x2-x0)/(x2-x1)
二、主要思路
使用线性方程组求系数构造插值公式相对复杂,可改用构造方法来插值。

对节点xi(i=0,1,…,n)中任一点xk(0<=k<=n)作一n次多项式lk(xk),使它在该点上取值为1,而在其余点xi(i=0,1,…,k-1,k+1,…,n)上为0,则插值多项式为Ln(x)=y0l0(x)+y1l1(x)+y2l2(x)+…+ynln(x)
上式表明:n个点xi(i=0,1,…,k-1,k+1,…,n)都是lk(x)的零点。

可求得lk
三.计算方法及过程:1.输入节点的个数n
2.输入各个节点的横纵坐标
3.输入插值点
4.调用函数,返回z
函数语句与形参说明
程序源代码如下:
形参与函数类型
参数意义
intn
节点的个数
doublex[n](double*x)
存放n个节点的值
doubley[n](double*y)
存放n个节点相对应的函数值
doublep
指定插值点的值
doublefun()
函数返回一个双精度实型函数值,即插值点p处的近似函数值
#include<iostream>
#include<math.h>
usingnamespacestd;
#defineN100
doublefun(double*x,double*y,intn,doublep);
voidmain()
{inti,n;
cout<<"输入节点的个数n:";
cin>>n;
doublex[N],y[N],p;
cout<<"pleaseinputxiangliangx="<<endl;
for(i=0;i<n;i++)cin>>x[i];
cout<<"pleaseinputxiangliangy="<<endl;
for(i=0;i<n;i++)cin>>y[i];
cout<<"pleaseinputLagelangrichazhiJieDianp="<<endl;
cin>>p;
cout<<"TheAnswer="<<fun(x,y,n,p)<<endl;
system("pause");}
doublefun(doublex[],doubley[],intn,doublep)
{doublez=0,s=1.0;
intk=0,i=0;
doubleL[N];
while(k<n)
{if(k==0)
{for(i=1;i<n;i++)s=s*(p-x[i])/(x[0]-x[i]);
L[0]=s*y[0];
k=k+1;}
else
{s=1.0;
for(i=0;i<=k-1;i++)s=s*((p-x[i])/(x[k]-x[i]));
for(i=k+1;i<n;i++)s=s*((p-x[i])/(x[k]-x[i]));
L[k]=s*y[k];
k++;}
}
for(i=0;i<n;i++)z=z+L[i];
returnz;
}
四.运行结果测试:
五.实验分析
n=2时,为一次插值,即线性插值
n=3时,为二次插值,即抛物线插值
n=1,此时只有一个节点,插值点的值就是该节点的函数值
n<1时,结果都是返回0的;这里做了n=0和n=-7两种情况
3<n<100时,也都有相应的答案
常用的是线性插值和抛物线插值,显然,抛物线精度相对高些
n次插值多项式Ln(x)通常是次数为n的多项式,特殊情况可能次数小于n.例如:通过三点的二次插值多项式L2(x),如果三点共线,则y=L2(x)就是一条直线,而不是抛物线,这时L2(x)是一次式。

拟合曲线光顺性差。

相关文档
最新文档