实验三 插值与拟合
实验任务:拉格朗日插值、*牛顿插值法、*三次样条插值、多项式拟合
实验目的: 掌握拉格朗日插值、*牛顿插值法、*三次样条插值的原理,熟悉
MATLAB 相关函数的调用,利用 MATLAB 程序实现算法
实验课时:4 学时
预备学习:
1. P79 拉格朗日插值应用例题;
2. *P90 三次样条插值应用例题;
3. P99-102Matlab 相关函数及应用例题;
练习:
1. P105 习题 3,*习题 8,习题 12(非上机题);
2. P106 实验 2,*实验 4,实验 8(可调用 Matlab 内置函数)。
实验程序:
程序 4.1(拉格朗日插值)
function yy=nalagr(x,y,xx)
m=length(x);n=length(y);
if m~=n,error;end
s=0;
for i=1:n
t=ones(1,length(xx));
for j=1:n
t=t.*(xx-x(j))/(x(i)-x(j));
if j~=i,
end
end
s=s+t*y(i);
end
yy=s;
程序 4.2(三次样条插值)
function m=naspline(x,y,dy0,dyn,xx)
n=length(x)-1;
h=diff(x);lemda=h(2:n)./(h(1:n-1)+h(2:n));mu=1-lemda;
g=3*(lemda.*diff(y(1:n))./h(1:n-1)+mu.*diff(y(2:n+1))./h(2:n));
g(1)=g(1)-lemda(1)*dy0;g(n-1)=g(n-1)-mu(n-1)*dyn;
dy=nachase(lemda,2*ones(1:n-1),mu,g);
m=[dy0;dy;dyn];
if nargin>=5
s=zeros(size(xx));
for i=1:n
if i==1,
kk=find(xx<=x(2));
elseif i==n
kk=find(xx>x(n));
kk=find(xx>x(i)&xx<=x(i+1));
end
xbar=(xx(kk)-x(i))/h(i);
else
end
m=s;
s(kk)=alpha0(xbar)*y(i)+alpha1(xbar)*y(i+1)+h(i)*beta0(xbar)*m(i)+h(i)*beta1(xbar)
*m(i+1);
end
function x=nachase(a,b,c,d)
n=length(a);
for k=2:n
b(k)=b(k)-a(k)/b(k-1)*c(k-1);
d(k)=d(k)-a(k)/b(k-1)*d(k-1);
x(k)=(d(k)-c(k)*x(k+1))/b(k);
end
x(n)=d(n)/b(n);
for k=n-1:-1:1
end
x=x(:);
function y=alpha0(x)
y=2*x.^3-3*x.^2+1;
function y=alpha1(x)
y=-2*x.^3+3*x.^2;
function y=beta0(x)
y=x.^3-2*x.^2+x;
function y=beta1(x)
y=x.^3-x.^2;