这个函数大体是正确的,但有小错误两个
1 L=L.*abs((z-x0(j)))/(x0(k)-x0(j));这行不需要abs.
2 x是个数值的话 就不需要m=length(x);和下面的循环输出了;
我开始认同你的看法,但作图后发现,不能这样想当然。不同函数不一样,这个被插值函数在0附近的值下降很快。完整图像我给你看看。
今天看了下这个问题,可能用拟合更好(因为你的数值线性度较大,拉格朗日插值条件不好,Matlab里面称为Bad Condition.)用拟合方法如下(线性拟合)
clear
>> x0=[4 8 12 16 20 24];
y0=[1590 1320 1000 900 650 560];
p=polyfit(x0,y0,1);
>> x=-1:30;
y=polyval(p,x);
>> plot(x,y)
%显示0处拟合值
>> polyval(p,0)
%----------------------------
结果为1729
因为只能放一个图 我就把第一个图删除了
function f = Language(x,y,x0)
syms t;
if(length(x) == length(y))
n = length(x);
else
disp('x和y的维数不相等!');
return;
end %检错
f = 0.0;
for(i = 1:n)
l = 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;
f = f + l; %计算拉格朗日插值函数
simplify(f); %化简
if(i==n)
if(nargin == 3)
f = subs(f,'t',x0); %计算插值点的函数值
else
f = collect(f); %将插值多项式展开
f = vpa(f,6); %将插值多项式的系数化成6位精度的小数
end
end
end
这是一个比较标准的函数,但是都不对。好像是因为你的插值点不对。你偏离数据段太远了点。最多也就在4~24这个段和两边很小范围内可以插值。距离大了插值本来就没多大意义了。因为你是插值不是拟合。
function main()
clear;clc;close 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