利用MATLAB解水下频散方程

clear all;close all;

tic

% z0=680;%入射深度

dz=1;%深度分辨率

w=800;%初始化角频率

z1=[0.0;150.0;305.0;533.0;610.0;680.0;762.0;1372.0;1829.0;3048.0;4000.0];%已知点

z=0:dz:4000;%按深度分辨率生成深度矩阵

c1=[1507.2;1498.1;1491.7;1480.7;1478.9;1478.0;1478.6;1483.2;1488.6;1507.5;1523.0];

%已知点速度

c= interp1(z1,c1,z,'linear');

k=w./c;%波束

 

% figure(1)

% plot(c,z);title('声速垂直分布');set(gca,'ydir','reverse');set(gca,'XAxisLocation','top');

 

[~,low]=min(c);%找声速最小值 low为声速最小值位置

z0=z(low);

kmax=k(low);

kmin=k(1);%若比k(1)还小 就不会在海面以下翻转

c0=c(z0/dz+1);%初始声速

 

ksi0=kmin;%恰好在上表面翻转的 是表面cosa=1 求得极限情况下的水平波束;

h1=1;

h2=find(k(low:end)<=ksi0,1,'first')+low-1;

 

kz=sqrt(k(h1:h2).^2-ksi0^2);

 

fl=2*sum(dz.*kz);%直接全范围一阶数值积分

 

N=1;%至少一阶 不考虑0阶

while fl>(-pi+2*(N+1)*pi)

    N=N+1;

end%N不行的时候退出 即N+1 正好对应N+1个

 

ksi=zeros(1,N);

for n=1:N

    ma=kmax;mi=kmin;e=(ma-mi)/2;

   

    while e>0.000001 %二分法

       

        ksi(n)=(ma+mi)/2;

       

        h1=find(k(1:low)<=ksi(n),1,'last');

        h2=find(k(low:end)<=ksi(n),1,'first')+low-1;%最靠近发射位置的两个

 

        kz=sqrt(k(h1:h2).^2-ksi(n)^2);

        fl=2*sum(dz.*kz);

  

        if  fl<(2*n-1)*pi

            ma=ksi(n);

            e=(ma-mi)/2;

        elseif fl>(2*n-1)*pi

            mi=ksi(n);

            e=(ma-mi)/2;

        else%考虑等于0 几率极小 可去掉可简化

            e=0;

            break

        end

       

    end

%     sprintf('ξ(%d)=%f',n,ksi(n))

 

end

sprintf("新耗时:%f",toc)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值