代数插值法c语言编程,-代数插值法的论述.doc

-代数插值法的论述

数值分析

--代数插值法的论述

姓名:蔺孝宝

学号:

班级:1203

学院:商洛学院

数计学院数学与计算科学系

日期2014.12.29代数插值法

摘要

插值法是函数逼近的重要方法之一,有着广泛的应用 。在生产和实验中,函数f(x)或者其表达式不便于计算复杂或者无表达式而只有函数在给定点的函数值(或其导数值) ,此时我们希望建立一个简单的而便于计算的函数j(x),使其近似的代替f(x),有很多种插值法,其中以拉格朗日(Lagrange)插值和牛顿(Newton)插值为代表的多项式插值最有特点,常用的插值还有Hermit插值,分段插值和样条插值.这里主要介绍拉格朗日(Lagrange)插值和牛顿(Newton)插值并在MATLAB中的应用操作。

【关键字】插值法 拉格朗日插值 牛顿插值 MATLAB

正文:

一、调用MATLAB内带函数插值

1、MATLAB内带插值函数列举如下:

interp1

interpft

interp2

interp3

interpn

spline

meshgrid

ndgrid

griddata一维数据内插(查表法)

使用FFT方法的一维数据内插

二维数据内插(查表法)

三维数据内插(查表法)

多维数据内插(查表法)

三次样条内插

为三维绘图产生X和Y阵

为多维函数和内插产生阵列

数据网格2、取其中的一维数据内插函数(interp1)为例,程序如下:

其调用格式为:

yi=interp1(x, y, xi)

yi=interp1(x, y, xi, method)

举例如下:

x=0:10:100

y=[40 44 46 52 65 76 80 82 88 92 110];

xi=0:1:100

yi=interp1(x,y,xi,'spline')

3、其他内带函数调用格式为:

Interpft函数:

y=interpft(x,n)

y=interpft(x,n,dim)

interp2函数:

ZI=interp2(X, Y, Z, XI, YI), ZI=imerp2(Z, ntimes)

ZI=interp2(Z, XI, YI) ,ZI=interp2(X, Y, Z, XI, YI, method) interp3函数:

VI=interp3(X,Y,Z,V,XI,YI,ZI) VI=interp3(V, ntimes)

VI=interp3(V,XI,YI,ZI) VI=interp3(…, method)

Interpn函数:

VI=interpn(X1, X2, X3, …, V, Y1, Y2, Y3, …)

VI=interpn(V, ntimes)

VI=interpn(V, Yl, Y2, Y3, …)  VI=interpn(…, method)

Spline函数:

yi=spline(x,y,xi)

pp=spline(x,y)

meshgrid函数:

[X,Y]=meshgrid(x,y)

[X,Y]=meshgrid(x)

[X,Y,Z]=meshgrid(x,y,z)

Ndgrid函数:

[X1, X2, X3, …]=ndgrid(x1, x2, x3, …)

[X1, X2, X3, …]=ndgrid(x)

Griddata函数:

ZI=griddata(x, y, z, XI, YI)

[XI, YI, ZI]=griddata(x, y, z, xi, yi)

[…]=griddata(… method)

二、两种插值法分析与MATLAB应用

1.1拉格朗日插值

1.1.1基本原理

构造n次多项式Pn (x)= yk lk (x)=y0l0 (x)+y1l1 (x)+…+ynln (x),这是不超过n次的多项式,其中基函数lk(x)=

显然lk (x)满足lk (xi)=

此时 Pn(x)≈f(x),误差Rn(x)=f(x)-Pn(x)=

其中∈(a,b)且依赖于x,=(x-x0)(x-x1)…(x-xn)n=1、插值节点只有两个xk,xk+1时

P1(x)=yklk(x)+yk+1lk+1(x)

其中基函数lk(x)= lk+1(x)=

1.1.2优缺点

可对插值函数选择多种不同的函数类型,由于代数多项式具有简单和一些良好的特性,故常选用代数多项式作为插值函数。利用插值基函数很容易得到拉格朗日插值多项式,公式结构紧凑,在理论分析中甚为方便,但当插值节点增减时全部插值基函数(x)(k=0,1,…,n)均要随之变化,整个公式也将发生变化,这在实际计算中是很不方便的,为了克服这一缺点,提出了牛顿插值。M 文件:

f

#include #include #include typedef strUCt data { float x; float y; }Data;//变量x和函数值y的结构 Data d[20];//最多二十组数据 float f(int s,int t)//牛顿插值法,用以返回插商 { if(t==s+1) return (d[t].y-d[s].y)/(d[t].x-d[s].x); else return (f(s+1,t)-f(s,t-1))/(d[t].x-d[s].x); } float Newton(float x,int count) { int n; while(1) { cout<>n; if(n<=count-1)// 插值次数不得大于count-1次 break; else system("cls"); } //初始化t,y,yt。 float t=1.0; float y=d[0].y; float yt=0.0; //计算y值 for(int j=1;j<=n;j++) { t=(x-d[j-1].x)*t; yt=f(0,j)*t; //cout<<f(0,j)<<endl; y=y+yt; } return y; } float lagrange(float x,int count) { float y=0.0; for(int k=0;k<count;k++)//这儿默认为count-1次插值 { float p=1.0;//初始化p for(int j=0;j<count;j++) {//计算p的值 if(k==j)continue;//判定是否为同一个数 p=p*(x-d[j].x)/(d[k].x-d[j].x); } y=y+p*d[k].y;//求和 } return y;//返回y的值 } void main() { float x,y; int count; while(1) { cout<>count; if(count<=20) break;//检查输入的是否合法 system("cls"); } //获得各组数据 for(int i=0;i<count;i++) { cout<<"请输入第"<<i+1<>d[i].x; cout<<"请输入第"<<i+1<>d[i].y; system("cls"); } cout<>x; while(1) { int choice=3; cout<<"请您选择使用哪种插值法计算:"<<endl; cout<<" (0):退出"<<endl; cout<<" (1):Lagrange"<<endl; cout<<" (2):Newton"<<endl; cout<>choice;//取得用户的选择项 if(choice==2) { cout<<"你选择了牛顿插值计算方法,其结果为:"; y=Newton(x,count);break;//调用相应的处理函数 } if(choice==1) { cout<<"你选择了拉格朗日插值计算方法,其结果为:"; y=lagrange(x,count);break;//调用相应的处理函数 } if(choice==0) break; system("cls"); cout<<"输入错误!!!!"<<endl; } cout<<x<<" , "<<y<<endl;//输出最终结果 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值