大家好,又见面了,我是你们的朋友全栈君。
x=0:2*pi;
y=sin(x);
xx=0:0.5:2*pi;
%interp1对sin函数进行分段线性插值,调用interp1的时候,默认的是分段线性插值
y1=interp1(x,y,xx);
figure
plot(x,y,'o',xx,y1,'r')
title('分段线性插值')
%临近插值
y2=interp1(x,y,xx,'nearest');
figure
plot(x,y,'o',xx,y2,'r');
title('临近插值')
%球面线性插值
y3=interp1(x,y,xx,'spline');
figure
plot(x,y,'o',xx,y3,'r')
title('球面插值')
%三次多项式插值法
y4=interp1(x,y,xx,'cubic');
figure
plot(x,y,'o',xx,y4,'r');
title('三次多项式插值')
(1) Nearest方法速度最快,占用内存最小,但一般来说误差最大,插值结果最不光滑。
(2) Spline三次样条插值是所有插值方法中运行耗时最长的,插值函数及其一二阶导函数都连续,是最光滑的插值方法。占用内存比cubic方法小,但是已知数据分布不均匀的时候可能出现异常结果。
(3) Cubic三次多项式插值法中,插值函数及其一阶导数都是连续的,所以插值结果比较光滑,速度比Spline快,但是占用内存最多。
语法形式 |
说明 |
y=interp1(x,Y,xi) |
由已知点集(x,Y)插值计算xi上的函数值 |
y=interp1(x,Y,xi) |
相当于x=1:length(Y)的interp(x,Y,xi) |
y=interp1(x,Y,xi,method) |
用指定插值方法计算插值点xi上的函数值 |
y=interp1(x,Y,xi,method,’extrap’) |
对xi中超出已知点集的插值点用指定插值方法计算函数值 |
y=interp1(x,Y,xi,method,’extrap’,extrapval) |
用指定方法插值xi上的函数值,超出已知点集处函数值取extrapval |
y=interp1(x,Y,xi,method,’pp’) |
用指定方法插值,但返回结果为分段多项式 |
Method |
方法描述 |
‘nearest’ |
最邻近插值:插值点处函数值与插值点最邻近的已知点函数值相等 |
‘liner’ |
分段线性插值:插值点处函数值由连接其最邻近的两侧点的线性函数预测。Matlab中interp1的默认方法。 |
‘spline’ |
样条插值:默认为三次样条插值。可用spline函数替代 |
‘pchip’ |
三次Hermite多项式插值,可用pchip函数替代 |
‘cubic’ |
同’pchip’,三次Hermite多项式插值 |
更新日志2020-11-3
有个小老弟问我,怎么把这个插值函数获取到,后续调用,然后去看了一眼官方文档,有一句话
pp = interp1(x,v,method,'pp')
分段多项式,以可传递到 ppval
函数进行计算的结构体的形式返回。
也就是说这个插值函数可以使用上述代码获取到函数,然后使用ppval执行这个函数在某个特定位置的插值结果,比如
%test interpolate
clear;clc;close all
N=1200;
x = 1:0.5:6;
y = sin(x);
pp = interp1(x,y,'pchip','pp');
xq= 1:0.1:6;
result = ppval(pp,xq);
plot(x,y,'o',xq,result,'-.')
上述代码就是将函数以`pp`变量返回,然后使用ppval调用此函数,获取在xq处的值
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/130663.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...