1

我的目标是找到波高和波长的最大值。

dwcL01虽然dwcL10<3001x2 double>具有数值波模型输出的数组。

我的脚本的一部分:

%% Plotting results from SWASH
% Examination of phase velocity on deep water with different number of layers
% Wave height 3 meters, wave peroid 8 sec on a depth of 30 meters
clear all; close all; clc;
T=8;
L0=1.56*T^2;

%% Loading results tabels.
load dwcL01.tbl; load dwcL02.tbl; load dwcL03.tbl; load dwcL04.tbl;
load dwcL05.tbl; load dwcL06.tbl; load dwcL07.tbl; load dwcL08.tbl;
load dwcL09.tbl; load dwcL10.tbl;
M(:,:,1) = dwcL01; M(:,:,2) = dwcL02; M(:,:,3) = dwcL03; M(:,:,4) = dwcL04;
M(:,:,5) = dwcL05; M(:,:,6) = dwcL06; M(:,:,7) = dwcL07; M(:,:,8) = dwcL08;
M(:,:,9) = dwcL09; M(:,:,10) = dwcL10;

%% Finding position of wave crest using diff and sign.
for i=1:10
    Tp(:,1,i) = diff(sign(diff([M(1,2,i);M(:,2,i)]))) < 0;
    Wc(:,:,i) = M(Tp,:,i);
    L(:,i) = diff(Wc(:,1,i))
end

如果数据“平滑”,这可以很好地找到最大值。下图显示了我的数据的一部分。当我只需要周围的一个时,我得到了所有的峰值x = 40。我如何过滤,所以我只得到“真正的”波峰。解决方案需要通用,以便在我更改域大小、波高或波周期时它仍然有效。

dwcL02

4

2 回答 2

1

如果您基本上是想将此数据曲线拟合为正弦波,您是否考虑过执行傅里叶分析(Matlab 中的 FFT),然后检查该基频的幅度?频率会告诉你波的间距和高度的大小,当在多个时期使用时会找到一个平均值。有关用法示例,请参见Matlab 帮助页面,但基本要点是:

y = [...] %vector of wave data points
N=length(y); %Make sure this is an even number
Y = fft(y); %Convert into frequency domain

figure;
plot(y(1:N)); %Plot original wave data
figure;
plot(abs(Y(1:N/2))./N); %Plot only the lower half of frequencies to hide aliasing
于 2013-10-16T21:23:08.983 回答
0

我还有另一种可能对您有用的解决方案。它涉及使用 5 点中心差分而不是 2 点有限差分来计算二阶导数。使用diff两次时,您连续执行两个一阶导数(有限的 2 点差),它们非常容易受到噪声/振荡的影响。使用高阶近似的优点是相邻点有助于滤除小振荡,这可能适用于您的情况。

f(:) = squeeze(M(:,2,i))是数据点的数组,h是点之间的均匀间距:

%Better approximation of the 2nd derivative using neighboring points:
for j=3:length(f)-2
    Tp(j,i) = (-f(j-2) + 16*f(j-1) - 30*f(j) + 16*f(j+1) - f(j+2))/(12*h^2);
end

请注意,由于此二阶导数需要左右 2 个相邻点,因此循环的范围必须从第 3 个索引开始,并在数组长度短 2 处结束。

于 2013-10-19T20:34:18.340 回答