gpt4 book ai didi

Matlab 重复 x 轴进行插值

转载 作者:太空宇宙 更新时间:2023-11-03 20:33:45 25 4
gpt4 key购买 nike

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

%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 每 360 度重复一次 x 轴和值?

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

最佳答案

问题是 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))),或尝试找到适用于度数的解包。

关于Matlab 重复 x 轴进行插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34730137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com