Matlab重复x轴进行插值

时间:2016-01-11 20:07:17

标签: matlab interpolation

我必须插入风向。每1000 [ft]给出一次数据。例如:

%winddata input in feet en degrees
x=0:1000:10000;
grad=[340 350 360 1 10 20 30 35 34 36 38]; 

插值效果很好,我使用的功能是interp1。 (请参阅下面的代码。)但是,从360度到1度的步骤是个问题。我希望Matlab直接(顺时针)从360度到1度插值,而不是逆时针插入从360-359-358 -... 3-2-1脱脂的值。插入风向时,这没有意义。

如何命令Matlab重复x轴并每360度重复一次?

clear all;clc;
h=2000;

%winddata input in feet en degrees!
x=0:1000:10000;
degrees=[340 350 360 1 10 20 30 35 34 36 38];    

%conversion to SI:
x=0.3048*x;
u=0:1:max(x);

yinterp1 = interp1(x,degrees,u,'linear');

figure(3)
plot(degrees,x,'bo',yinterp1,u,'-r')
xlabel('wind direction [degrees]') 
ylabel('height [m]')
title 'windspeed lineair interpolated with function interp'

wind direction interpolation, the 360->1 degrees jump is the problem

1 个答案:

答案 0 :(得分:2)

问题在于Matlab虽然很聪明,却没有意识到你正在使用学位,所以它没有理由360 = 0。因此,我相信你的问题不是找到一种方法来重复每360度的情节,而是用你正在输入interp1函数的数据,因为目前你告诉它有直的点(0, 950)(360, 750)之间的一条线。

最简单但最丑陋的方法是将360添加到较低的值,因此您的度数向量为:

degrees = [340 350 360 361 370 380 390 395 394 396 398];

然后从degreesyinterp1向量中减去360:

clear all;clc;
h=2000;

%winddata input in feet en degrees!
x=0:1000:10000;
degrees=[340 350 360 361 370 380 390 395 394 396 398];    

%conversion to SI:
x=0.3048*x;
u=0:1:max(x);

yinterp1 = interp1(x,degrees,u,'linear');

figure(3)
plot(degrees-360,x,'bo',yinterp1-360,u,'-r')
xlabel('wind direction [degrees]') 
ylabel('height [m]')
title 'windspeed lineair interpolated with function interp'
xlim([-180 180]);

这方面的一个明显问题是它不能适用于所有情况,但如果你只需要一次,那么效果很好。

对于更通用的解决方案,您可以使用它,以便您手动输入一个点,在该点下面添加360值:

clear all;clc;
h=2000;

% --------------------- Manual cutoff for rectification -------------------
limitDegrees = 180;
% -------------------------------------------------------------------------
%winddata input in feet en degrees!
x=0:1000:10000;
degrees=[340 350 360 1 10 20 30 35 34 36 38];   

%conversion to SI:
x=0.3048*x;
u=0:1:max(x);


indecesTooSmall = find(degrees <= limitDegrees);
oneVec = zeros(size(degrees));

oneVec(indecesTooSmall) = 1;

vecToAdd = 360*ones(size(degrees));
vecToAdd = vecToAdd .* oneVec;

newDegrees = degrees + vecToAdd;

yinterp1 = interp1(x,newDegrees,u,'linear');

figure(3)
plot(newDegrees-360,x,'bo',yinterp1-360,u,'-r')
xlabel('wind direction [degrees]') 
ylabel('height [m]')
title 'windspeed lineair interpolated with function interp'
xlim([-180 180]);

上述两种解决方案均提供以下内容:

Correct plot

编辑:基本上更容易解决方案,只需使用rad2deg(unwrap(deg2rad(degrees))),或尝试找到适用于度数的展开。