n = length(x)
m = length(xh)
yh = zeros(1,m)
c1 = ones(n-1,1)
c2 = ones(1,m)
for i=1:n
xp = x([1:i-1 i+1:n])
yh = yh + y(i)*prod((c1*xh-xp'*c2)./(x(i)-xp'*c2))
end
注:该程序只可一次计算实现一个插值计算。可实现多个插值计算的程序如下:
function yh=lagrange(x,y,xh)
n = length(x)
m = length(xh)
x = x(:)
y = y(:)
xh = xh(:)
yh = zeros(m,1)
c1 = ones(1,n-1)
c2 = ones(m,1)
for i=1:n,
xp = x([1:i-1 i+1:n])
yh = yh + y(i) * prod((xh*c1-c2*xp')./(c2*(x(i)*c1-xp')),2)
end
做了一个测试,希望有所帮助。代码:% 用matlab编写拉格朗日插值算法的程序,并以下面给出的函数表为数据基础,% 在整个插值区间上采用拉格朗日插值法计算f(0.6),写出程序源代码,输出计算结果
% x -2.15 -1.00 0.01 1.02 2.03 3.25
% y 17.03 7.24 1.052.0317.0623.05
function main()
clc
x = [-2.15 -1.00 0.01 1.02 2.03 3.25]
y = [17.03 7.24 1.052.0317.0623.05 ]
x0 = 0.6
f = Language(x,y,x0)function f = Language(x,y,x0)
%已知数据点的x坐标向量: x
%已知数据点的y坐标向量: y
%插值点的x坐标: x0
%求得的拉格朗日插值多项式或在x0处的插值: fsyms t l
if(length(x) == length(y))
n = length(x)
else
disp('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
end
simplify(h)if(nargin == 3)
f = subs (h,'t',x0)%计算插值点的函数值
else
f=collect(h)
f = vpa(f,6)%将插值多项式的系数化成6位精度的小数
end结果:
f =0.0201>>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)