根据插值多项式的唯一性,两种方法的结果应该是一样的。条条道路通罗马,只是方法不同而已,牛顿法要比拉格朗日法优越简单。
Matlab函数M文件Lagrange程序function yy=lagrange(x,y,xi) m=length(x)上面是拉格朗日插值法,其中xi为要计算的数值比如 x=[0 3 5 9 31]Q
clear allclc
x0=1:5
y0=sin(x0)
x=1:0.2:2
y0=lagrange(x0,y0,x)
命令窗口输这个就没有问题。
扩展资料:
如果这特定函数是多项式,就称它为插值多项式。利用插值基函数很容易得到拉格朗日插值多项式,公式结构紧凑,在理论分析中甚为方便,但当插值节点增减时全部插值基函数均要随之变化,整个公式也将发生变化,这在实际计算中是很不方便的,为了克服这一缺点,提出了牛顿插值。
参考资料来源:百度百科-牛顿插值法
牛顿插值法matlab的m文件,里面有调用示例,可以直接调用;%保存文件名为New_Int.m
%Newton基本插值公式
%x为向量,全部的插值节点
%y为向量,差值节点处的函数值
%xi为标量,是自变量
%yi为xi出的函数估计值
function
yi=New_Int(x,y,xi)
n=length(x)
m=length(y)
if
n~=m
error('The
lengths
of
X
ang
Y
must
be
equal!')
return
end
%计算均差表Y
Y=zeros(n)
Y(:,1)=y'
for
k=1:n-1
for
i=1:n-k
if
abs(x(i+k)-x(i))<eps
error('the
DATA
is
error!')
return
end
Y(i,k+1)=(Y(i+1,k)-Y(i,k))/(x(i+k)-x(i))
end
end
%计算牛顿插值公式
yi=0
for
i=1:n
z=1
for
k=1:i-1
z=z*(xi-x(k))
end
yi=yi+Y(1,i)*z
end
做个测试,希望有所帮助。代码function main()clcx=[0.40,0.55,0.65,0.80,0.90,1.05]y=[0.41075,0.57815,0.69675,0.88811,1.02652,1.25382]xhat=0.596[yhat,dy,cout]=newtint(x,y,xhat)figurehold onbox onplot(x, y, 'r-*')plot(xhat, yhat, 'ko') function [yhat,dy,cout]=newtint(x,y,xhat) %牛顿插值n=length(y)if length(x)~=nerror('x和y不一致')endc=y(:)for j=2:n %计算差商矩阵for i=n:-1:jc(i)=(c(i)-c(i-1))/(x(i)-x(i-j+1)) endendyhat=c(n)for i=(n-1):-1:1 %构造插值多项式yhat=yhat.*(xhat-x(i))+c(i)endif nargout>1yn2=c(n-1) for i=n-2:-1:1yn2=yn2.*(xhat-x(i))+c(i) enddy=yhat-yn2 if nargout>2, cout=cendend 结果欢迎分享,转载请注明来源:内存溢出
评论列表(0条)