问题在于Matlab虽然非常聪明,但它并不知道你是在处理度数,所以它认为
360 = 0
。因此,我认为你的问题不在于找到重复绘制每360度的方法,而是你正在输入到
interp1
函数中的数据有问题,目前你告诉它在点
(0, 950)
和
(360, 750)
之间有一条直线。请注意保留HTML标签。
最简单但最丑陋的方法是将360添加到较小的值,使得你的度数向量变成如下形式:
degrees = [340 350 360 361 370 380 390 395 394 396 398]
然后从 degrees
和 yinterp1
向量中减去 360:
clear all;clc;
h=2000;
x=0:1000:10000;
degrees=[340 350 360 361 370 380 390 395 394 396 398];
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;
limitDegrees = 180;
x=0:1000:10000;
degrees=[340 350 360 1 10 20 30 35 34 36 38];
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](https://istack.dev59.com/O5v59.webp)
编辑:更简单的解决方案,只需使用rad2deg(unwrap(deg2rad(degrees)))
,或尝试寻找适用于度数的解包方法。