拉格朗日插值、牛顿插值的matlab代码

合集下载

例题matlab拉格朗日插值

例题matlab拉格朗日插值

例题matlab拉格朗日插值
拉格朗日插值是一种常用的数值插值方法,可以用于近似给定数据点的函数。

在MATLAB中,可以使用interp1函数来实现拉格朗日插值。

以下是一个使用拉格朗日插值的例子:
假设有一组数据点,x为自变量,y为因变量,如下:
x = [1, 3, 4, 6];
y = [4, 2, 5, 1];
要在x=2和x=5之间进行插值,可以使用interp1函数来进行插值计算。

代码如下:
x_interp = [2, 5]; % 需要插值的x值
y_interp = interp1(x, y, x_interp, 'linear', 'extrap'); % 使用拉格朗日插值进行插值计算,'linear'表示线性插值方法,'extrap'表示在区间外进行外插值
运行上述代码后,可以得到插值的结果y_interp,即在x=2和x=5处的插值结果。

注意,interp1函数还有其他插值方法可选,如二次插值、三次插值等,可以根据具体的需求进行选择。

希望对你有帮助!。

拉格朗日插值和牛顿插值matlab

拉格朗日插值和牛顿插值matlab

拉格朗⽇插值和⽜顿插值matlab1. 已知函数在下列各点的值为0.20.40.60.8 1.00.980.920.810.640.38⽤插值法对数据进⾏拟合,要求给出Lagrange插值多项式和Newton插值多项式的表达式,并计算插值多项式在点的值。

程序:x=[0.2 0.4 0.6 0.8 1.0];y=[0.98 0.92 0.81 0.64 0.38];x0=[0.2 0.28 0.44 0.76 1 1.08];[f,f0]=Lagrange(x,y,x0)function [f,f0] = Lagrange(x,y,x0)%求已知数据点的Lagrange插值多项式f,并计算插值多项式f在数据点x0的函数值f0syms t;n = length(x);f = 0.0;for i = 1:nl = y(i);for j = 1:i-1l = l*(t-x(j))/(x(i)-x(j));end;for j = i+1:nl = l*(t-x(j))/(x(i)-x(j));end;f = f + l;simplify(f);if(i==n)f0 = subs(f,'t',x0);f = collect(f);f = vpa(f,6);endend结果:>> Untitled3f =- 0.520833*t^4 + 0.833333*t^3 - 1.10417*t^2 + 0.191667*t + 0.98f0 =[ 49/50, 60137/62500, 56377/62500, 42497/62500, 19/50, 15017/62500]⽜顿:%y为对应x的值,A为差商表,C为多项式系数,L为多项式%X为给定节点,Y为节点值,x为待求节点function[y,A,C,L] = newton(X,Y,x,M)n = length(X);m = length(x);for t = 1 : mz = x(t);A = zeros(n,n);A(:,1) = Y';s = 0.0; p = 1.0; q1 = 1.0; c1 = 1.0;for j = 2 : nfor i = j : nA(i,j) = (A(i,j-1) - A(i-1,j-1))/(X(i)-X(i-j+1));endq1 = abs(q1*(z-X(j-1)));c1 = c1 * j;endC = A(n, n); q1 = abs(q1*(z-X(n)));for k = (n-1):-1:1C = conv(C, poly(X(k)));d = length(C);C(d) = C(d) + A(k,k);endy(t) = polyval(C,z);endL = poly2sym(C);x=[0.2 0.4 0.6 0.8 1.0];y=[0.98 0.92 0.81 0.64 0.38];x0=[0.2 0.28 0.44 0.76 1 1.08];m=1;[y,A,C,L]=newton(x,y,x0,m)结果:y =0.9800 0.9622 0.9020 0.6800 0.3800 0.2403A =0.9800 0 0 0 00.9200 -0.3000 0 0 00.8100 -0.5500 -0.6250 0 00.6400 -0.8500 -0.7500 -0.2083 00.3800 -1.3000 -1.1250 -0.6250 -0.5208C =-0.5208 0.8333 -1.1042 0.1917 0.9800L =- (25*x^4)/48 + (5*x^3)/6 - (53*x^2)/48 + (23*x)/120 + 49/502. 在区间上分别取,⽤两组等距节点对Runge函数作多项式插值(Lagrange插值和Newton插值均可),要求对每个值,分别画出插值多项式和函数的曲线。

用matlab编写拉格朗日插值算法的程序

用matlab编写拉格朗日插值算法的程序

用matlab编写拉格朗日插值算法的程序10[ 标签:matlab,插值算法,程序 ]用matlab编写拉格朗日插值算法的程序,并以下面给出的函数表为数据基础,在整个插值区间上采用拉格朗日插值法计算f(0.6),写出程序源代码,输出计算结果x -2.15 -1.00 0.01 1.02 2.03 3.25y 17.03 7.24 1.05 2.03 17.06 23.05匿名回答:1 人气:6 解决时间:2011-05-24 19:58满意答案好评率:83%做了一个测试,希望有所帮助。

代码:% 用matlab编写拉格朗日插值算法的程序,并以下面给出的函数表为数据基础,% 在整个插值区间上采用拉格朗日插值法计算f(0.6),写出程序源代码,输出计算结果% x -2.15 -1.00 0.01 1.02 2.03 3.25% y 17.03 7.24 1.05 2.03 17.06 23.05function main()clc;x = [-2.15 -1.00 0.01 1.02 2.03 3.25]; y = [17.03 7.24 1.05 2.03 17.06 23.05 ]; x0 = 0.6;f = Language(x,y,x0)function f = Language(x,y,x0)%求已知数据点的拉格朗日插值多项式%已知数据点的x坐标向量: x%已知数据点的y坐标向量: y%插值点的x坐标: x0%求得的拉格朗日插值多项式或在x0处的插值: f syms t l;if(length(x) == length(y))n = length(x);elsedisp('x和y的维数不相等!');return; %检错endh=sym(0);for (i=1:n)l=sym(y(i));for(j=1:i-1)l=l*(t-x(j))/(x(i)-x(j));end;for(j=i+1:n)l=l*(t-x(j))/(x(i)-x(j));end;h=h+l;endsimplify(h);if(nargin == 3)f = subs (h,'t',x0); %计算插值点的函数值elsef=collect(h);f = vpa(f,6); %将插值多项式的系数化成6位精度的小数end结果:f =0.0201>>如何用MATLAB编写的拉格朗日插值算法的程序、二阶龙格-库塔方法的程序和SOR迭代法的程序,要能运行的∮初夏戀雨¢回答:2 人气:29 解决时间:2009-12-08 19:04满意答案好评率:100%拉格朗日function y=lagrange(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;endSOR迭代法的Matlab程序function [x]=SOR_iterative(A,b)% 用SOR迭代求解线性方程组,矩阵A是方阵x0=zeros(1,length(b)); % 赋初值tol=10^(-2); % 给定误差界N=1000; % 给定最大迭代次数[n,n]=size(A); % 确定矩阵A的阶w=1; % 给定松弛因子k=1;% 迭代过程while k<=Nx(1)=(b(1)-A(1,2:n)*x0(2:n)')/A(1,1);for i=2:nx(i)=(1-w)*x0(i)+w*(b(i)-A(i,1:i-1)*x(1:i-1)'-A(i,i+1:n)*x0(i+1:n)')/A(i,i); endif max(abs(x-x0))<=tolfid = fopen('SOR_iter_result.txt', 'wt');fprintf(fid,'\n********用SOR迭代求解线性方程组的输出结果********\n\n'); fprintf(fid,'迭代次数: %d次\n\n',k);fprintf(fid,'x的值\n\n');fprintf(fid, '%12.8f \n', x);break;endk=k+1;x0=x;endif k==N+1fid = fopen('SOR_iter_result.txt', 'wt');fprintf(fid,'\n********用SOR迭代求解线性方程组的输出结果********\n\n'); fprintf(fid,'迭代次数: %d次\n\n',k);fprintf(fid,'超过最大迭代次数,求解失败!');fclose(fid);endMatlab中龙格-库塔(Runge-Kutta)方法原理及实现龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法。

拉格朗日插值、牛顿插值的matlab代码

拉格朗日插值、牛顿插值的matlab代码

实验五多项式插值逼近信息与计算科学金融崔振威201002034031一、实验目的:拉格朗日插值和牛顿插值的数值实现二、实验内容:p171.1、p178.1、龙格现象数值实现三、实验要求:1、根据所给题目构造相应的插值多项式,2、编程实现两类插值多项式的计算3、试分析多项式插值造成龙格现象的原因主程序1、拉格朗日function [c,l]=lagran(x,y)%c为多项式函数输出的系数%l为矩阵的系数多项式%x为横坐标上的坐标向量%y为纵坐标上的坐标向量w=length(x);n=w-1;l=zeros(w,w);for k=1:n+1v=1;for j=1:n+1if k~=jv=conv(v,poly(x(j)))/(x(k)-x(j)) %对多项式做卷积运算endendl(k,:)=v;endc=y*l;牛顿插值多项式主程序function [p2,z]=newTon(x,y,t)%输入参数中x,y为元素个数相等的向量%t为插入的定点%p2为所求得的牛顿插值多项式%z为利用多项式所得的t的函数值。

n=length(x);chaS(1)=y(1);for i=2:nx1=x;y1=y;x1(i+1:n)=[];y1(i+1:n)=[];n1=length(x1);s1=0;for j=1:n1t1=1;for k=1:n1if k==j %如果相等则跳出循环continue;elset1=t1*(x1(j)-x1(k));endends1=s1+y1(j)/t1;endchaS(i)=s1;endb(1,:)=[zeros(1,n-1) chaS(1)];cl=cell(1,n-1); %cell定义了一个矩阵for i=2:nu1=1;for j=1:i-1u1=conv(u1,[1 -x(j)]); %conv()用于多项式乘法、矩阵乘法cl{i-1}=u1;endcl{i-1}=chaS(i)*cl{i-1};b(i,:)=[zeros(1,n-i),cl{i-1}];endp2=b(1,:);for j=2:np2=p2+b(j,:);endif length(t)==1rm=0;for i=1:nrm=rm+p2(i)*t^(n-i);endz=rm;elsek1=length(t);rm=zeros(1,k1);for j=1:k1for i=1:nrm(j)=rm(j)+p2(i)*t(j)^(n-i);endz=rm;endendplot(t,z,'y',x,y,'*r') %输出牛顿插值多项式的函数图p171.1(a)、f(x)=e x解:在matlab窗口中输入:>> x=[0 0.2 0.4 0.6 0.8 1];>> y=[exp(0) exp(0.2) exp(0.4) exp(0.6) exp(0.8) exp(1)]y =1.0000 1.2214 1.4918 1.82212.2255 2.7183>> [c,l]=lagran(x,y)可以得出输出结果为:c =0.0139 0.0349 0.1704 0.4991 1.0001 1.0000l =-26.0417 78.1250 -88.5417 46.8750 -11.4167 1.0000130.2083 -364.5833 369.7917 -160.4167 25.0000 0-260.4167 677.0833 -614.5833 222.9167 -25.0000 0260.4167 -625.0000 510.4167 -162.5000 16.6667 0-130.2083 286.4583 -213.5417 63.5417 -6.2500 026.0417 -52.0833 36.4583 -10.4167 1.0000 0由输出结果可以的出:P(x)的系数分别为:a0=0.0139 a1=0.0349 a2=0.1704 a3=0.4991 a4=1.0001 a5=1.0000(b)、f(x)=sin(x)解:在matlab窗口中输入:>> x=[0 0.2 0.4 0.6 0.8 1];>> y=[sin(0) sin(0.2) sin(0.4) sin(0.6) sin(0.8) sin(1)];>> [c,l]=lagran(x,y)可以得出输出结果为:c =0.0073 0.0016 -0.1676 0.0002 1.0000 0l =-26.0417 78.1250 -88.5417 46.8750 -11.4167 1.0000130.2083 -364.5833 369.7917 -160.4167 25.0000 0-260.4167 677.0833 -614.5833 222.9167 -25.0000 0260.4167 -625.0000 510.4167 -162.5000 16.6667 0-130.2083 286.4583 -213.5417 63.5417 -6.2500 026.0417 -52.0833 36.4583 -10.4167 1.0000 0由输出结果可以的出:P(x)的系数分别为:a0=0.0073 a1=0.0016 a2=-0.1676 a3=0.0002 a4=1.0000 a5=0(c)、f(x)=(x+1)x+1解:在matlab窗口中输入:>> x=[0 0.2 0.4 0.6 0.8 1];>> y=[1 1.2^1.2 1.4^1.4 1.6^1.6 1.8^1.8 2^2];>> [c,l]=lagran(x,y)可以得出输出结果为:c =0.3945 -0.0717 0.7304 0.9415 1.0052 1.0000l =-26.0417 78.1250 -88.5417 46.8750 -11.4167 1.0000130.2083 -364.5833 369.7917 -160.4167 25.0000 0-260.4167 677.0833 -614.5833 222.9167 -25.0000 0260.4167 -625.0000 510.4167 -162.5000 16.6667 0-130.2083 286.4583 -213.5417 63.5417 -6.2500 026.0417 -52.0833 36.4583 -10.4167 1.0000 0由输出结果可以的出:P(x)的系数分别为:a0=0.3945 a1=-0.0717 a2=0.7304 a3=0.9415 a4=1.0052 a5=1.0000P178.12、a0=5 a1=-2 a2=0.5 a3=-0.1 a4=0.003x0=0 x1=1 x2=2 x3=3 c=2.5解:在matlab窗口中输入:>> x=[5 -2 0.5 -0.1];>> y=[0 1 2 3];>> t=0:0.1:2.5;>> [u,v]=newTon(x,y,t)可得出输出结果:u =0.1896 -0.7843 -1.3928 2.8688v =2.8688 2.7218 2.5603 2.3855 2.1983 2.0000 1.7917 1.5745 1.3497 1.1182 0.8813 0.6401 0.3957 0.1493 -0.0980 -0.3451 -0.5908 -0.8340 -1.0735 -1.3082 -1.5370 -1.7588 -1.9723 -2.1765 -2.3702 -2.5523由此可以求出牛顿多项式为:f(x)=0.1896x^3--0.7843^x2--1.3928x+2.8688输出的图为:结果分析:利用牛顿插值多项式的函数,通过调用函数可以求得牛顿多项式与给定的点的值,并通过matlab做出函数图像。

拉格朗日插值法与牛顿插值法

拉格朗日插值法与牛顿插值法
}
printf("请输入y\n");
for(i=0;i<N;i++)
{
scanf("%f",&y[i]);
}
printf("请输入要计算的点\n");
scanf("%f",&n);
s=y[0];
p=1;
for(i=1;i<N;i++)
{
for(j=1;j<N-i;j++)
{
y[j-1]=(y[j]-y[j-1])/(x[j+i-1]-x[j-1]);
}
p=p*(n-x[i-1]);
s=s+y[0]*p;
}
printf("%f\n",s);
}
变成中关键是要计算出插商,才能使计算结果准确无误。
程序代码
#include <stdio.h>
#define N 3
void main()
{
float x[N],y[N],s,p,n;
int i,j;
printf("请输入x\n");
for(i=0;i<N;i++)
{
scanf("%f",&x[i]);
程序代码:
#include <stdio.h>
#define N 3
void main()
{
float x[N],y[N],l[N],m,s,t,n;
int i,j,k;
printf("请输入x\n");
for(i=0;i<N;i++)

MATLAB作业拉格朗日三阶样条插值函数牛顿插值

MATLAB作业拉格朗日三阶样条插值函数牛顿插值

Lagrange插值M函数syms xx0=[0,1,2];y0=[1,2,3];n=length(x0);for i=1:na=1;for j=1:nif j~=ia=expand(a*(x-x0(j)));endendb=1;for k=1:nif k~=ib=b*(x0(i)-x0(k));endendA(i)=expand(a/b);endL=0;for p=1:nL=L+y0(p)*A(p);endL>> LanguageL =x + 1三阶样条插值M函数function m=naspline(x,y,dy0,dyn,xx)n=length(x)-1;h=diff(x);lemda=h(2/n)./(h(1:n-1)+h(2:n));mu=1-lemda;g=3*(lemda.*diff(y(1:n))./h(1:n-1)+mu.*diff(y(2:n+1))./h(2:n)); g(1)=g(1)-lemda(1)*dy0;g(n-1)=g(n-1)-mu(n-1)*dyn;dy=nachase(lemda,2*ones(1:n-1),mu,g);m=[dy0;dy;dyn];if nargin>=5s=zeros(size(xx));for i=1:nif i==1,kk=find(xx<=x(2));elseif i==nkk=find(xx>x(n));elsekk=find(xx>x(i)&xx<=x(i+1));endxbar=(xx(kk)-x(i))/h(i);s(kk)=alpha0(xbar)*y(i)+alpha1(xbar)*y(i+1)+...h(i)*beta0(xbar)*m(i)+h(i)*beta1(xbar)*m(i+1);endm=s;endfunction x=nachase(a,b,c,d)n=length(a);for k=2:nb(k)=b(k)-a(k)/b(k-1)*c(k-1);d(k)=d(k)-a(k)/b(k-1)*d(k-1);endx(n)=d(n)/b(n);for k=n-1:-1:1x(k)=(d(k)-c(k)*x(k+1))/b(k);endx=x(:);function y=alpha0(x)y=2*x.^3-3*x.^2+1;function y=alpha1(x)y=-2*x.^3+3*x.^2;function y=beta0(x)y=x.^3-2*x.^2+x;function y=beta1(x)y=x.^3-x.^2;naspline([-1 0 1],[-1 0 1],0,-1)ans =1.7500-1.0000>> naspline([-1 0 1],[-1 0 1],0,-1,-1:0.25:1)ans =-1.0000 -0.9258 -0.7188 -0.4023 0 0.4492 0.8438 1.06641.0000ans =Columns 1 through 5-1.0000 -0.9258 -0.7188 -0.4023 0 Columns 6 through 90.4492 0.8438 1.0664 1.0000牛顿插值多项式function yi=Newton(x,y,xi)n=length(x);m=length(y);if n~=merror;return;end%计算均差表YY=zeros(n);Y(:,1)=y';for k=1:n-1for i=1:n-kif abs(x(i+k)-x(i))<epserror;return;endY(i,k+1)=(Y(i+1,k)-Y(i,k))/(x(i+k)-x(i));endend%计算牛顿插值公式yi=0;for i=1:nz=1;for k=1:i-1z=z*(xi-x(k));endyi=yi+Y(1,i)*z;endEnd>>format compact>> x=pi*[1/6 1/4 1/3];y=[0.5 0.7071 0.866];xi=2*pi/9;0.550.60.650.70.750.450.50.550.60.650.70.75>> yi=Newton(x,y,xi)yi =0.6434>>fplot(‘sin ’,[pi/6 pi/4 pi/3]);hold on;>>plot(x,y,’o ’xi,0.6434,’rv ’);hold off;牛顿迭代M 函数function x=nanewton(fname,dfname,x0,e,N) if nargin<5,N=500;endif nargin<4,e=1e-4;endx=x0;x0=x+2*e;k=0;while abs(x0-x)>e&k<N,k=k+1;x0=x;x=x0-feval(fname,x0)/feval(dfname,x0); disp(x)endif k==N,warning('已达迭代次数上限');end >> fun=inline('x^3-x-1');dfun=inline('3*x^2-1'); >> nanewton(fun,dfun,1.5,0.5e-3)1.34781.32521.3247ans =1.32470.550.60.650.70.750.450.50.550.60.650.70.75。

插值法(牛顿插值与拉格朗日插值法的M文件编写)

插值法(牛顿插值与拉格朗日插值法的M文件编写)

牛顿插值与拉格朗日插值ployfit 实现多项式回归matlab 的m 文件:Function yint=newtint(x,y,xx)%newtint:newton interpolating polynomial%yint=newtint(x,y,xx):uses an (n-1)-order newton%to determine a value of the dependent variable (yint)%at a given value of the independent variable,xx.%input:%x=independent variable%y=dependent variable%xx=value of independent variable at which Interpolation is calculated % output:% yint=interpolated value of dependent variable%compute the finite divided differences in the form of a%difference tablen=length(x);If length(y)~=n,error('x and y must be same length');Endb=zeros(n,n);%assign dependent variables to the first column of b.b(:,1)=y(:);%the(:)ensures that y is a column vector.For j=2:nFor i=1:n-j+1b(I,j)=(b(i+1,j-1)-b(I,j-1))/(x(i+j-1)-x(i));EndEnd% use the finite divided differences to interpolateXt=1;Yint=b(1,1);For j=1:n-1xt=xt*(xx-x(j));Yint=yint+b(1,j+1)*xt;End-------------------------------------------------------------------------------------------------------------拉格朗日插值方法m 文件的编写Function yint =lagrange(x,y,xx)%lagrange:lagrange interpolating polynomial%yint=lagrange(x,y,xx):uses an (n-1)-order% to determine a value of the dependent variable (yint) at% a given value of the independent variable ,xx.%input:% x=independent variable%y=dependent variable%xx=value of independent variable at which the interpolation is calculated %output:% yint=interpolated value of dependent variablen=length(x);If length(y)~=n,error('x and y must be same length');Ends=0;For i=1:nProduct=y(i);For j=1:nIf i~=jProduct =product*(xx-x(j))/(x(i)-x(j));End插值法2010年10月24日11:16EndEnds=s+product; EndYint=s;。

功能强大的牛顿插值matlab程序代码

功能强大的牛顿插值matlab程序代码

format long;way_in = input('请选择输入的内容(1或2):\n1、输入为f(x)表达式,区间[a,b]及其等分数n的值\n2、输入为f(x)表达式和插值点横坐标xi的值\n');switch way_incase 1f = input('请输入函数表达式:f(x) = ', 's');a = input('请输入区间左端值a:');b = input('请输入区间右端值b:');n = input('请输入区间等分值n:');np = input('请输入插值函数在区间内绘图点数(默认输入100):');for i=1:n+1x(i) = a + (b-a)/n*(i-1);y(i,1) = eval(subs(f,'x(i)','x'));endfor j=1:nfor k=j:ntemp=y(k+1,j)-y(k,j);y(k+1,j+1)=temp/(x(k+1)-x(k+1-j)) ;endc(j)=y(j,j);endc(j+1)=y(j+1,j+1);for k=1:np-1xx(k)= a + (b-a)/np*k;yy(k) = eval(subs(f,'xx(k)','x'));endfor k=1:np-1xs=xx(k);for i=1:n+1if i==1s(i)=c(i);elses(i)=c(i);for j=1:i-1s(i)=s(i)*(xs-x(j));endendendNn(k)=sum(s);way_out = input('请选择要绘出的曲线(1、2或3):\n1、同时输出原始曲线f(x)和插值曲线\n2、只输出插值曲线\n3、只输出原始曲线\n');switch way_outcase 1figure;plot(xx,yy,'r');grid on;hold on;plot(xx,Nn,'b');legend('原始曲线f(x)','插值曲线N(x)');title('牛顿插值');case 2figure;plot(xx,Nn,'m');legend('插值曲线N(x)');title('牛顿插值');case 3figure;plot(xx,yy,'g');legend('原始曲线f(x)');title('牛顿插值');otherwiseerrordlg('请正确选择,输入只能为1、2或者3!','提示','on');endcase 2f = input('请输入函数表达式:f(x) = ', 's');xb = input('请输入插值节点的横坐标x:','s');x = sscanf(xb,'%f');disp('x0,x1,...,xi分别为:');disp(x);n = size(x,1) - 1;if n<2errordlg('请至少输入3个xi的值','提示','on');return;endnp = input('请输入插值函数在区间内绘图点数(默认输入100):');a = x(1);b = x(n+1);for i=1:n+1y(i,1) = eval(subs(f,'x(i)','x'));endfor j=1:nfor k=j:ntemp=y(k+1,j)-y(k,j);y(k+1,j+1)=temp/(x(k+1)-x(k+1-j)) ;endc(j)=y(j,j);endc(j+1)=y(j+1,j+1);for k=1:np-1xx(k) = a + (b-a)/np*k;yy(k) = eval(subs(f,'xx(k)','x'));endfor k=1:np-1xs=xx(k);for i=1:n+1if i==1s(i)=c(i);elses(i)=c(i);for j=1:i-1s(i)=s(i)*(xs-x(j));endendendNn(k)=sum(s);endway_out = input('请选择要绘出的曲线(1、2或3):\n1、同时输出原始曲线f(x)和插值曲线\n2、只输出插值曲线\n3、只输出原始曲线\n');switch way_outcase 1figure;plot(xx,yy,'r');grid on;hold on;plot(xx,Nn,'b');legend('原始曲线f(x)','插值曲线N(x)');title('牛顿插值');case 2figure;plot(xx,Nn,'m');legend('插值曲线N(x)');title('牛顿插值');case 3figure;plot(xx,yy,'g');legend('原始曲线f(x)');title('牛顿插值');otherwiseerrordlg('请正确选择,输入只能为1、2或者3!','提示','on');endotherwiseerrordlg('请正确选择,输入只能为1或2!','提示','on');end。

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

实验五多项式插值逼近
信息与计算科学金融崔振威201002034031
一、实验目的:
拉格朗日插值和牛顿插值的数值实现
二、实验内容:p171.1、p178.1、龙格现象数值实现
三、实验要求:
1、根据所给题目构造相应的插值多项式,
2、编程实现两类插值多项式的计算
3、试分析多项式插值造成龙格现象的原因
主程序
1、拉格朗日
function [c,l]=lagran(x,y)
%c为多项式函数输出的系数
%l为矩阵的系数多项式
%x为横坐标上的坐标向量
%y为纵坐标上的坐标向量
w=length(x);
n=w-1;
l=zeros(w,w);
for k=1:n+1
v=1;
for j=1:n+1
if k~=j
v=conv(v,poly(x(j)))/(x(k)-x(j)) %对多项式做卷积运算end
end
l(k,:)=v;
end
c=y*l;
牛顿插值多项式主程序
function [p2,z]=newTon(x,y,t)
%输入参数中x,y为元素个数相等的向量
%t为插入的定点
%p2为所求得的牛顿插值多项式
%z为利用多项式所得的t的函数值。

n=length(x);
chaS(1)=y(1);
for i=2:n
x1=x;y1=y;
x1(i+1:n)=[];
y1(i+1:n)=[];
n1=length(x1);
s1=0;
for j=1:n1
t1=1;
for k=1:n1
if k==j %如果相等则跳出循环
continue;
else
t1=t1*(x1(j)-x1(k));
end
end
s1=s1+y1(j)/t1;
end
chaS(i)=s1;
end
b(1,:)=[zeros(1,n-1) chaS(1)];
cl=cell(1,n-1); %cell定义了一个矩阵
for i=2:n
u1=1;
for j=1:i-1
u1=conv(u1,[1 -x(j)]); %conv()用于多项式乘法、矩阵乘法
cl{i-1}=u1;
end
cl{i-1}=chaS(i)*cl{i-1};
b(i,:)=[zeros(1,n-i),cl{i-1}];
end
p2=b(1,:);
for j=2:n
p2=p2+b(j,:);
end
if length(t)==1
rm=0;
for i=1:n
rm=rm+p2(i)*t^(n-i);
end
z=rm;
else
k1=length(t);
rm=zeros(1,k1);
for j=1:k1
for i=1:n
rm(j)=rm(j)+p2(i)*t(j)^(n-i);
end
z=rm;
end
end
plot(t,z,'y',x,y,'*r') %输出牛顿插值多项式的函数图
p171.1
(a)、f(x)=e x
解:在matlab窗口中输入:
>> x=[0 0.2 0.4 0.6 0.8 1];
>> y=[exp(0) exp(0.2) exp(0.4) exp(0.6) exp(0.8) exp(1)]
y =
1.0000 1.2214 1.4918 1.8221
2.2255 2.7183
>> [c,l]=lagran(x,y)
可以得出输出结果为:
c =
0.0139 0.0349 0.1704 0.4991 1.0001 1.0000
l =
-26.0417 78.1250 -88.5417 46.8750 -11.4167 1.0000
130.2083 -364.5833 369.7917 -160.4167 25.0000 0
-260.4167 677.0833 -614.5833 222.9167 -25.0000 0
260.4167 -625.0000 510.4167 -162.5000 16.6667 0
-130.2083 286.4583 -213.5417 63.5417 -6.2500 0
26.0417 -52.0833 36.4583 -10.4167 1.0000 0
由输出结果可以的出:P(x)的系数分别为:
a0=0.0139 a1=0.0349 a2=0.1704 a3=0.4991 a4=1.0001 a5=1.0000
(b)、f(x)=sin(x)
解:在matlab窗口中输入:
>> x=[0 0.2 0.4 0.6 0.8 1];
>> y=[sin(0) sin(0.2) sin(0.4) sin(0.6) sin(0.8) sin(1)];
>> [c,l]=lagran(x,y)
可以得出输出结果为:
c =
0.0073 0.0016 -0.1676 0.0002 1.0000 0
l =
-26.0417 78.1250 -88.5417 46.8750 -11.4167 1.0000
130.2083 -364.5833 369.7917 -160.4167 25.0000 0
-260.4167 677.0833 -614.5833 222.9167 -25.0000 0
260.4167 -625.0000 510.4167 -162.5000 16.6667 0
-130.2083 286.4583 -213.5417 63.5417 -6.2500 0
26.0417 -52.0833 36.4583 -10.4167 1.0000 0
由输出结果可以的出:P(x)的系数分别为:
a0=0.0073 a1=0.0016 a2=-0.1676 a3=0.0002 a4=1.0000 a5=0
(c)、f(x)=(x+1)x+1
解:在matlab窗口中输入:
>> x=[0 0.2 0.4 0.6 0.8 1];
>> y=[1 1.2^1.2 1.4^1.4 1.6^1.6 1.8^1.8 2^2];
>> [c,l]=lagran(x,y)
可以得出输出结果为:
c =
0.3945 -0.0717 0.7304 0.9415 1.0052 1.0000
l =
-26.0417 78.1250 -88.5417 46.8750 -11.4167 1.0000
130.2083 -364.5833 369.7917 -160.4167 25.0000 0
-260.4167 677.0833 -614.5833 222.9167 -25.0000 0
260.4167 -625.0000 510.4167 -162.5000 16.6667 0
-130.2083 286.4583 -213.5417 63.5417 -6.2500 0
26.0417 -52.0833 36.4583 -10.4167 1.0000 0
由输出结果可以的出:P(x)的系数分别为:
a0=0.3945 a1=-0.0717 a2=0.7304 a3=0.9415 a4=1.0052 a5=1.0000
P178.1
2、a0=5 a1=-2 a2=0.5 a3=-0.1 a4=0.003
x0=0 x1=1 x2=2 x3=3 c=2.5
解:在matlab窗口中输入:
>> x=[5 -2 0.5 -0.1];
>> y=[0 1 2 3];
>> t=0:0.1:2.5;
>> [u,v]=newTon(x,y,t)
可得出输出结果:
u =
0.1896 -0.7843 -1.3928 2.8688
v =
2.8688 2.7218 2.5603 2.3855 2.1983 2.0000 1.7917 1.5745 1.3497 1.1182 0.8813 0.6401 0.3957 0.1493 -0.0980 -0.3451 -0.5908 -0.8340 -1.0735 -1.3082 -1.5370 -1.7588 -1.9723 -2.1765 -2.3702 -2.5523
由此可以求出牛顿多项式为:
f(x)=0.1896x^3--0.7843^x2--1.3928x+2.8688
输出的图为:
结果分析:
利用牛顿插值多项式的函数,通过调用函数可以求得牛顿多项式与给定的点的值,并通过matlab做出函数图像。

对输出结果v的值和图像进行分析,不难发现函数的输出值没有很明显的偏离函数原图像,即出现龙格现象。

因此利用牛顿插值多项式求该函数,其结果是逼近的。

相关文档
最新文档