插值和拟合的定义
1. 定义: 若x 为自变量,y 为因变量,则x 与y 之间有一个确定的函数表达式f (x ),现实中,这个函数关系式很难确定,运用逼近的方法处理:取得一组数据点(xi,yi,i=1,2,3...n), 构造一个简单函数p(x)作为f(x)的近似表达式,且p(x)满足: p(xi)=f(xi)=yi i=1,2,3,4...n 这就是插值问题。
若不要求p(x)通过所有数据点,而是要求曲线在某种准则下整体与数据点接近,例如运用最小二乘法得到p(x),这种问题称为拟合。
2插值类型:一维插值是指对一维函数y=f(x)进行插值,二维插值就是对二维函数y=f(x,y)进行插值.
3. 插值的matlab 函数及其应用
(1). 一维插值:yi=interp1(x,Y,xi ,’method ’) ,对一组节点(x,Y )进行插值,计算插值点xi 的函数值。method 包括了一下几种类型:
Nearest :线性最邻近插值(速度最快,平滑性最差) Linear :线性插值(默认项)(生成效果连续,但是顶点处有坡度变化) Spline :三次样条插值(运行时间较长,插值数据和导数均连续) Pchip :分段三次艾米尔特(hermite )插值
Cubic :双三次插值(较高版本的matlab 不能运用,v5cubic 能够运行) 运行的代码及插值效果:
clear; clc; x=0:0.2:2;
y=(x.^2-3*x+5).*exp(-3*x).*sin(x); xi=0:0.03:2;
yi_nearest=interp1(x,y,xi,'nearest' ); yi_linear=interp1(x,y,xi,'linear' ); yi_spline=interp1(x,y,xi,'spline' ); yi_pchip=interp1(x,y,xi,'pchip' ); yi_cubic=interp1(x,y,xi,'v5cubic' ); figure; hold on ;
subplot(2 ,3, 1); plot(x,y,'r*'); title(' 已知数据值' ); subplot(2, 3 ,2);
plot(x,y,'r*',xi,yi_nearest,'b-' ); title(' 最邻近插值' );
subplot(2,3,3);
plot(x,y,'r*',xi,yi_linear,'b-' ); title(' 线性插值' ); subplot(2,3,4);
plot(x,y,'r*',xi,yi_spline,'b-' ); title(' 三次样条插值' ); subplot(2,3,5);
plot(x,y,'r*',xi,yi_pchip,'b-' ); title(' 分段三次艾尔米特插值' ); subplot(2,3,6);
plot(x,y,'r*',xi,yi_cubic,'b-' ); title(' 三次多项式插值' );
(2).二维插值:第一类,二维网格数据插值zi=interp2(x,y,z,xi,yi ,’method ’), 其中x ,y 为数据采样点,即为真实所测得的数据,返回值为xi ,yi 的插值函数值。 method 与一维插值相同。
各个方法所得的插值效果和代码如下:
clear;clc;
[x,y]=meshgrid(-3:0.25:3); z=peaks(x,y);
[xi,yi]=meshgrid(-3:0.125:3); z1=interp2(x,y,z,xi,yi,'linear' );
z2=interp2(x,y,z,xi,yi,'nearest' ); z3=interp2(x,y,z,xi,yi,'spline' ); z5=interp2(x,y,z,xi,yi,'cubic' ); subplot(2,2,1); mesh(x,y,z); hold on ;
mesh(xi,yi,z1+15); axis([-3,3,-3,3,-8,25]); title(' 二维网格双线性插值' ); subplot(2,2,2); mesh(x,y,z); hold on ;
mesh(xi,yi,z2+15); axis([-3,3,-3,3,-8,25]); title(' 二维网格最邻近插值' ); subplot(2,2,3); mesh(x,y,z); hold on ;
mesh(xi,yi,z3+15); axis([-3,3,-3,3,-8,25]); title(' 二维网格样条插值' ); subplot(2,2,4); mesh(x,y,z); hold on ;
mesh(xi,yi,z5+15); axis([-3,3,-3,3,-8,25]); title(' 二维网格双三次插值' );
第二类:二维散点数据插值:zi=griddata(x ,y ,z ,xi ,yi ,’method ’),各个输入值与interp2 的相同,不再赘述。Method 为Cubic 不能运行,应采用v4方法进行插值。运行代码的效果图如下:
clear;clc; rand('seed' ,0); x=rand(100,1)*4-2; y=rand(100,1)*4-2; z=x.*exp(-x.^2-y.^2); ti=-2:0.25:2;
[xi,yi]=meshgrid(ti,ti);
z1=griddata(x,y,z,xi,yi,'linear' ); z2=griddata(x,y,z,xi,yi,'cubic' ); z3=griddata(x,y,z,xi,yi,'nearest' ); z4=griddata(x,y,z,xi,yi,'v4' ); subplot(2,2,1); mesh(xi,yi,z1); hold on ;
title(' 线性插值' ); plot3(x,y,z,'o' ); subplot(2,2,2); mesh(xi,yi,z2);
hold on ;
plot3(x,y,z,'o' ); title(' 三次插值' ); subplot(2,2,3); mesh(xi,yi,z3); hold on ;
plot3(x,y,z,'o' ); title(' 最邻近插值' ) subplot(2,2,4); mesh(xi,yi,z4); hold on ;
plot3(x,y,z,'o' ); title('v4插值' );
三维插值的matlab 函数有interp3,三维数据网格产生的函数为ndgrid 。若想详细了解,请参考matlab 的help 文档。
(二). 拟合的matlab 函数调用
(1)多项式拟合:一般多项式拟合的目的是找出一组多项式系数ai (i=1 ,2,3,4...n+1)使得多项式
ϕ(x ) =a 1x n +a 2x n -1+a 3x n -2+... +a n +1
能够较好的拟合数据。调用格式如下:
[p,s,mu]=polyfit(x,y,n ), 对x,y 进行n 维多项式最小二乘法拟合,输出结果p 为n+1
个
元素的向量,该向量以维数递减的形式给出拟合多项式系数。s 中包括R,df,normr, 分别表示对x 进行OR 分解三角元素,自由度,残差。Mu 包含两个元素,分别是标准化处理过程中使用的x 的均值和标准差。
(2)非线性最小二乘法
假设有一组数据xi ,yi ,i=1,2,3...n,且已知这组数据满足某一原型函数
ˆ(x ) =f (a , x ) y ,
其中a 为待定系数,最小二乘法的目标就是求出待定系数的值,使得目标函数
ˆ(x i ) ]=min ∑[y i -f (a , xi ) ]2J =min ∑[y i -y
2
a
i =1
a
i =1
n n
为最小。
Matlab 最优化工具箱中的函数为lsqcurvefit ,其调用格式如下:(least squares curve fit) [a,jm]=lsqcurvefit(fun,a0,x,y) fun 为原型函数的matlab 表示,M-文件定义的函数或者是inline
函数表示。a0为最优化的初值,x,y 为原始输入输出向量。调用该函数后返回待定系数向量a 以及在此待定系数下的目标函数值jm 。
(具体的应用过程在例题中展示)
函数lsqnonlin, 用于进行非线性最小二乘法拟合,调用格式为:(least squares nonlinear) X=lsqnonlin(‘fun ’,x0,options)
其中,fun 为拟合函数,(需要提前建立,含待定系数),x0位迭代初值,options 为优化选项,可以缺省。返回值x 的各个分量为fun 中的待求参数的拟合数值。 例题:
1. 某城市一天从0点到24点,每个两个小时测得温度如下:
22,21,19, 18 , 20, 24, 27, 32, 31, 28, 26, 23, 22,使用插值方法估计午时三刻的温度。
clear;clc; x=0:2:24;
y=[22,21,19, 18 , 20, 24, 27, 32, 31, 28, 26, 23, 22]; xi=0:0.1:24;
yi=interp1(x,y,xi,'spline' ); plot(xi,yi,'k-' ); hold on ;
xlabel(' 时间/h'); ylabel(' 温度' ); plot(x,y,'*'); x0=12.75;
y0=interp1(x,y,x0,'spline' )
2. 测得平板表面5×3的网格点处的温度分别如下: 82 81 80 82 84 79 63 61 65 81 84 84 82 85 86 作出平板表面的温度分布曲面
clear;clc; x=1:5; y=1:3;
z=[81 82 80 82 84; 79 63 61 65 81; 82 84 82 85 86 ]; %mesh(x,y,z); xi=1:0.2:5;
xi=xi;%插值的数据应该为一组行向量,一组为列向量 yi=1:0.2:3;
zi=interp2(x,y,z,xi,yi','cubic' ); mesh(xi,yi,zi);
3. 某海域测得一些点(x,y )的深度z (米)由表给出,在矩形区域(75,200)×(-90,150)内画出海底曲面图形,并标识出吃水线为4m ,5m 的船只禁入区。
clear;clc;
x=[129 140 103.5 88 185.5 195 105 157.5 107.5 77 81 162 162 117.5];
y=[7.5 141.5 23 147 22.5 137.5 85.5 -6.5 -81 3 56.5 -66.5 84 -33.5];
z=-[4 8 6 8 6 8 8 9 9 8 8 9 4 9]; [xi,yi]=meshgrid(75:0.5:200,-90:0.5:150);
zi=griddata(x,y,z,xi,yi,'cubic' ); mesh(xi,yi,zi); figure;
v=contour(xi,yi,zi,[-4,-4,-5,-5],'-k' ); % 绘制等高线,运用函数clabel 标识高度
clabel(v);
运行代码级结果如下:
clear;clc; a=1:12;
b=[3.1 3.8 6.9 12.7 16.8 20.5 24.5 25.9 22.0 16.1 10.7 5.4];
plot(a,b,'k*'); %画出散点图,确定拟合函数为多项式函数, 可以进行多次试验,找到最适合的
hold on ; x=polyfit(a,b,4) c=1:0.1:12;
plot(c,(x(1).*c.^4+x(2)*c.^3+x(3).*c.^2+x(4)*c+x(5))); xlabel(' 月份' ); ylabel(' 温度' );
x =
0.0164 -0.5014 4.4809 -10.3850 9.8528
即四次多项式由高次到低次的系数依次为0.0164 -0.5014 4.4809 -10.3850
9.8528,拟合图形如下:
-0. 02kt
y =a +be 5. 已知变量x ,y 之间的函数关系式为, 根据下表数据求得a ,b 的值。
1. 提前编写好函数m 文件
function f=fun9_7(x,t) f=x(1)+x(2)*exp(-0.02*x(3)*t); End
2. 编写主程序: clear;clc;
t=100:100:1000;
c=1e-3*[4.54 4.99 5.35 5.65 5.90 6.10 6.26 6.39 6.50 6.59]; x0=[0.2,0.5,0.05];
a=lsqcurvefit(@fun9_7,x0,t,c) plot(t,c,'*'); hold on ; t1=100:1000;
plot(t1,a(1)+a(2)*exp(-0.02*a(3)*t1));
不同的迭代初值所得的拟合结果不同,可以通过改变初值,在作图确定最佳的拟合数据。
6合金强度与碳含量之间相关。为了根据强度要求,控制碳含量,需要描述合金强度与碳含
a=[0.10 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.20 0.21 0.23];
b=[42.0 41.5 45.0 45.50 45.80 47.50 49.00 55.00 50.00 55.00 55.50 60.00]; plot(a,b,'*');
x1=polyfit(a,b,3) %三次多项式拟合 hold on ; t=0.1:0.01:0.25;
plot(t,x1(1)*t.^3+x1(2)*t.^2+x1(3)*t+x1(4));%四次多项式拟合 figure;
x2=polyfit(a,b,4) plot(a,b,'*'); hold on ;
plot(t,x2(1)*t.^4+x2(2)*t.^3+x2(3)*t.^2+x2(4)*t+x2(5));
三次多项式拟合图形:
四次多项式好拟合图形:
插值和拟合的定义
1. 定义: 若x 为自变量,y 为因变量,则x 与y 之间有一个确定的函数表达式f (x ),现实中,这个函数关系式很难确定,运用逼近的方法处理:取得一组数据点(xi,yi,i=1,2,3...n), 构造一个简单函数p(x)作为f(x)的近似表达式,且p(x)满足: p(xi)=f(xi)=yi i=1,2,3,4...n 这就是插值问题。
若不要求p(x)通过所有数据点,而是要求曲线在某种准则下整体与数据点接近,例如运用最小二乘法得到p(x),这种问题称为拟合。
2插值类型:一维插值是指对一维函数y=f(x)进行插值,二维插值就是对二维函数y=f(x,y)进行插值.
3. 插值的matlab 函数及其应用
(1). 一维插值:yi=interp1(x,Y,xi ,’method ’) ,对一组节点(x,Y )进行插值,计算插值点xi 的函数值。method 包括了一下几种类型:
Nearest :线性最邻近插值(速度最快,平滑性最差) Linear :线性插值(默认项)(生成效果连续,但是顶点处有坡度变化) Spline :三次样条插值(运行时间较长,插值数据和导数均连续) Pchip :分段三次艾米尔特(hermite )插值
Cubic :双三次插值(较高版本的matlab 不能运用,v5cubic 能够运行) 运行的代码及插值效果:
clear; clc; x=0:0.2:2;
y=(x.^2-3*x+5).*exp(-3*x).*sin(x); xi=0:0.03:2;
yi_nearest=interp1(x,y,xi,'nearest' ); yi_linear=interp1(x,y,xi,'linear' ); yi_spline=interp1(x,y,xi,'spline' ); yi_pchip=interp1(x,y,xi,'pchip' ); yi_cubic=interp1(x,y,xi,'v5cubic' ); figure; hold on ;
subplot(2 ,3, 1); plot(x,y,'r*'); title(' 已知数据值' ); subplot(2, 3 ,2);
plot(x,y,'r*',xi,yi_nearest,'b-' ); title(' 最邻近插值' );
subplot(2,3,3);
plot(x,y,'r*',xi,yi_linear,'b-' ); title(' 线性插值' ); subplot(2,3,4);
plot(x,y,'r*',xi,yi_spline,'b-' ); title(' 三次样条插值' ); subplot(2,3,5);
plot(x,y,'r*',xi,yi_pchip,'b-' ); title(' 分段三次艾尔米特插值' ); subplot(2,3,6);
plot(x,y,'r*',xi,yi_cubic,'b-' ); title(' 三次多项式插值' );
(2).二维插值:第一类,二维网格数据插值zi=interp2(x,y,z,xi,yi ,’method ’), 其中x ,y 为数据采样点,即为真实所测得的数据,返回值为xi ,yi 的插值函数值。 method 与一维插值相同。
各个方法所得的插值效果和代码如下:
clear;clc;
[x,y]=meshgrid(-3:0.25:3); z=peaks(x,y);
[xi,yi]=meshgrid(-3:0.125:3); z1=interp2(x,y,z,xi,yi,'linear' );
z2=interp2(x,y,z,xi,yi,'nearest' ); z3=interp2(x,y,z,xi,yi,'spline' ); z5=interp2(x,y,z,xi,yi,'cubic' ); subplot(2,2,1); mesh(x,y,z); hold on ;
mesh(xi,yi,z1+15); axis([-3,3,-3,3,-8,25]); title(' 二维网格双线性插值' ); subplot(2,2,2); mesh(x,y,z); hold on ;
mesh(xi,yi,z2+15); axis([-3,3,-3,3,-8,25]); title(' 二维网格最邻近插值' ); subplot(2,2,3); mesh(x,y,z); hold on ;
mesh(xi,yi,z3+15); axis([-3,3,-3,3,-8,25]); title(' 二维网格样条插值' ); subplot(2,2,4); mesh(x,y,z); hold on ;
mesh(xi,yi,z5+15); axis([-3,3,-3,3,-8,25]); title(' 二维网格双三次插值' );
第二类:二维散点数据插值:zi=griddata(x ,y ,z ,xi ,yi ,’method ’),各个输入值与interp2 的相同,不再赘述。Method 为Cubic 不能运行,应采用v4方法进行插值。运行代码的效果图如下:
clear;clc; rand('seed' ,0); x=rand(100,1)*4-2; y=rand(100,1)*4-2; z=x.*exp(-x.^2-y.^2); ti=-2:0.25:2;
[xi,yi]=meshgrid(ti,ti);
z1=griddata(x,y,z,xi,yi,'linear' ); z2=griddata(x,y,z,xi,yi,'cubic' ); z3=griddata(x,y,z,xi,yi,'nearest' ); z4=griddata(x,y,z,xi,yi,'v4' ); subplot(2,2,1); mesh(xi,yi,z1); hold on ;
title(' 线性插值' ); plot3(x,y,z,'o' ); subplot(2,2,2); mesh(xi,yi,z2);
hold on ;
plot3(x,y,z,'o' ); title(' 三次插值' ); subplot(2,2,3); mesh(xi,yi,z3); hold on ;
plot3(x,y,z,'o' ); title(' 最邻近插值' ) subplot(2,2,4); mesh(xi,yi,z4); hold on ;
plot3(x,y,z,'o' ); title('v4插值' );
三维插值的matlab 函数有interp3,三维数据网格产生的函数为ndgrid 。若想详细了解,请参考matlab 的help 文档。
(二). 拟合的matlab 函数调用
(1)多项式拟合:一般多项式拟合的目的是找出一组多项式系数ai (i=1 ,2,3,4...n+1)使得多项式
ϕ(x ) =a 1x n +a 2x n -1+a 3x n -2+... +a n +1
能够较好的拟合数据。调用格式如下:
[p,s,mu]=polyfit(x,y,n ), 对x,y 进行n 维多项式最小二乘法拟合,输出结果p 为n+1
个
元素的向量,该向量以维数递减的形式给出拟合多项式系数。s 中包括R,df,normr, 分别表示对x 进行OR 分解三角元素,自由度,残差。Mu 包含两个元素,分别是标准化处理过程中使用的x 的均值和标准差。
(2)非线性最小二乘法
假设有一组数据xi ,yi ,i=1,2,3...n,且已知这组数据满足某一原型函数
ˆ(x ) =f (a , x ) y ,
其中a 为待定系数,最小二乘法的目标就是求出待定系数的值,使得目标函数
ˆ(x i ) ]=min ∑[y i -f (a , xi ) ]2J =min ∑[y i -y
2
a
i =1
a
i =1
n n
为最小。
Matlab 最优化工具箱中的函数为lsqcurvefit ,其调用格式如下:(least squares curve fit) [a,jm]=lsqcurvefit(fun,a0,x,y) fun 为原型函数的matlab 表示,M-文件定义的函数或者是inline
函数表示。a0为最优化的初值,x,y 为原始输入输出向量。调用该函数后返回待定系数向量a 以及在此待定系数下的目标函数值jm 。
(具体的应用过程在例题中展示)
函数lsqnonlin, 用于进行非线性最小二乘法拟合,调用格式为:(least squares nonlinear) X=lsqnonlin(‘fun ’,x0,options)
其中,fun 为拟合函数,(需要提前建立,含待定系数),x0位迭代初值,options 为优化选项,可以缺省。返回值x 的各个分量为fun 中的待求参数的拟合数值。 例题:
1. 某城市一天从0点到24点,每个两个小时测得温度如下:
22,21,19, 18 , 20, 24, 27, 32, 31, 28, 26, 23, 22,使用插值方法估计午时三刻的温度。
clear;clc; x=0:2:24;
y=[22,21,19, 18 , 20, 24, 27, 32, 31, 28, 26, 23, 22]; xi=0:0.1:24;
yi=interp1(x,y,xi,'spline' ); plot(xi,yi,'k-' ); hold on ;
xlabel(' 时间/h'); ylabel(' 温度' ); plot(x,y,'*'); x0=12.75;
y0=interp1(x,y,x0,'spline' )
2. 测得平板表面5×3的网格点处的温度分别如下: 82 81 80 82 84 79 63 61 65 81 84 84 82 85 86 作出平板表面的温度分布曲面
clear;clc; x=1:5; y=1:3;
z=[81 82 80 82 84; 79 63 61 65 81; 82 84 82 85 86 ]; %mesh(x,y,z); xi=1:0.2:5;
xi=xi;%插值的数据应该为一组行向量,一组为列向量 yi=1:0.2:3;
zi=interp2(x,y,z,xi,yi','cubic' ); mesh(xi,yi,zi);
3. 某海域测得一些点(x,y )的深度z (米)由表给出,在矩形区域(75,200)×(-90,150)内画出海底曲面图形,并标识出吃水线为4m ,5m 的船只禁入区。
clear;clc;
x=[129 140 103.5 88 185.5 195 105 157.5 107.5 77 81 162 162 117.5];
y=[7.5 141.5 23 147 22.5 137.5 85.5 -6.5 -81 3 56.5 -66.5 84 -33.5];
z=-[4 8 6 8 6 8 8 9 9 8 8 9 4 9]; [xi,yi]=meshgrid(75:0.5:200,-90:0.5:150);
zi=griddata(x,y,z,xi,yi,'cubic' ); mesh(xi,yi,zi); figure;
v=contour(xi,yi,zi,[-4,-4,-5,-5],'-k' ); % 绘制等高线,运用函数clabel 标识高度
clabel(v);
运行代码级结果如下:
clear;clc; a=1:12;
b=[3.1 3.8 6.9 12.7 16.8 20.5 24.5 25.9 22.0 16.1 10.7 5.4];
plot(a,b,'k*'); %画出散点图,确定拟合函数为多项式函数, 可以进行多次试验,找到最适合的
hold on ; x=polyfit(a,b,4) c=1:0.1:12;
plot(c,(x(1).*c.^4+x(2)*c.^3+x(3).*c.^2+x(4)*c+x(5))); xlabel(' 月份' ); ylabel(' 温度' );
x =
0.0164 -0.5014 4.4809 -10.3850 9.8528
即四次多项式由高次到低次的系数依次为0.0164 -0.5014 4.4809 -10.3850
9.8528,拟合图形如下:
-0. 02kt
y =a +be 5. 已知变量x ,y 之间的函数关系式为, 根据下表数据求得a ,b 的值。
1. 提前编写好函数m 文件
function f=fun9_7(x,t) f=x(1)+x(2)*exp(-0.02*x(3)*t); End
2. 编写主程序: clear;clc;
t=100:100:1000;
c=1e-3*[4.54 4.99 5.35 5.65 5.90 6.10 6.26 6.39 6.50 6.59]; x0=[0.2,0.5,0.05];
a=lsqcurvefit(@fun9_7,x0,t,c) plot(t,c,'*'); hold on ; t1=100:1000;
plot(t1,a(1)+a(2)*exp(-0.02*a(3)*t1));
不同的迭代初值所得的拟合结果不同,可以通过改变初值,在作图确定最佳的拟合数据。
6合金强度与碳含量之间相关。为了根据强度要求,控制碳含量,需要描述合金强度与碳含
a=[0.10 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.20 0.21 0.23];
b=[42.0 41.5 45.0 45.50 45.80 47.50 49.00 55.00 50.00 55.00 55.50 60.00]; plot(a,b,'*');
x1=polyfit(a,b,3) %三次多项式拟合 hold on ; t=0.1:0.01:0.25;
plot(t,x1(1)*t.^3+x1(2)*t.^2+x1(3)*t+x1(4));%四次多项式拟合 figure;
x2=polyfit(a,b,4) plot(a,b,'*'); hold on ;
plot(t,x2(1)*t.^4+x2(2)*t.^3+x2(3)*t.^2+x2(4)*t+x2(5));
三次多项式拟合图形:
四次多项式好拟合图形: