根据插值多项式的唯一性,两种方法的结果应该是一样的。条条道路通罗马,只是方法不同而已,牛顿法要比拉格朗日法优越简单。
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)
命令窗口输这个就没有问题。
扩展资料:
如果这特定函数是多项式,就称它为插值多项式。利用插值基函数很容易得到拉格朗日插值多项式,公式结构紧凑,在理论分析中甚为方便,但当插值节点增减时全部插值基函数均要随之变化,整个公式也将发生变化,这在实际计算中是很不方便的,为了克服这一缺点,提出了牛顿插值。
参考资料来源:百度百科-牛顿插值法
functionmain()
clearclcclose
all
x=linspace(-5,5,11)
y=1./(1+x.^2)
x0=[0.3
0.5]
f=Language(x,y,x0)
function
f
=
Language(x,y,x0)
%求已知数据点的拉格朗日插值多项式
%已知数据点的x坐标向量:
x
%已知数据点的y坐标向量:
y
%插值点的x坐标:
x0
%求得的拉格朗日插值多项式或在x0处的插值:
f
x=[0.0
0.4
0.8
1.2
1.6]%input
x
data(可替换为自己的数据)
y=[0
0.428392
0.742101
0.910314
0.970348]%input
y
data(可替换为自己的数据)
x0=[0.3
0.5]%input
x0
data(可替换为自己的数据)
syms
t
l
if(length(x)
==
length(y))
n
=
length(x)
else
disp('x和y的维数不相等!')
return
%检错
end
p=sym(0)
for
(i=1:n)
l=sym(y(i))
for(k=1:i-1)
l=l*(t-x(k))/(x(i)-x(k))
end
for(k=i+1:n)
l=l*(t-x(k))/(x(i)-x(k))
end
p=p+l
end
simplify(p)%简化多项式
f
=
subs
(p,'t',x0)
%计算插值点的函数值
f
=
vpa(f,6)
%将插值多项式的值化成6位精度的小数
end
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)