一、原理
以3个点为例,设A(x1,y1),B(x2,y2),C(x3,y3)。那么需要一个二次曲线才能通过这三点。
为得到这个二次曲线,我们可以通过三根二次曲线相加来求得。
第一根曲线f1(x),在x1处取1,在x2,x3处取0。
令(可以验算)
第二根曲线f2(x),在x2处取1,在x1,x3处取0。
令
第三根曲线f3(x),在x3处取1,在x1,x2处取0。
令
可以保证在x1处,取得y1,在x2,x3处,取0。
可以保证在x2处,取得y2,在x1,x3处,取0。
可以保证在x3处,取得y3,在x1,x2处,取0。
那么
可以保证在x1处,取得y1,在x2处,取得y2,在x3处,取得y3.
推广到n个点,有
二、代码
%% 拉格朗日插值 过n个点
x=(1:12);%横坐标
y=[1 3 2 0 7 4 0 5 11 0 13 7 ];%纵坐标
n=length(x);%x的长度
t=zeros(1,n);
syms a f0 f1
f=sym('f',[1 n]);
f0=0;
for i=1:n
f(i)=1;
for j=[1:i-1,i+1:n]
f(i)=f(i)*(a-x(j))/(x(i)-x(j));
end
f0=f0+y(i)*f(i);
end
f1=expand(f0);%多项式展开
pretty(f1)
p=sym2poly(f1);%多项式系数
for i=1:n
t(i)=subs(f1,a,i);%验证
end
%画图
x1 = min(x):0.02:max(x);
y1 = polyval(p,x1);
plot(x,y,'*',x1,y1,'k');