Lagrange插值程序1

合集下载

MATLAB数值实验一(数据的插值运算及其应用完整版)

MATLAB数值实验一(数据的插值运算及其应用完整版)

佛山科学技术学院实 验 报 告课程名称 数值分析 实验项目 插值法与数据拟合 专业班级 机械工程 姓 名 余红杰 学 号 10 指导教师 陈剑 成 绩 日 期 月 日一、实验目的1、学会Lagrange 插值、牛顿插值和三次样条插值等基本插值方法;2、讨论插值的Runge 现象3、学会Matlab 提供的插值函数的使用方法,会用这些函数解决实际问题。

二、实验原理1、拉格朗日插值多项式2、牛顿插值多项式3、三次样条插值 三、实验步骤1、用MATLAB 编写独立的拉格朗日插值多项式函数2、用MATLAB 编写独立的牛顿插值多项式函数3、用MATLAB 编写独立的三次样条函数(边界条件为第一、二种情形)4、已知函数在下列各点的值为:根据步骤1,2,3编好的程序,试分别用4次拉格朗日多项式4()L x 、牛顿插值多项式4()P x 以及三次样条函数()S x (自然边界条件)对数据进行插值,并用图给出 {(,),0.20.08,0,1,2,,10i i i x y x i i =+=},4()L x 、4()P x 和()S x 。

5、在区间[-1,1]上分别取10,20n =用两组等距节点对龙格函数21(),(11)125f x x x=-≤≤+作多项式插值,对不同n 值,分别画出插值函数及()f x 的图形。

6、下列数据点的插值可以得到平方根函数的近似,在区间[0,64]上作图。

(1)用这9个点作8次多项式插值8()L x 。

(2)用三次样条(第一边界条件)程序求()S x 。

7、对于给函数21()125f x x =+在区间[-1,1]上取10.2(0,1,,10)i x i i =-+=,试求3次曲线拟合,试画出拟合曲线并打印出方程,与第5题的结果比较。

四、实验过程与结果:1、Lagrange 插值多项式源代码:function ya=lag(x,y,xa) %x 所有已知插值点 %y 插值点对应函数值 %xa 所求点,自变量 %ya 所求点插值估计量 ya=0; mu=1; %初始化%循环方式求L 系数,并求和: for i = 1:length(y) for j = 1:length(x) if i ~= jmu = mu * (xa - x(j) ) / ( x(i) - x(j) ); else continue end endya = ya + y(i) * mu ; mu = 1; end2、Newton 源代码:function ya = newton(x,y,xa) %x 所有已知插值点 %y 插值点对应函数值 %xa 所求点,自变量 %ya 所求点插值估计量 %建立系数零矩阵D 及初始化:D = zeros(length(x)-1);ya = y(1);xi = 1;%求出矩阵D,该矩阵第一行为牛顿插值多项式系数:for i=1:(length(x)-1)D(i,1) = (y(i+1) -y(i))/(x(i+1) -x(i));endfor j=2:(length(x)-1)for i=1:(length(x)-j)D(i,j) = (D(i+1,j-1) - D(i,j-1)) / (x(i+j) - x(i)); endend%xi为单个多项式(x-x(1))(x-x(2))...的值for i=1:(length(x)-1)for j=1:ixi = xi*(xa - x(j));endya = ya + D(1,i)*xi;xi = 1;end3、三次样条插值多项式(1)(第一边界条件)源代码:function y=yt1(x0,y0,f_0,f_n,x) _____________(1)%第一类边界条件下三次样条插值;%xi 所求点;%yi 所求点函数值;%x 已知插值点;%y 已知插值点函数值;%f_0左端点一次导数值;%f_n右端点一次导数值;n = length(x0);z = length(y0);h = zeros(n-1,1);k=zeros(n-2,1);l=zeros(n-2,1);S=2*eye(n);for i=1:n-1h(i)= x0(i+1)-x0(i);endfor i=1:n-2k(i)= h(i+1)/(h(i+1)+h(i));l(i)= 1-k(i);end%对于第一种边界条件:k = [1;k]; _______________________(2)l = [l;1]; _______________________(3)%构建系数矩阵S:for i = 1:n-1S(i,i+1) = k(i);S(i+1,i) = l(i);end%建立均差表:F=zeros(n-1,2);for i = 1:n-1F(i,1) = (y0(i+1)-y0(i))/(x0(i+1)-x0(i));endD = zeros(n-2,1);for i = 1:n-2F(i,2) = (F(i+1,1)-F(i,1))/(x0(i+2)-x0(i));D(i,1) = 6 * F(i,2);end%构建函数D:d0 = 6*(F(1,2)-f_0)/h(1); ___________(4)dn = 6*(f_n-F(n-1,2))/h(n-1); ___________(5)D = [d0;D;dn]; ______________(6)m= S\D;%寻找x所在位置,并求出对应插值:for i = 1:length(x)for j = 1:n-1if (x(i)<=x0(j+1))&(x(i)>=x0(j))y(i) =( m(j)*(x0(j+1)-x(i))^3)/(6*h(j))+...(m(j+1)*(x(i)-x0(j))^3)/(6*h(j))+...(y0(j)-(m(j)*h(j)^2)/6)*(x0(j+1)-x(i))/h(j)+... (y0(j+1)-(m(j+1)*h(j)^2)/6)*(x(i)-x0(j))/h(j) ; break;else continue;endendend(2)(自然边界条件)源代码:仅仅需要对上面部分标注的位置做如下修改:__(1):function y=yt2(x0,y0,x)__(2):k=[0;k]__(3):l=[l;0]__(4)+(5):删除—(6):D=[0:D:0]4、——————————————PS:另建了一个f方程文件,后面有一题也有用到。

计算方法 插值法Lagrange插值

计算方法 插值法Lagrange插值
xi , i 0,1,..., n
的n次插值基函数
以n+1个n次基本插值多项式lk(x)(k 0,1, … , n) 为基础,可直接写出满足插值条件
P(xi ) f(x i ) (i 0,1,2, … , n)
的n次代数插值多项式:
P(x) l0(x)y 0 l1(x)y1 … ln(x)yn
B(x1, f(x1))
x0
x1
由解析几何知道,这条直线用点斜式表示为
改写为
p(x)
y0
y1 x1
y0 x0
(x
x0)
p(x)
x x1 x0 x1
y0
x x0 x1 x0
y1
为了便于推广,记
推导
l0(x)
x x1 , x0 x1
l1(x )
x x0 x1 x0
线性插值 基函数
或者写成:
(i 0,1,2)
其几何意义是用经过3个点
(x0, y0 ), (x1, y1), (x2, y2 )
的抛物线 y P(x) 用以近似计算 y f(x)
y=f(x)
y
y = L 2 (x)
y0
y1
x0
x1
y2 x
x2
P(x)的系数 a0 , a1, a2 直接由插值条件决定,即
a0 , a1, a2 满足代数方程组:
(x 0 x1)(x 0 x2 )
从而导出 l0(x)
(x (x 0
x1)(x x2 ) x1)(x 0 x2 )
类似地可以构造出插值多项式 l1(x )和l2 (x )
于是确定了3个抛物插值的基函数:
l0(x)
(x (x 0
x1)(x x1)(x

第一章 第一节 Lagrange插值公式.

第一章 第一节 Lagrange插值公式.

Rn
x

M n+1 n +1
max ! axb
n+1
x
Lagrange余项定理在理论上有重要价值,它刻画了 Lagrange插值的某些基本特征。
n
注1 余项中含有因子n+1 x x xi ,如果插值点x 偏离插 i0
值节点xi 比较远,插值效果可能不理想。如何选择节点xi ,
可以证明,插值问题1.1、1.2 的解是存在且唯一的。为了
得到 Lagrange 公式的一般形式,我们先从最简单的一次插 值入手。
二、线性插值
已知:
x
x0
x1
y
y0
y1
求一个一次多项式P1(x) ,使满足
P1(xi ) yi ,i 0,1.
即求过点 x0, y0 , x1, y1 的一次曲线
使
Rn x
f x Pn x
f n+1
n +
1!
n+1

x

1.9
记 M n+1

max
a xb
f n+1 x ,于是由1.9 式可得
或者
Rn
x

M n+1
n +1!
n+1 x

1.10
max axb
简单才行。如果仅仅给出了一系列节点上的函数值
f xi yi ,i 0,1, 2,L , n ,则应采用 Lagrange 插值。
如果只提供了 f x 的一些离散值,并没给出具体的分析式 子, 就无法利用公式1.9 估计误差了。下面介绍另一种误差

c++拉格朗日插值法

c++拉格朗日插值法

c++拉格朗日插值法
C++程序实现Lagrange插值公式
Lagrange插值公式,是属于数值分析方面的内容。

此处我想用C++语言程序来实现n各插值节点插值公式的求解,并求出在某一个插值节点对应的函数值。

对于Lagrange插值算法的基本思想,在这里我只想略提两点,一个是拉格朗日插值公式,一个是拉格朗日插值基函数的求解。

因为这两者才是算法需要解决的最根本的问题。

(1)采用插值多项式来近似的逼近拉格朗日差值多项式。

(2)上面的插值多项式中的L(x)即为拉格朗日插值多项式的插值基函数的通项。

该版本可根据输入的插值点自动选取其周围的8个点进行7次插值运算。

Lagrange 插值

Lagrange 插值

今天的上机作业1. Lagrange 插值给出()ln f x x 的数值表用Lagrange 插值计算ln 0.54的近似值。

2.Newton 插值用Newton 插值计算x=0.41的近似值。

3.插值法的全部内容把chap_2试验.doc 的全部内容作一边,粘在这个文件里(包括图形)答:grange 插值function f=lagrange_5(x) x0=[0.4,0.5,0.6,0.7,0.8];y0=[-0.916291,-0.693147,-0.510826,-0.356675,-0.223144]; L1=0;m=length(x0);n=length(y0);if m~=n, error('向量x 与y 的长度必须一致');end for i=1:nL=ones(1,length(x)); for j=1:n if j~=iL=L.*(x-x0(j))/(x0(i)-x0(j)); end endL1=L1+L*y0(i); end L1lagrange_5(0.54) L1 =-0.616142715200002.Newton插值function f=newton_li5(x) %x0为入的节点值,y0相应节点的函数值x0=[0.25 0.30 0.39 0.45 0.53];y0=[0.5000 0.5477 0.6245 0.6708 0.7280];n=length(x0)%syms xfor i=1:nf(i,1)=y0(i);endhx=f(1,1);xx=(1.0);for k=2:nfor i=k:nf(i,k)=(f(i,k-1)-f(i-1,k-1))/(x0(i)-x0(i-k+1)); %构造差商表endxx=xx*(x-x0(k-1));hx=hx+f(k,k)*xx; %计算函数的近似值end%f=expand(hx)Hxnewton(0.41)n =5hx =0.64030542443064ans =0.50000000000000 0 0 0 00.54770000000000 0.95400000000000 0 0 00.62450000000000 0.85333333333333 -0.71904761904761 0 00.67080000000000 0.77166666666666 -0.54444444444446 0.87301587301575 00.72800000000000 0.71500000000000 -0.40476190476189 0.60731538992422 -0.948930296755483.插值法的全部内容把chap_2试验.doc的全部内容作一边,粘在这个文件里(包括图形)P28 例22点插值function f=lagrange_2(x)x0=[0.32,0.34];y0=[0.314567,0.333487];L1=0;m=length(x0);n=length(y0);if m~=n, error('向量x与y的长度必须一致');endfor i=1:nL=ones(1,length(x));for j=1:nif j~=iL=L.*(x-x0(j))/(x0(i)-x0(j));endendL1=L1+L*y0(i);endL1lagrange_2(0.3367)L1 =0.330365200000003点插值function f=lagrange_3(x)x0=[0.32,0.34,0.36];y0=[0.314567,0.333487,0.352274];L1=0;m=length(x0);n=length(y0);if m~=n, error('向量x与y的长度必须一致');endfor i=1:nL=ones(1,length(x));for j=1:nif j~=iL=L.*(x-x0(j))/(x0(i)-x0(j));endendL1=L1+L*y0(i);endL1lagrange_3(0.3367)L1 =0.33037436203750Lagrange插值法%eg1_lagr.mclear;clf;xx=linspace(-5,5,50); y=sin(xx); %作被插函数的图象disp('n x=4.5处的插值绝对误差的绝对值')x1=linspace(-5,5,3); y1=sin(x1); yy1=lagr1(x1,y1,xx); %2次插值chazhi_y45_2=lagr1(x1,y1,4.5);gd_wucha_limit_y45_2=abs(chazhi_y45_2-sin(4.5));disp(sprintf('%d %15.4f %15.4f',2,chazhi_y45_2,gd_wucha_limit_y45_2))x2=linspace(-5,5,5); y2=sin(x2); yy2=lagr1(x2,y2,xx); %4次插值chazhi_y45_4=lagr1(x2,y2,4.5);gd_wucha_limit_y45_4=abs(chazhi_y45_4-sin(4.5));disp(sprintf('%d %15.4f %15.4f',4,chazhi_y45_4,gd_wucha_limit_y45_4))x3=linspace(-5,5,9); y3=sin(x3); yy3=lagr1(x3,y3,xx); %8次插值chazhi_y45_8=lagr1(x3,y3,4.5);gd_wucha_limit_y45_8=abs(chazhi_y45_8-sin(4.5));disp(sprintf('%d %15.4f %15.4f',8,chazhi_y45_8,gd_wucha_limit_y45_8))plot(xx,y,'m-');hold on,pause,plot(x1,y1,'rs',xx,yy1,'r-'); hold on,pause,plot(x2,y2,'b*',xx,yy2,'b-'); hold on,pause,plot(x3,y3,'ko',xx,yy3,'k-'); hold on计算函数值function f=newton_li4(x) %x0为入的节点值,y0相应节点的函数值x0=[0.40,0.55,0.65,0.80,0.90,1.05];y0=[0.41075,0.57815,0.69675,0.88811,1.02652,1.25382];n=length(x0)%syms xfor i=1:nf(i,1)=y0(i);endhx=f(1,1);xx=(1.0);for k=2:nfor i=k:nf(i,k)=(f(i,k-1)-f(i-1,k-1))/(x0(i)-x0(i-k+1)); %构造差商表endxx=xx*(x-x0(k-1));hx=hx+f(k,k)*xx; %计算函数的近似值end%f=expand(hx)hxnewton(0.596)n =5hx =0.77193768707246ans =0.50000000000000 0 0 0 00.54770000000000 0.95400000000000 0 0 00.62450000000000 0.85333333333333 -0.71904761904761 0 00.67080000000000 0.77166666666666 -0.54444444444446 0.87301587301575 00.72800000000000 0.71500000000000 -0.40476190476189 0.60731538992422 -0.94893029675548Newton插值法%eg1_newton.mclear;clf;xx=linspace(-5,5,50); y=sin(xx); %作被插函数的图象disp('n x=4.5处的插值绝对误差的绝对值')x1=linspace(-5,5,3); y1=sin(x1); yy1=newton1(x1,y1,xx,2); %2次插值chazhi_y45_2=newton1(x1,y1,4.5,2);gd_wucha_limit_y45_2=abs(chazhi_y45_2-sin(4.5));disp(sprintf('%d %15.4f %15.4f',2,chazhi_y45_2,gd_wucha_limit_y45_2))x2=linspace(-5,5,5); y2=sin(x2); yy2=newton1(x2,y2,xx,4); %4次插值chazhi_y45_4=newton1(x2,y2,4.5,4);gd_wucha_limit_y45_4=abs(chazhi_y45_4-sin(4.5));disp(sprintf('%d %15.4f %15.4f',4,chazhi_y45_4,gd_wucha_limit_y45_4))x3=linspace(-5,5,9); y3=sin(x3); yy3=newton1(x3,y3,xx,8); %8次插值chazhi_y45_8=newton1(x3,y3,4.5,8);gd_wucha_limit_y45_8=abs(chazhi_y45_8-sin(4.5));disp(sprintf('%d %15.4f %15.4f',8,chazhi_y45_8,gd_wucha_limit_y45_8))plot(xx,y,'m-');hold on,pause,plot(x1,y1,'rs',xx,yy1,'r-'); hold on,pause,plot(x2,y2,'b*',xx,yy2,'b-'); hold on,pause,plot(x3,y3,'ko',xx,yy3,'k-'); hold on。

Lagrange插值

Lagrange插值

10
线性插值函数
f(x)
(x0 ,y0) (x1,y1) ,
P1(x)
x0
x1
可见
是过

两点的直线。 两点的直线。
11
抛物插值函数
p2(x) ≈ f(x)
f(x)
x0
x1
x2
因过三点的二次曲线为抛物线,故称为抛物插值。 因过三点的二次曲线为抛物线,故称为抛物插值。
12
N次插值函数
b]上对给定 1个不同结点 个不同结点: 设连续函数 y = f ( x ) 在[a, b]上对给定n + 1个不同结点: 分别取函数值 其中 试构造一个次数不超过n的插值多项式
n n
27
N次插值多项式7 次插值多项式7
n 设节点 a ≤ x0 < x1 < < xn ≤ b ,且 f 满足条件 f ∈C [a, b] ,
内存在, 内存在 f ( n + 1 )在[a , b]内存在 考察截断误差
Rn (x) = f (x) Ln (x)
罗尔定理 : 若 ( x ) 在[x0 ,
线性插值基函数 l0 ( x), l1 ( x) 满足下述条件
xi
l0 ( x) l1 ( x)
x0
1 0
x1
0 1
并且他们都是一次函数。 并且他们都是一次函数。 注意他们的特点对下面的推广很重要
18
一次Lagrange插值多项式(6) 一次Lagrange插值多项式(6)
我们称 l0 ( x ) 为点 x0 的一次插值基函数,( x ) 为点 的一次插值基函数, l1
P ( x) = a0 + a1x + a2 x2 ++ an xn n

常用插值算法程序

常用插值算法程序

if(t==s+1)return (d[t].y-d[s].y)/(d[t].x-d[s].x);elsereturn (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值(即n次插值):";//获得插值次数cin>>n;if(n<=count-1)// 插值次数不得大于count-1次break;elsesystem("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;//初始化pfor(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<<"请输入x[i],y[i]的组数,不得超过20组:";//要求用户输入数据组数cin>>count;if(count<=20)break;//检查输入的是否合法system("cls");}//获得各组数据for(int i=0;i<count;i++){cout<<"请输入第"<<i+1<<"组x的值:";cin>>d[i].x;cout<<"请输入第"<<i+1<<"组y的值:";cin>>d[i].y;system("cls");}cout<<"请输入x的值:";//获得变量x的值cin>>x;while(1){int choice=3;cout<<"请您选择使用哪种插值法计算:"<<endl;cout<<" (0):退出"<<endl;cout<<" (1):Lagrange"<<endl;cout<<" (2):Newton"<<endl;cout<<"输入你的选择:";cin>>choice;//取得用户的选择项if(choice==2){cout<<"你选择了牛顿插值计算方法,其结果为:";y=Newton(x,count);break;//调用相应的处理函数}if(choice==1){cout<<"你选择了拉格朗日插值计算方法,其结果为:";scanf("%f",&x[i]);}printf("\n");for(i=0;i<=n-1;i++){ printf("y[%d]:",i);scanf("%f",&y[i]);}printf("\n");printf("Input xx:");scanf("%f",&xx);yy=lagrange(x,y,xx,n);printf("x=%f,y=%f\n",xx,yy);getch();}(二)牛顿插值多项式#include <stdio.h>#include <conio.h>#include <alloc.h>void difference(float *x,float *y,int n){ float *f;int k,i;f=(float *)malloc(n*sizeof(float));for(k=1;k<=n;k++){ f[0]=y[k];for(i=0;i<k;i++)f[i+1]=(f[i]-y[i])/(x[k]-x[i]);y[k]=f[k];}return;}main(){ int i,n;float x[20],y[20],xx,yy;printf("Input n:");scanf("%d",&n);if(n>=20) {printf("Error! The value of n must in (0,20)."); getch(); return 1;} if(n<=0) {printf("Error! The value of n must in (0,20).");getch(); return 1;} for(i=0;i<=n-1;i++){ printf("x[%d]:",i);scanf("%f",&x[i]);}printf("\n");for(i=0;i<=n-1;i++){ printf("y[%d]:",i);scanf("%f",&y[i]);}printf("\n");difference(x,(float *)y,n);printf("Input xx:");scanf("%f",&xx);yy=y[20];for(i=n-1;i>=0;i--) yy=yy*(xx-x[i])+y[i];printf("NewtonInter(%f)=%f",xx,yy);getch();}(三)高斯列主元消去法:#include<stdio.h>#include <math.h>#define N 20int main(){ int n,i,j,k;int mi,tmp,mx;float a[N][N],b[N],x[N];printf("\nInput n:");scanf("%d",&n);if(n>N){ printf("The input n should in(0,N)!\n");getch();return 1;}if(n<=0){ printf("The input n should in(0,N)!\n");getch();return 1;}printf("Now input a(i,j),i,j=0...%d:\n",n-1); for(i=0;i<n;i++){ for(j=0;j<n;j++)scanf("%f",&a[i][j]);}printf("Now input b(i),i,j=0...%d:\n",n-1); for(i=0;i<n;i++)scanf("%f",&b[i]);for(i=0;i<n-2;i++){ for(j=i+1,mi=i,mx=fabs(a[i][j]);j<n-1;j++) if(fabs(a[j][i])>mx){ mi=j;mx=fabs(a[j][i]);}if(i<mi){ tmp=b[i];b[i]=b[mi];b[mi]=tmp;for(j=i;j<n;j++){ tmp=a[i][j];message();main(){float x[NUMBER]; /*´ËÊý×éÓÃÓÚ´æ·Å·½³Ì½â*/int r,k,i,j;char celect;clrscr();printf("\n\nUse Gauss.");printf("\n\n1.Jie please press Enter.");printf("\n\n2.Exit press Esc.");celect=getch();if(celect==Esc)exit(0);printf("\n\n input n=");scanf("%d",&n);printf(" \n\nInput matrix A and B:");for(i=1;i<=n;i++){printf("\n\nInput a%d1--a%d%d and b%d:",i,i,n,i);/*ʵÏÖ½«Ã¿Ò»ÐÐÖеÄϵÊýºÍÏòÁ¿Ò»´ÎÐÔÊäÈë£ÊýÖ®¼äÓÿոñ¸ñ¿ª£ÊäÍêºó»Ø³µÈ·¨*/for(j=1;j<=n+1;j++) /*½«¸Õ²ÅÊäÈëµÄÊý´æÈëÊý×é*/scanf("%f",&A[i][j]);}for(k=1;k<=n-1;k++){ark=max(k);if(ark==0) /*ÅÐÏ·½³ÌÊÇ·ñΪÏßÐÔ·½³Ì£¼´ÊÇ·ñºÏ·¨*/{printf("\n\nIt's wrong!");message();}else if(flag!=k)exchange(flag,k);for(i=k+1;i<=n;i++)for(j=k+1;j<=n+1;j++)A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];}x[n]=A[n][n+1]/A[n][n];for( k=n-1;k>=1;k--){float me=0;for(j=k+1;j<=n;j++)me=me+A[k][j]*x[j];}x[k]=(A[k][n+1]-me)/A[k][k];}for(i=1;i<=n;i++){printf(" \n\nx%d=%f",i,x[i]);}message();}exchange(int r,int k) /*½»»»Ðеľغ¯Êý*/ {int i;for(i=1;i<=n+1;i++)A[0][i]=A[r][i];for(i=1;i<=n+1;i++)A[r][i]=A[k][i];for(i=1;i<=n+1;i++)A[k][i]=A[0][i];}float max(int k) /*±ÈУϵÊý´óСµÄº¯Êý*/ {int i;float temp=0;for(i=k;i<=n;i++)if(fabs(A[i][k])>temp){temp=fabs(A[i][k]);flag=i;}return temp;}message() /*ʵÏֲ˵¥Ñ¡ÔñµÄº¯Êý*/{printf("\n\n Go on Enter ,Exit press Esc!");switch(getch()){case Enter: main();case Esc: exit(0);default:{printf("\n\nInput error!");message();}return ;}}}(五)牛顿迭代公式:#include<stdio.h>#include<math.h>#include<conio.h>#define N 100#define PS 1e-5#define TA 1e-5float Newton(float (*f)(float),float(*f1)(float),float x0 ) { float x1,d=0;int k=0;do{ x1= x0-f(x0)/f1(x0);if((k++>N)||(fabs(f1(x1))<PS)){ printf("\nFailed!");getch();exit();}d=(fabs(x1)<1?x1-x0:(x1-x0)/x1);x0=x1;printf("x(%d)=%f\n",k,x0);}while((fabs(d))>PS&&fabs(f(x1))>TA) ;return x1;}float f(float x){ return x*x*x+x*x-3*x-3; }float f1(float x){ return 3.0*x*x+2*x-3; }void main(){ float f(float);float f1(float);float x0,y0;printf("Input x0: ");scanf("%f",&x0);printf("x(0)=%f\n",x0);y0=Newton(f,f1,x0);printf("\nThe root is x=%f\n",y0);getch();}(六)牛顿-科特斯求积公式:#include<stdio.h>#include<math.h>int NC(a,h,n,r,f)float (*a)[];float h;int n,f;float *r;{ int nn,i;float ds;if(n>1000||n<2){ if (f)printf("\n Faild! Check if 1<n<1000!\n",n);return(-1);}if(n==2){ *r=0.5*((*a)[0]+(*a)[1])*(h);return(0);}if (n-4==0){ *r=0;*r=*r+0.375*(h)*((*a)[n-4]+3*(*a)[n-3]+3*(*a)[n-2]+(*a)[n-1]); return(0);}if(n/2-(n-1)/2<=0)nn=n;elsenn=n-3;ds=(*a)[0]-(*a)[nn-1];for(i=2;i<=nn;i=i+2)ds=ds+4*(*a)[i-1]+2*(*a)[i];*r=ds*(h)/3;if(n>nn)*r=*r+0.375*(h)*((*a)[n-4]+3*(*a)[n-3]+3*(*a)[n-2]+(*a)[n-1]); return(0);}main(){float h,r;int n,ntf,f;int i;float a[16];printf("Input the x[i](16):\n");for(i=0;i<=15;i++)scanf("%d",&a[i]);h=0.2;f=0;ntf=NC(a,h,n,&r,f);if(ntf==0)printf("\nR=%f\n",r);elseprintf("\n Wrong!Return code=%d\n",ntf);getch();}(七)雅克比迭代:#include <stdio.h>#include <math.h>#define N 20#define MAX 100#define e 0.00001int main(){ int n;int i,j,k;float t;float a[N][N],b[N][N],c[N],g[N],x[N],h[N];printf("\nInput dim of n:"); scanf("%d",&n);if(n>N){ printf("Faild! Check if 0<n<N!\n"); getch(); return 1; } if(n<=0){printf("Faild! Check if 0<n<N!\n"); getch(); return 1;} printf("Input a[i,j],i,j=0…%d:\n",n-1);for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%f",&a[i][j]);printf("Input c[i],i=0…%d:\n",n-1);for(i=0;i<n;i++)scanf("%f",&c[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){ b[i][j]=-a[i][j]/a[i][i]; g[i]=c[i]/a[i][i]; }for(i=0;i<MAX;i++){ for(j=0;j<n;j++)h[j]=g[j];{ for(k=0;k<n;k++){ if(j==k) continue; h[j]+=b[j][k]*x[k]; }}t=0;for(j=0;j<n;j++)if(t<fabs(h[j]-x[j])) t=fabs(h[j]-x[j]);printf("Input frequency:");scanf("%f",&x);r=qin(a,n,x);printf("Answer:%f",r);getch();}(九)幂法:#include<stdio.h>#include<math.h>#define N 100#define e 0.00001#define n 3float x[n]={0,0,1};float a[n][n]={{2,3,2},{10,3,4},{3,6,1}}; float y[n];main(){ int i,j,k;float xm,oxm;oxm=0;for(k=0;k<N;k++){ for(j=0;j<n;j++){ y[j]=0;for(i=0;i<n;i++)y[j]+=a[j][i]*x[i];}xm=0;for(j=0;j<n;j++)if(fabs(y[j])>xm) xm=fabs(y[j]);for(j=0;j<n;j++)y[j]/=xm;for(j=0;j<n;j++)x[j]=y[j];if(fabs(xm-oxm)<e){ printf("max:%f\n\n",xm);printf("v[i]:\n");for(k=0;k<n;k++) printf("%f\n",y[k]); break;}oxm=xm;}getch();}(十)高斯塞德尔:#include<math.h>#include<stdio.h>#define N 20#define M 99float a[N][N];float b[N];int main(){ int i,j,k,n;float sum,no,d,s,x[N];printf("\nInput dim of n:");scanf("%d",&n);if(n>N){ printf("Faild! Check if 0<n<N!\n "); getch();return 1;}if(n<=0){ printf("Faild! Check if 0<n<N!\n ");getch();return 1;} printf("Input a[i,j],i,j=0…%d:\n",n-1);for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%f",&a[i][j]);printf("Input b[i],i=0…%d:\n",n-1);for(i=0;i<n;i++) scanf("%f",&b[i]);for(i=0;i<n;i++) x[i]=0;k=0;printf("\nk=%dx=",k);for(i=0;i<n;i++) printf("%12.8f",x[i]);do{ k++;if(k>M){printf("\nError!\n”);getch();}break;}no=0.0;for(i=0;i<n;i++){ s=x[i];sum=0.0;for(j=0;j<n;j++)if (j!=i) sum=sum+a[i][j]*x[j];x[i]=(b[i]-sum)/a[i][i];d=fabs(x[i]-s);if (no<d) no=d;}printf("\nk=%2dx=",k);for(i=0;i<n;i++) printf("%f",x[i]);}。

数值分析Lagrange插值多项式

数值分析Lagrange插值多项式

其余的将M值及f2[x_]修改即可,得到插值函数修改分f3[x_]即可。
1 n+1 !
f
n+1
(εx )
n i=0(x
− xi )
其中 εx 为区间内一点
但 Lagrange 插值法没有承接性,可以进行改良。
【Lagrange 插值算法描述】 1. 对给定函数选取其区间上的一系列节点并计算其函数值,得到点列 (x0 , y0 ),…,( xn , yn ); 2. 通过上述点列构造 Lagrange 基函数li x = 出 Lagrange 插值函数Ln x =
【实验】 通过 Mathematica 编写程序得到如下结果: N=5: 1. 取xi = 5 −
10 N
i , i = 0,1, … ,N 得到:
(1) 插值点为:
(2) 由上述插值点构造出 Lagrange 插值函数:
(3)由题目所给出的条件计算误差得到:
插值函数与原函数的图像为:
其中蓝色为原函数图像,红色为插值函数图像,可以看出在 0 点误差最大,与 我们的计算结果相吻合。
n k=0 yk lk (x); n x −x i j=0 x −x i j j ≠i
,并由该基函数构造
3. 由多项式插值误差定理来估计其误差: f x −p x =
1 n+1 !
f
n+1
(εx )
n i=0(x
− xi )
其中 εx 为区间内一点
但此题有自己的估计误差的要求,则我们依照题意估计误差。
n x −x i j=0 x −x i j j ≠i
,
li x = δij
n k=0 yk lk (x)
来构造 Lagrange 插值多项式: Ln x =

插值法

插值法

第一节 Lagrange插值
一、问题提出
设 x0 , x1 xn 为给定的节点,yi f ( xi ),i 0,1,n
为相应的函数值,求一个次数不超过 n 的多项式 Pn (x), 使其满足
Pn ( xi ) yi,
i 0,1,n .
这类问题称为插值问题。 f ( x) 称为被插值函数,Pn ( x) 称 为插值函数, x0 , x1 xn 称为插值节点
差商
二阶差商
三阶差商 四阶差商
x0 f ( x0 ) x1 f ( x1 )
x2 f ( x2 )
f [ x0 , x1 ]
f [ x1 , x2 ]
f [ x0 , x1 , x2 ]
f [ x0 , x1 , x2 , x3 ]
1 2 3 4
0 1 2 3 4
x3
f ( x3 ) f [ x2 , x3 ] f [ x1 , x2 , x3 ]
评价
优点: Lagrange基函数容易构造,结构紧凑,便于理 论研究. 缺点: 当增加或减少插值结点时,基函数需要重新 构造,不便于实际的计算使用
第二节 Newton插值
一、差商定义及性质
1.差商定义 f ( x ) f ( x ) i j f [ xi , x j ] , i j 为 f ( x) 在 xi , x j 称 两点处的一阶差商.xi x j
( n1) ( ) f ( n1) ( )
f ( x) Pn ( x) (n 1)! 0 ( x)
由此得
. f ( n1) ( ) Rn ( x) f ( x) Pn ( x) n1 ( x) (n 1)! 定理得证.

拉格朗日(Lagrange)插值

拉格朗日(Lagrange)插值
x) 每个 li 有 n 个根 x0 … xi … xn, 是n次多项式。
li ( x) = Ci ( x x0 )...(x xi )...(x xn ) = Ci ( x x j ) ji j =0 1 li ( xi ) = 1 Ci = j i ( xi xj )
l ( x) y
i =0 i
1
i
l0(x)
l1(x)
称为拉格朗日插值基函数 , 满足条件 li(xj)=ij /* Kronecker Delta */
n1
希望找到li(x),i = 0, …, n 使得 li(xj)=ij ;然后令
Pn ( x ) =
l (x) y
i=0 i
n
i
,则显然有Pn(xi) = yi 。
§4.2 拉格朗日(Lagrange)插值
n 求 n 次多项式 Pn ( x) = a0 a1 x an x 使得
Pn ( x i ) = y i ,
i = 0 , ... , n
条件:无重合节点,即 i j
xi x j
一. 插值多项式的存在唯一性 定理4.2.1 : 在 n 1 个互异节点 xk 处满足插值条件 Pn ( xk ) = yk
n
f
( n 1)
( n 1 ) ( x0 ) = = ( xn ) = 0( n 1 ) ( x ) Ln ( x ) K ( x )( n 1) ! = Rn ( x ) K ( x ) ( n 1) ! ( n) 存在 (a, b) 使得 ( ) = 0 ( n 1 ) n ( n 1 ) f ( ) x f ( x) Rn ( x ) = ( x xi ) = K ( x) (n 1) ! i =0 ( n 1) !

数值分析实验报告Lagrange插值法

数值分析实验报告Lagrange插值法
>> X=[0.50 0.70;-0.693147 -0.356675]; >> x=0.60; >> format long >> f=Lagrange00
2) 选取插值节点为 x1 0.50,x 2 0.70, x 3 0.80 作抛物线插值
运行结果和总结 运行结果 例一: 设 y ln x 且给出函数表 x lnx 0.40 -0.916291 0.50 -0.693147 0.70 -0.356675 0.80 -0.223144
试计算 f(0.6)=ln0.6 近似值。 1)选取插值节点为 x1 0.50,x 2 0.70 作线性插值
>> X=[0.50 0.70 0.80;-0.693147 -0.356675 -0.223144]; >> x=0.60; >> format long >> f=Lagrange(X,x) f= -0.513342666666667
总结 ( 1 )线性插值与抛物线插值都是 Lagrange 插值的特殊形式,两者可以用 Lagrange 插值算法进行计算; (2)并不是给出的插值节点越多越精确,要看步长的大小。 指导教师意见
山东师范大学数学科学学院实验报告
实验课程: 数值分析引论 实验项目: 拉格朗日插值多项式
姓名: XXX 学号: 2015XXXXXX2 班级: XXX 班 专业: 数学与应用数学 指导教师: 实验目的 1、Lagrange 插值法的 matlab 实现; 2、用 Lagrange 插值程序进行插值计算。 实验内容: 问题分析和算法设计 Lagrange 插值 已知 y f(x )函数表(xi ,y i ) ,(a x 0 xi x n b ),给定 xx [a,b ] 及 表示选取 x i , ,x i n 作为插值节点作 n0 次插值多项式 Ln (xx ), 计算 f(xx )近 i0、n0 ,

Runge现象的演示(内含L和N插值多项式)

Runge现象的演示(内含L和N插值多项式)

实验4_2 Runge现象的演示(内含L 和N 插值多项式)【实验目的】1、了解并掌握matlab软件的基本应用方法;2、初步了解matlab中部分函数,熟悉循环语句的使用;3、通过上机进一步掌握Lagrange插值多项式的建立。

【实验内容】(1)【实验一】 Lagrange 插值多项式(1)首先把本程序另存为一个不同的文件名;(2)把下面程序中开头的注释去掉,再把问号填写正确;.(2)【实验二】Newton 插值多项式对于Newton插值多项式,可以不计算差分表(矩阵),而直接计算差分表中的对角元(实际上只用到这些值),这样就能大大减少储存空间,P79 图4-5 就是这种方法, 请你证明图中y(k)就是差分表的对角元,并注意后半部分就是Horner 算法. 按此法编程【解】:手工分析怎样求解这题。

【计算机求解】:怎样设计程序?流程图?变量说明?能否将某算法设计成具有形式参数的函数形式?【实验一】Lagrange 插值多项式【程序如下】:function y=lagrange(X,Y,x);n=length(X);m=length(x);for i=1:mz=x(i);s=0.0;for k=1:nt=1.0;for j=1:nif j~=kt=t*(z-X(j))/(X(k)-X(j));endends=t*Y(k)+s;endy(i)=s;endf = inline('1./(1+25*x.^2)');n = 30;X = linspace(-1,1,n);Y = f(X);x = -1 : 0.01 : 1;y=lagrange(X,Y,x);plot(x,f(x),'r',X,Y,'o',x,y,'b')title('Runge现象')legend('y=1/(1+25*x^2)','插值点','等分的30次插值多项式',0) 【运行结果如下】将n改为50次,得到下面图像:【结果分析】通过实验,可以更直观的将插值的结果展现出来,同时还能发现格式插值的弊端。

拉格朗日(Lagrange)插值

拉格朗日(Lagrange)插值
n
( n 1) !
i0
( ( 1 0 (x Rolle’s f ( x ) Ln (若)至少个有 n+1根 ( x 0 ) Rnx)x )K ( x),则 xi ) R n ( x ) Theorem: x ( x ) 充分光滑, i 0 n 存在 ( x 0 , x 1 ) 使得 ( ) 0 。 任意固定 x xi (i = 0, 求导 考察 ( t ) Rn ( t ) K ( x ) ( t x i ) 注意这里是对 t …, n), 0 ( x 0 , x 1 ), 1 i ( 0 1 , x 2 ) x 推广:若 ( x 0 ) ( x 1 ) ( x 2 ) 0 (x)有 n+2 个不同的根x0) …0xn x ( , ( n) 1 ) ( x ) 0(, ) ( a , b ) x 0 使得 ( 0 ) ( 1 0 1 使得
于是 : L 2 ( x )
再利用 l 0 ( x 0 ) 1 C
1 ( x 0 x 1 )( x 0 x 2 )
( x x0 )( x x1 ) l2 ( x ) ( x2 x0 )( x2 x1 )
l ( x) y
i i0
2
i
l 0 ( x ) y 0 l1 ( x ) y1 l 2 ( x ) y 2
i0 n
[证明]上式的左端为插值基函数的线性组合,其组合 系数均为1。显然,函数f(x) 1在这n +1个节点取值 为1,即yi=f (xi) 1 (i=0,1,…,n), 它的n次Lagrange插值多项式为:
Ln ( x ) l i ( x ) y i l i ( x )

lagrange插值法

lagrange插值法

lagrange 插值法实验基本原理: lagrange 插值法是用来解决离散点的插值问题。

若给定两个插值点),(),,(1100y x y x 其10x x ≠,在公式中取1=n ,则La g r a n g e 插值多项式为:)()()()()()(001010010110101x x x x y y y x x x x y x x x x y x p ---+=--+--=是经过),(),,(1100y x y x 的一条直线,故此法称为线性插值法。

2、若函数给定三个插值点 2,1,0),,(=i y x i i ,,其中i x 互不相等,在公式中取1=n ,则Lagrange 插值多项式为: ))(())(())(())(())(())(()(1202102210120120102102x x x x x x x x y x x x x x x x x y x x x x x x x x y x p ----+----+----=是一个二次函数,若2,1,0),,(=i y x i i 三点不在一条直线上,则该曲线是一条抛物线,这种插值法称为二次插值或抛物插值。

为了解决这个问题,我们为此构造了这个矩阵⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛----+---.........))(())(()())((12010212010212010x x x x x x x x x x x x x x x x 就可以找到相应系数。

实验结果分析:在应用拉格朗日插值法时应注意以下几个问题:1、在能获得原始资料时应尽量获取原始资料, 不能盲目地用组数据代入公式来估计未知数据。

2、在利用拉格朗日多项式进行插值估计时, 要求所研究范围的值的变化不受特殊或偶照因素的影响, 即的值是在正常条件下的。

3、如果有两组值(i x ,iy ),(j x ,j y ) 的i x =j x ;则这两组值只能取一组代入多项式计算, 否则便会出现 i y 与j y 的项分母为零的情况这种情况对于这种情况, 用哪组值代入多项式估计更好, 往往不易确定。

lagrange插值分段线性插值matlab代码(最新整理)

lagrange插值分段线性插值matlab代码(最新整理)
0.8333 -5.0000 -3.0000 15.0000 fenmu =
2 p=
10 fenmu =
2 p=
1 -1 0 fenmu =
-2 p=
1 -4 3 c=
0.8333 -5.0000 -3.0000 15.0000 0.5000 -2.0000 fenmu =
3 p=
10 fenmu =
我更喜欢第一种,用 spline 的,这个能将之间画出弧度,而 pchip 更像是直接用线段将点 依次连接得到的。 使用的是 splinetx。
解: (a) 首先保存一个 M 文件: n=3; xishu=2/(n-1); x=-1:xishu:1; y=1./(1+25.*x.*x); for k=1:n
0.1660 -0.4964 -0.4191 0.2342 -0.4694 0.6488 0.9653 0.4605 -0.3122 0.1681
-0.7845 0.8126 0.7593 0.6355 -0.4785 0.1887 -0.9550 -0.1495 -0.3746 -0.6770
-0.6425 -0.1542 -0.8115 0.1970 -0.0582 0.3919 0.3998 0.2771 -0.9328 -0.8624
.
第二种做法,用 pchip,共 52 个点,全部有效 首先保存一个 M 文件: figure('position',get(0,'screensize')) axes('position',[0 0 1 1]) [x,y] = ginput; 然后在 command window 里输入以下内容: n = length(x); s = (1:n)'; t = (1:.05:n)'; u = pchip (s,x,t); v = pchip (s,y,t); clf reset plot(x,y,'.',u,v,'-');

Lagrange插值法.ppt

Lagrange插值法.ppt

第1列是病人编号,第2列是4种疗法的代码:
1 = 600mg zidovudine(齐多夫定) 与400mg
didanosine(去羟肌苷)按月轮换使用;
2 = 600mg zidovudine 加2.25mg zalcitabine(双脱
氧胞苷 );
3 = 600mg zidovudine 加400mg didanosine;
4 = 600mg zidovudine 加400mg didanosine 加
400mg nevirapine(奈韦拉平 )。
第3列是病人年龄,第4列是测试CD4的时刻(周),第5列是
测得的CD4,取值log(CD4+1).
ID 疗法 年龄
时间 Log(CD4 count+1)
1 2 36.4271 0
第四章 插值与拟合
1/46
引例及问题综述
在生产和实验中,函数f (x)无表达式, 只知道f(x) 在一些给定点的函数值(或其导数值) ,或者其表达式 复杂不便于计算,此时我们希望建立一个简单而又便 于计算的函数(x),使其近似的代替f(x).
求近似函数(x)的方法一般分为两类: 一类是插值, 另一类是拟合.
CD40 0
第一组
20
40
时刻(周)
第二组
CD4(/mm3)
400 300 200 100
0 0
20
40
时刻(周)
计算方法四①
CD4浓度(/mm3)
60
400 300 200 100
0 0
60
8/46
第三组
20
40
60
时刻(周)
CD4/HIV
CD4/HIV

要求编写n次Lagrange插值函数functionylagrange

要求编写n次Lagrange插值函数functionylagrange

1、 要求:编写n 次Lagrange 插值函数,function y=lagrange(x, x1, y1)其中x1,y1为插值节点和节点上的函数值,x 为插值点,y = p(x)具体以x1=[1,2,6,10],y1=[3,2,8,9]; x =3计算;以x1(1):0.01:x1(n)为x 坐标, 调用函数Lagrange 画出插值函数。

公式1()()n n i i i P x l x y ==∑ (: ())i i j i j l n l x δ=次, 111111()()()()(), 1,,()()()()i i n i i i i i i i n x x x x x x x x l x i n x x x x x x x x -+-+----==----可能用到的函数语句prod sumA=[1 2 3 4 5], A(2)=[ ]A=[1 3 4 5]在MATLAB 中,可以直接调用函数 POL YFIT 和POL YV AL 进行多项式插值。

调用方式为>> x1=[1,2,6,10];y1=[3,2,8,9];>> P = polyfit(x1,y1,3);>> Y = POLYV AL(P,X);>> plot(x1,y1,'ro',X,Y)1)x1=-5:2:5, y1=1/(1+25x 2); 试用用5次多项式做插值函数2)x1=-5:5, y1=1/(1+25x 2); 试用用11次多项式做插值函数以-5:0.02:5为x 轴画图。

请用help 了解 POL YFIT ,POL YV AL 的用法如果需要细致了解编程,可以在命令窗直接键入edit POL YFIT .mlagrange.m%本程序为Lagrange 插值,其中x1,y1%为插值节点和节点上的函数值,x 为插值点,输出为插值点的函数值,function u=lagrange(x1,y1,x)n=length(x1);L=[]; % L 向量用来存放插值基函数for i=1:nt=x1;t(i)=[];L(i)=prod((x-t)./(x1(i)-t));endu=sum(L.*y1);lagrange1.m%本程序为Lagrange1插值,其中x,y%为插值节点和节点上的函数值,输出插值点xx的函数值,%xx可以是向量。

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

在Matlab中,可以编写如下程序来利用Lagrange插值公式进行计算:
function f=Lagrange(x,fx,inx)
n=length(x);m=length(inx);
for i=1:m;
z=inx(i);
s=0.0;
for k=1:n
p=1.0;
for j=1:n
if j~=k
p=p*(z-x(j))/(x(k)-x(j));
end
end
s=p*fx(k)+s;
end
f(i)=s;
end
plot(x,fx,'O',inx,f)
x=[1:12]
fx=[12 234 34 -1 34 2 5 23 34 9 45 23]
xi=[1:0.2:12]
Lagrange(x,fx,xi)
得出结果:
12.0000 -60.5937 18.2765 124.9778 202.5952 234.0000 223.3757 184.1249 131.4738 78.4253 34.0000 2.9467 -13.6885 -17.5810 -12.0379 -1.0000 11.7556 23.1624 31.1611 34.7730 34.0000 29.6054 22.8332 15.1153 7.8099 2.0000 -1.6307 -2.8397 -1.7907 1.0404 5.0000 9.4024 13.6643 17.4033 20.4834 23.0000 25.2037 27.3769 29.6858 32.0400 34.0000 34.7742 33.3426 28.7320 20.4439 9.0000 -3.4848 -12.8605 -12.8873
4.0592 4
5.0000 112.3788 197.1817 267.9699 254.3439 23.0000
拉格朗日插值法理论介绍
对于给定的若n+1个点,对应于它们的次数不超过n的拉格朗日多项式只有一个。

如果计入次数更高的多项式,则有无穷个,因为所有与相差的多项式都满足条件。

定义
对某个多项式函数,已知有给定的k + 1个取值点:
其中x j对应着自变量的位置,而y j对应着函数在这个位置的取值。

假设任意两个不同的x j都互不相同,那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为:
其中每个为拉格朗日基本多项式(或称插值基函数),其表达式为:
拉格朗日基本多项式的特点是在x j上取值为1,在其它的点
上取值为0。

范例:
假设有某个多项式函数f,已知它在三个点上的取值为:
▪f(4) = 10
▪f(5) = 5.25
▪f(6) = 1
要求f(18)的值。

首先写出每个拉格朗日基本多项式:
然后应用拉格朗日插值法,就可以得到p的表达式(p为函数f的插值函数):
此时代入数值就可以求出所需之值:。

优缺点:
拉格朗日插值法的公式结构整齐紧凑,在理论分析中十分方便,然而在计算中,当插值点增加或减少一个时,所对应的基本多项式就需要全部重新计算,于是整个公式都会变化,非常繁琐[5]。

这时可以用重心拉格朗日插值法或牛顿插值法来代替。

此外,当插值点比较多的时候,拉格朗日插值多项式的次数可能会很高,因此具有数值不稳定的特点,也就是说尽管在已知的几个点取到给定的数值,但在附近却会和“实际上”的值之间有很大的偏差(如右下图)[6]。

这类现象也被称为龙格现象,解决的办法是分段用较低次数的插值多项式。

相关文档
最新文档