水下声传输线 绘制

应用射线声学相关知识 使用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;

 

 

你可能感兴趣的:(水下声传输线 绘制)