线性叠加法
海浪可看做一系列不同周期不同初相位的线性波叠加而成的:
,
为第个组成波的振幅,为第个组成波的波数和圆频率。为之间的随机数,代表随机相位。假设靶谱的能量大多分布在区间,其他部分可忽略不计。将该区间平分为M个子区间,其间距为,取
,
则将代表M个区间波能的M个线性波叠加起来,可得到海浪波面:
,
式中为第i个组成波的代表频率。
程序
% Randam wave simulation
% Designed by: JN-Cui
% Modified on 12/09/2019
%% DEFINITIONS
% alpha - energy scale factor; gama - spectral peak elevation factor;
% omega_m - spectral peak circular frequency; f_m - spectral peak frequency;
% U - wind speed at 10 m above sea surface; H_s - significant wave height;
% g - gravity acceleration;
%% FOR AVERAGE JONSWAP SPECTRAL
% gama=3.3; k=83.7; sigma_a=0.07; sigma_b=0.09;
% alpha=0.076*(X_bar)^(-0.22);
% X_bar=10^(-1)~20^(5); omega_m=22(g/U)*(X_bar)^(-0.33);
% f_m=3.5(g/U)(X_bar)^(-0.33);
%% FUNCTION
function [W_s,R_c,Slope,t,x,Omega,S,ffff,mag,T_m]=random_wave_v1_0(H_s,T_s,dm,dt,T,dx,X)
[S,Omega,omega_p,T_m]=Improved_Jonswap_spectral(H_s,T_s,dm);
d=2000;
g=9.8;
N=200;
M=T/dt;
e=rand(1,N)*2*pi;
w=0:max(Omega)/(N-1):max(Omega);
ww(N)=max(w);
LT1=length(w);
LT2=M;
LT3=M;
for i=1:N-1
ww(i)=unifrnd(w(i),w(i+1));
end
ww(N)=w(N);
Wait=waitbar(0,'程序计算中,请稍后', 'CreateCancelBtn','setappdata(gcbf,''canceling'',1)');
setappdata(Wait,'canceling',0);
SS_o=zeros(1,length(w));
f=zeros(1,length(w));
T_w=zeros(1,length(w));
K=zeros(1,length(w));
k=zeros(1,length(w));
a=zeros(1,length(w));
L=zeros(1,length(w));
% for i=1:length(w)
for i=1:N
waitbar(i/(LT1+LT2+LT3));
if getappdata(Wait,'canceling')
break
end
SS_o(i)=S_Improved_Jonswap_spectral(ww(i),H_s,T_s,dm);
f(i)=ww(i)/2/pi;
T_w(i)=1/f(i);
K(i)=g*T_w(i)^2/(2*pi);
fun=@(L1) L1/tanh(2*pi/L1*d)-K(i);
L(i)=Division(fun,0.0001,0,K(i));
k(i)=(2*pi/L(i));
a(i)=sqrt(2*SS_o(i)*(w(2)-w(1)));
end
% Time steps
t=zeros(1,M);
for i=1:M
t(i)=(i-1)*dt;
end
eta=zeros(N,1);
NN=floor(X/dx)+1;
x=0:dx:X;
Eta=zeros(M,NN-1);
for j=1:M
waitbar((j+LT1)/(LT1+LT2+LT3));
if getappdata(Wait,'canceling')
break
end
for ii=1:NN
Eta(j,ii)=sum(a.*cos(k.*x(ii)-ww.*t(j)+e));
end
end
%%
% Wave Surface
W_s=Eta;
delete(Wait);
end
来源:CSDN
作者:Jr.Cui
链接:https://blog.csdn.net/Nick_Cui/article/details/103464248