Matlab及Python实现插值——季度变⽉度
⼀维插值(python)
插值不同于拟合。插值函数经过样本点,拟合函数⼀般基于最⼩⼆乘法尽量靠近所有样本点穿过。常见插值⽅法有拉格朗⽇插值法、分段插值法、样条插值法。
拉格朗⽇插值多项式:当节点数n较⼤时,拉格朗⽇插值多项式的次数较⾼,可能出现不⼀致的收敛情况,⽽且计算复杂。随着样点增加,⾼次插值会带来误差的震动现象称为龙格现象。
分段插值:虽然收敛,但光滑性较差。
样条插值:样条插值是使⽤⼀种名为样条的特殊分段多项式进⾏插值的形式。由于样条插值可以使⽤低阶多项式样条实现较⼩的插值误差,这样就避免了使⽤⾼阶多项式所出现的龙格现象,所以样条插值得到了流⾏。
import numpy as np
from scipy import interpolate
import pylab as pl
#linspace⽣成等差数列,(起点,终点,元素个数默认50个)
x=np.linspace(0,10,11)
print(x)
y=np.sin(x)
xnew=np.linspace(0,10,31)
print(xnew)
pl.plot(x,y,"ro")
for kind in["nearest","zero","slinear","quadratic","cubic"]:#插值⽅式
#"nearest","zero"为阶梯插值
#slinear 线性插值
#"quadratic","cubic" 为2阶、3阶B样条曲线插值
f=interpolate.interp1d(x,y,kind=kind)
# ‘slinear’, ‘quadratic’ and ‘cubic’ refer to a spline interpolation of first, second or third order)
ynew=f(xnew)
pl.plot(xnew,ynew,label=str(kind))
pl.legend(loc="lower right")
pl.show()
⼀维插值(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.');
季度数据变⽉度数据
y=xlsread('jidu.xlsx',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('球⾯插值')
linspace函数调用的格式为%三次多项式插值法
y4 = interp1(x,y,xx,'pchip');
subplot(2,2,4);
plot(x,y,'ro',xx,y4,'*b')
title('三次多项式插值')
xlswrite('jidu.xlsx',y3',1,'C1')
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论