目录
(一)插值方法
(1)一维插值
已知未知函数在n+1个互不相同的观测点x0,x1.......xn处的函数值,寻求一个近似函数
使其通过所有数据点。
对于任意非观测点,要估计该点的函数值,就可以用估计。
(2)用待定系数法确定插值多项式
鉴于插值条件,有n+1个约束方程。代入插值多项式中,得行列式。
记系数矩阵为A,则
如数据xi=[1,2,3,4,5,6] yi=[16,18,21,17,15,12]
clc,clear
x0=[1:6]';
y0=[16,18,21,17,15,12]';
A=vander(x0),p=A\y0 %求vandermonde行列式
x=[1.5,2.6];
th=polyval(p,x)
A =
1 1 1 1 1 1
32 16 8 4 2 1
243 81 27 9 3 1
1024 256 64 16 4 1
3125 625 125 25 5 1
7776 1296 216 36 6 1
p =
-0.2417
4.3333
-28.9583
87.6667
-115.8000
69.0000
th =
14.9180 20.8846
(3)拉格朗日插值方法
暂不介绍原理
拉格朗日插值函数编写
function y=lagrange(x0,y0,x)
n=length(x0);
m=length(x);
for i=1:m
z=x(i);s=0.0;
for k=1:n
p=1.0;
for j=1:n
if j~=k
p=p*(z-x0(j)/(x0(k)-x0(j)));
end
end
s=p*y0(k)+s;
end
y(i)=s;
end
end
clc,clear
x0=[1:6]';
y0=[16,18,21,17,15,12]';
x=[1.5,2.6];
yh=lagrange(x0,y0,x)
(4)Newton插值方法等
二、插值和拟合函数
(1)多项式拟合
polyfit(X,Y,N) %多项式拟合,返回降幂排列的多项式系数
polyvval(P,xi) %计算多项式的值
x=[1 2 3 4 5 6 7 8 9];
y=[9 7 6 3 -1 2 5 7 20];
P=polyfit(x,y,3);
xi=0:2:10;
yi=polyval(P,xi);
plot(xi,yi,x,y,'r*');
(2)图形窗口拟合
(3)指定函数拟合
如已知对应的函数形式为
编写如下M文件
syms t
x=[0; 0.4;1.2;2;2.8;3.6;4.4;5.2;6;7.2;8;9.2;10.4;11.6;12.4;13.6;14.4;15];
y=[1;0.85;0.29;-0.27;-0.53;-0.4;-0.12;0.1;0.28;0.15;-0.03;-0.15;-0.071;0.059;0.08;0.032;-0.015;-0.02];
%此处数据必须是列向量的形式
f=fittype('a*cos(k*t)*exp(w*t)','independent','t','coefficients',{'a','k','w'});
cfun=fit(x,y,f) %显示拟合函数
xi=0:1:20;
yi=cfun(xi);
plot(x,y,'r*',xi,yi,'b-')
cfun =
General model:
cfun(t) = a*cos(k*t)*exp(w*t)
Coefficients (with 95% confidence bounds):
a = 0.9994 (0.9731, 1.026)
k = 0.994 (0.9849, 1.003)
w = -0.2107 (-0.2222, -0.1993)
(4)一维插值及应用
基本函数
1.
F=griddedInterpolant(x,v,method,extrapolation)
%计算对应的函数值的使用格式为vq=F(xq1,xq2...)
%method 包括'nearest','linear','spline','cubic'
%n维插值的调用格式为
F=griddedInterpolant(x1,x2,...xn,v,method,extrapolation)
%计算函数值 vq=F(xq1,xq2,,,xqn)
2.
%三次样条插值函数csape
pp=csape(x0,y0,conds,valconds) %conds指定插值的边界条件
%可以是'complete','not_a_knot'
%求插值点函数值 调用fnval
y=fvnal(pp1,x)
length(x0)
length(y0)
x=0:0.1:15; y1=lagrange(x0,y0,x);
y2=interp1(x0,y0,x);
y3=interp1(x0,y0,x,'spline');
pp4=csape(x0,y0); y4=fnval(pp4,x);
yx5=griddedInterpolant(x0,y0,'spline');
y5=yx5(x);
[y1',y2',y3',y4',y5']
subplot(1,3,1),plot(x,y1),title('拉格朗日插值')
subplot(1,3,2),plot(x,y2),title('分段线性插值')
subplot(1,3,3),plot(x,y3),title('三次样条插值')
dx=diff(x);dy=diff(y3);
dy_dx=dy./dx;
dy_dx0=dy_dx(1)
ytemp=y3(131:151);ymin=min(ytemp);
index=find(y3==ymin);
xmin=x(index);[xmin,ymin]
(5)二维插值及其应用
基本函数
z=interp2(x0,y0,z0,x,y,'method')
%x0,y0表示m维和n维向量,表示节点。z0为n*m矩阵,表示节点值。x,y为一维数组,表示插值点;x,y应是
%不同方向的向量,z为矩阵,行数为y的维数,列数2为x的维数,表示插值得到的值。
pp=csape({x0,y0},z0,conds,valconds),z=fnval(pp,{x,y})