2023年6月29日发(作者:)
Matlab及Python实现插值——季度变⽉度⼀维插值(python)插值不同于拟合。插值函数经过样本点,拟合函数⼀般基于最⼩⼆乘法尽量靠近所有样本点穿过。常见插值⽅法有拉格朗⽇插值法、分段插值法、样条插值法。拉格朗⽇插值多项式:当节点数n较⼤时,拉格朗⽇插值多项式的次数较⾼,可能出现不⼀致的收敛情况,⽽且计算复杂。随着样点增加,⾼次插值会带来误差的震动现象称为龙格现象。分段插值:虽然收敛,但光滑性较差。样条插值:样条插值是使⽤⼀种名为样条的特殊分段多项式进⾏插值的形式。由于样条插值可以使⽤低阶多项式样条实现较⼩的插值误差,这样就避免了使⽤⾼阶多项式所出现的龙格现象,所以样条插值得到了流⾏。import numpy as npfrom scipy import interpolateimport pylab as pl#linspace⽣成等差数列,(起点,终点,元素个数默认50个)x=ce(0,10,11)print(x)y=(x)xnew=ce(0,10,31)print(xnew)(x,y,"ro")for kind in ["nearest","zero","slinear","quadratic","cubic"]:#插值⽅式 #"nearest","zero"为阶梯插值 #slinear
线性插值 #"quadratic","cubic"
为2阶、3阶B样条曲线插值 f=1d(x,y,kind=kind) # ‘slinear’, ‘quadratic’ and ‘cubic’ refer to a spline interpolation of first, second or third order) ynew=f(xnew) (xnew,ynew,label=str(kind))(loc="lower right")()⼀维插值(matlab)MATLAB中的插值函数为interp1,其调⽤格式为: yi= interp1(x,y,xi,‘method’)其中x,y为插值点,yi为在被插值点xi处的插值结果;x,y为向量,'method’表⽰采⽤的插值⽅法,MATLAB提供的插值⽅法有⼏种:'nearest’是最邻近插值, 'linear’线性插值; 'spline’三次样条插值; 'pchip’⽴⽅插值.缺省时表⽰线性插值注意:所有的插值⽅法都要求x是单调的,并且xi不能够超过x的范围。%linspace⽣成等差数列,(起点,终点,元素个数默认50个)n = 10;%元素个数x = linspace(1,10,n);
y = sin(x);
xx = linspace(1,10,(n-1)*3+1);
% interp1对sin函数进⾏分段线性插值,调⽤interp1的时候,默认的是分段线性插值
y1 = interp1(x,y,xx,'linear');
subplot(2,2,1);
plot(x,y,'ro',xx,y1,'*b')
title('分段线性插值')
% 临近插值
y2 = interp1(x,y,xx,'nearest');
subplot(2,2,2);
plot(x,y,'ro',xx,y2,'*b')
title('临近插值')
%球⾯线性插值
y3 = interp1(x,y,xx,'spline');
subplot(2,2,3);
plot(x,y,'ro',xx,y3,'*b')
title('球⾯插值')
%三次多项式插值法
y4 = interp1(x,y,xx,'pchip');
subplot(2,2,4);
plot(x,y,'ro',xx,y4,'*b')
title('三次多项式插值') %{
例如:在⼀ 天24⼩时内,从零点开始每间隔2⼩时测得的环境温度数据分别为
12,9,9,1,0,18 ,24,28,27,25,20,18,15,13,
推测中午12点(即13点)时的温度.
%}
x = 0:2:24;
y = [12 9 9 10 18 24 28 27 25 20 18 15 13];
a = 13;
y1 = interp1(x,y,a,'spline')
% 结果为: 27.8725
% 若要得到⼀天24⼩时的温度曲线,则:
xi = 0:1/6:24;
% 插值点可以是向量,则返回的也就是对应的向量
yi = interp1(x,y,xi, 'spline');
plot(x,y,'ro' ,xi,yi,'b.');
季度数据变⽉度数据clear ally=xlsread('',1,'B1:B18'); %读⼊原始季度数据q = 18;%18个季度数据m = (q-1)*3+1;%季度数据个数变⽉度数据个数%linspace⽣成等差数列,(起点,终点,元素个数默认50个)x = linspace(1,m,q);
xx = linspace(1,m,m);
% 季度变⽉度
% interp1对sin函数进⾏分段线性插值,调⽤interp1的时候,默认的是分段线性插值
y1 = interp1(x,y,xx,'linear');
subplot(2,2,1);
plot(x,y,'ro',xx,y1,'*b')
title('分段线性插值')
% 临近插值
y2 = interp1(x,y,xx,'nearest');
subplot(2,2,2);
plot(x,y,'ro',xx,y2,'*b')
title('临近插值')
%球⾯线性插值
y3 = interp1(x,y,xx,'spline');
subplot(2,2,3);
plot(x,y,'ro',xx,y3,'*b')
title('球⾯插值')
%三次多项式插值法
y4 = interp1(x,y,xx,'pchip');
subplot(2,2,4);
plot(x,y,'ro',xx,y4,'*b')
title('三次多项式插值')
xlswrite('',y3',1,'C1')
发布者:admin,转转请注明出处:http://www.yc00.com/news/1687976917a62796.html
评论列表(0条)