应用射线声学相关知识 使用MATLAB模拟水下声传播 以单层恒定梯度介质为例
较为简陋 欢迎同学们讨论
存在一些问题 例如
映射关系不同带来的不同声线沿x方向长度不同
因定z刻度 转折点处导数相对大 存在明显计算误差的
也没有使用周期延拓 来减少计算量
有一些解决办法 想先看看同学们的想法 就先发了出来
clear all;close all;
z0=200;%入射深度
dz=0.5;%深度分辨率
dx=1;%水平分辨率
da0=2;%入射角间隔
da=0.1;%角度分辨率
% z1=[0,300,550,1100,2000,5000];%已知点
z=0:dz:5000;%按深度分辨率生成深度矩阵
% c1=[1530,1500,1480,300,1500,1552];%已知点速度
% c= interp1(z1,c1,z,'linear');
b=0.1;
c=1400+b*z;
figure(1)
plot(c,z);title('声速垂直分布');set(gca,'ydir','reverse');set(gca,'XAxisLocation','top');
c0=c(z0/dz+1);%初始声速
xi=zeros(1,10000);%初始化x矩阵
figure(2);hold on;
for a0=(2:da0:30)*pi/180%向下(正方向)入射角
cosa0=cos(a0);
cosa=c.*cosa0./c0;%生成随深度的cos矩阵
cosa(cosa>1)=1;%都意义
a=acos(cosa);%生成随深度的角度矩阵
flag=1;
i=z0/dz+2;
for j=2:length(xi)-1
xi(j)=dz/tan((a(i)+a(i-flag))/2);%相对距离
xi(j)=xi(j-1)+xi(j);%绝对距离
xi(j)=round(xi(j)./dx).*dx;%按分辨率取整
plot([xi(j-1),xi(j)],[z(i-flag),z(i)],'b')
%stem(xi(j),z(i),'filled')
if a(i)==0 || i==1
flag=-1*flag;%翻转条件
end
if i>=length(z)%超出矩阵维度处理
break
end
i=i+flag;
end
end
for a0=(-2:-da0:-30)*pi/180%向上(负方向)入射角
cosa0=cos(a0);
cosa=c.*cosa0./c0;%生成随深度的cos矩阵
cosa(cosa>1)=1;%都意义
a=acos(cosa);%生成随深度的角度矩阵
flag=-1;
i=z0/dz;
for j=2:length(xi)-1
xi(j)=dz/tan((a(i)+a(i-flag))/2);%相对距离
xi(j)=xi(j-1)+xi(j);%绝对距离
xi(j)=round(xi(j)./dx).*dx;%按分辨率取整
plot([xi(j-1),xi(j)],[z(i-flag),z(i)],'b')
%stem(xi(j),z(i),'filled')
if a(i)==0 || i==1%翻转条件
flag=-1*flag;
end
if i>=length(z)%超出矩阵维度处理
break
end
i=i+flag;
end
end
set(gca,'ydir','reverse');
hold off;