拉格朗日差值
1.线性插值
已知:
对于两点可以确定一条直线,我们可以用一条直线来“穿过这2个点”,那么这条直线是多少呢?
令f(x)=kx+b可以推导出
那我们想一想是否可以直接写出f(x),而不经过推到呢?
令 ,
那么
我们只需要确定 l1和l2就可以了。
我们再看表格,当 时,我们需要 穿过 (x1,y1)这个点。那么即当x=x1时,l1等于1. x=x2时,l1=0.也就是构造出上式。
同理 l2.
2.抛物线差值
我们去拟合3个点,得到的是二次函数。
代码如下:
%sin(50')=0.7660
x=[45 60]';y=[0.7070 0.866]';
t=50;
a1=t-x(2); b1=x(1)-x(2); a2=t-x(1); b2=x(2)-x(1);
f=a1*y(1)/b1 + a2*y(2)/b2;
xx=[30 45 60]';yy=[0.5 0.7070 0.866]';
tt=50;
a=(t-xx(2))*(t-xx(3))/((xx(1)-xx(2))*(xx(1)-xx(3)));%y(1)
b=(t-xx(1))*(t-xx(3))/((xx(2)-xx(1))*(xx(2)-xx(3)));%y(2)
c=(t-xx(1))*(t-xx(2))/((xx(3)-xx(1))*(xx(3)-xx(2)));%y(3)
ff=a*yy(1)+b*yy(2)+c*yy(3);
给定n个值,插成n-1次。
clc;clear all;
disp("有几对x,y");
m=input('m=');
for i=1:m
x(i)=input('x=');
y(i)=input('y=');
end
disp("输入想求的x");
xx=input('xx=');
yy=0;
for i=1:m
yy=yy+fenzi(xx,i,x)*y(i)/fenmu(i,x)
end
yy
function[f1]=fenzi(xx,index,x)%xx是要求的x,index 是第几个L0,x是所有的x值
len=length(x);
f1=1;
for i=1:len
if(i==index)
continue;
end
f1=f1*(xx-x(i));
end
end
function[f2]=fenmu(index,x)%xx是要求的x,index 是第几个L0,x是所有的x值
len=length(x);
f2=1;
for i=1:len
if(i==index)
continue;
end
f2=f2*(x(index)-x(i));
end
end