zoukankan      html  css  js  c++  java
  • 电磁波模型

    一、1、插值函数

    clear all
    x=0:2*pi;  
    y=sin(x);  
    xx=0:0.5:2*pi;  
    
    %interp1对sin函数进行分段线性插值,调用interp1的时候,默认的是分段线性插值  
    y1=interp1(x,y,xx);  
    figure  
    plot(x,y,'o',xx,y1,'*')  
    title('分段线性插值') 
    legend('初始值','分段线性插值')
      
    %临近插值  
    y2=interp1(x,y,xx,'nearest');  
    figure  
    plot(x,y,'o',xx,y2,'*');  
    title('临近插值')  
     legend('初始值','临近插值') 
     
    %球面线性插值  
    y3=interp1(x,y,xx,'spline');  
    figure  
    plot(x,y,'o',xx,y3,'*')  
    title('球面插值')  
    legend('初始值','球面插值')  
    
    %三次多项式插值法  
    y4=interp1(x,y,xx,'cubic');  
    figure  
    plot(x,y,'o',xx,y4,'*');  
    title('三次多项式插值') 
    legend('初始值','三次多项式插值')
    

    二、

    1、射线模型

    %program:Ray tracing routines 蒸发波导射线模型
    clc;close;clear
    %%
    %************************************初始化模型**************************
    %-----------基本参数-----------
    tx_height=27;%天线高度(m)
    rmax_user=50*1e3;%传输范围(m)
    zmax_user=60;%最大高度(m)???
    zdelta=0.5;%步进值(m)
    height=(0:floor(zmax_user*2/zdelta))*zdelta;%离散高度
    %-----------蒸发波导--------
    M1=[0 315;40 295;100 302];%修正折射率剖面????线性的修正折射率剖面。波导仿真的修改条件
    m1=interp1(M1(:,1),M1(:,2),height,'linear','extrap')*1e-6+1;%插值法,从修正折射率剖面到修正折射指数(1.00025~1.0004)
    g1=(m1(2:end)-m1(1:end-1))/zdelta;%计算梯度 g值
    %----------输入期望角度--------
    angle=[4.6/1000;3.7/1000;3.6/1000;-3.6/1000;-3.7/1000;-4.6/1000;];%逆时针为正,角度为弧度制(mrad)
    N_angle=6;%角度个数
    %% 
    %**************************开始射线模型计算**************************
    x=zeros(N_angle,10000);
    z=zeros(N_angle,10000);
    steps=zeros(N_angle,1);
    for ii=1:N_angle
        StepNum=1;
        x(ii,StepNum)=0.0;%初始值
        z(ii,StepNum)=tx_height;%天线高度
        theta_i=angle(ii);%角度
        h_i=abs(zdelta);
        while z(ii,StepNum)<=zmax_user && x(ii,StepNum)<=rmax_user %停止条件
            if theta_i >0   %up going 
                deltam=interp1(m1,(z(ii,StepNum)+zdelta)/zdelta+1)-interp1(m1,z(ii,StepNum)/zdelta+1);%折射指数差值
                r=theta_i^2+2*deltam;
                if r>=0
                    h_i=min(zdelta,(floor(z(ii,StepNum)/zdelta)+1)*zdelta-z(ii,StepNum));%?????
                    h_i=max(h_i,0.1*zdelta);%????
                    deltam=interp1(m1,(z(ii,StepNum)+h_i)/zdelta+1)-interp1(m1,z(ii,StepNum)/zdelta+1);%折射指数差值
                    theta_ip1=sqrt(theta_i^2+2*deltam);%出射角
                    StepNum=StepNum+1;
                    z(ii,StepNum)=z(ii,StepNum-1)+h_i;%高度
                    x(ii,StepNum)=x(ii,StepNum-1)+(theta_ip1-theta_i)./(deltam/h_i);%距离
                    theta_i=theta_ip1;
                else
                    theta_ip1=0; %到达上表面折射点
                    h_i=(theta_ip1^2-theta_i^2)./(2*g1(ceil(z(ii,StepNum)/zdelta)));%正
                    StepNum=StepNum+1
                    z(ii,StepNum)=z(ii,StepNum-1)+h_i;
                    x(ii,StepNum)=x(ii,StepNum-1)+(theta_ip1-theta_i)/g1(ceil(z(ii,StepNum-1)/zdelta));
                    theta_i=theta_ip1;
                end
            elseif theta_i<0 % down going 
                deltam=interp1(m1,(z(ii,StepNum)-zdelta)./zdelta+1)-interp1(m1,z(ii,StepNum)./zdelta+1);
                r=theta_i.^2+2*deltam;
                if z(ii,StepNum)<=0 %到达下表面折射点
                    theta_i=-theta_i;
                    StepNum=StepNum+1;
                    z(ii,StepNum)=z(ii,StepNum-1);
                    x(ii,StepNum)=x(ii,StepNum-1);
                elseif r>=0
                    h_i=min(zdelta,z(ii,StepNum)-(ceil(z(ii,StepNum)/zdelta)-1)*zdelta);
                    h_i=max(h_i,0.1*zdelta);
                    deltam=interp1(m1,(z(ii,StepNum)-h_i)/zdelta+1)-interp1(m1,z(ii,StepNum)/zdelta+1);
                    theta_ip1=-sqrt(theta_i^2+2*deltam);
                    StepNum=StepNum+1;
                    z(ii,StepNum)=z(ii,StepNum-1)-h_i;
                    x(ii,StepNum)=x(ii,StepNum-1)+(theta_ip1-theta_i)./(deltam/(-h_i));
                    theta_i=theta_ip1;
                else 
                    theta_ip1=0; 
                    h_i=(theta_ip1^2-theta_i^2)./(2*g1(ceil(z(ii,StepNum)/zdelta)));%正
                    StepNum=StepNum+1;
                    z(ii,StepNum)=z(ii,StepNum-1)-h_i;
                    x(ii,StepNum)=x(ii,StepNum-1)+(theta_ip1-theta_i)/g1(ceil(z(ii,StepNum-1)/zdelta));
                    theta_i=theta_ip1;
                end
            else 
                if g1(ceil(z(ii,StepNum)/zdelta))>0
                    h_i=zdelta;
                    deltam=interp1(m1,(z(ii,StepNum)+h_i)/zdelta+1)-interp1(m1,z(ii,StepNum)/zdelta+1);
                    theta_ip1=sqrt(theta_i^2+2*deltam);
                    StepNum=StepNum+1;
                    z(ii,StepNum)=z(ii,StepNum-1)+h_i;
                    x(ii,StepNum)=x(ii,StepNum-1)+(theta_ip1-theta_i)./(deltam/h_i);
                    theta_i=theta_ip1;
                else
                    h_i=zdelta;
                    deltam=interp1(m1,(z(ii,StepNum)-h_i)/zdelta+1)-interp1(m1,z(ii,StepNum)/zdelta+1);
                    theta_ip1=-sqrt(theta_i^2+2*deltam);
                    StepNum=StepNum+1;
                    z(ii,StepNum)=z(ii,StepNum-1)-h_i;
                    x(ii,StepNum)=x(ii,StepNum-1)+(theta_ip1-theta_i)./(deltam/(-h_i));
                end
            end
        end
        steps(ii)=StepNum;%保存步数
    end
    %% 
    %*********************************轨迹展示****************************
    plot(x(1,1:steps(1)-1)./1000,z(1,1:steps(1)-1),'-ro','LineWidth',1.5);%angle= 4.6 
    hold on
    plot(x(2,1:steps(2)-1)./1000,z(2,1:steps(2)-1),'-cd','LineWidth',1.5);% angle= 3.7 
    plot(x(3,1:steps(3)-1)./1000,z(3,1:steps(3)-1),'-bs','LineWidth',1.5);%angle=3.6
    plot(x(4,1:steps(4)-1)./1000,z(4,1:steps(4)-1),'-gs','LineWidth',1.5);%angle=3.6
    plot(x(5,1:steps(5)-1)./1000,z(5,1:steps(5)-1),'-kd','LineWidth',1.5);%angle=3.7
    plot(x(6,1:steps(6)-1)./1000,z(6,1:steps(6)-1),'-mo','LineWidth',1.5);%angle=4.6 mrad
    
    axis([0 rmax_user/1000 0 zmax_user ])
    set(gca,'fontsize',15,'fontname','Time New Roman')
    set(gca,'xtick',0:5:rmax_user/1000)
    L=legend(' 4.6 mrad',' 3.7 mrad',' 3.6 mrad',' -3.6 mrad',' -3.7 mrad','-4.6 mrad');
    set(L,'fontsize',14,'fontname','Times New Roman','Fontweight','bold')
    xlabel('Range(km)','FontName','Times New Roman','fontsize',16)
    ylabel('Height"(m)','FontName','Times New Roman','fontsize',16)
    

     3、

    %% ray tracing routine
    %发射天线高度6m,发射处波导高度14m,50km处波导高度7m,100公里处波导高度14m。
    close all
    clear 
    tic
    %% 输入计算区域参数
    tx_height = 6; % 天线高度m
    
    rmax_user1=40*1e3;%传输范围(m)
    rmax_user2=80*1e3;
    rmax_user3=125*1e3; % 传播最远距离km
    zmax_user = 100; % 传播最大高度m
    zdelta = 0.25;% 将射线的递进高度步长与剖面的步长一致
    height = (0:floor(zmax_user*2/zdelta))*zdelta;%高度和折射剖面对应
    %% 蒸发波导剖面,0km~50km 伪折射率方法,已知波导高度,求剖面
    evap_const = 1.5e-4; % meter, evaporation duct constant, typical value 空气动力学粗糙度因子
    M0 = 330;%不影响,求的是变化率
    Mdelta = 10; % 波导高度
    M1 = 0.125*(height - Mdelta*log(height./evap_const+1));
    M1 = M0 + M1;% 大气修正折射率
    m1 = M1*1e-6+1;% 大气修正折射指数
    g1 = (m1(2:end)-m1(1:end-1))/zdelta; %梯度
    %% 第二个折射率剖面50~100km剖面 
    evap_const = 1.5e-4; % evaporation duct constant, typical value 空气动力学粗糙度因子
    M0 = 330;
    Mdelta = 14; % 波导高度
    M2 = 0.125*(height - Mdelta*log(height./evap_const+1));
    M2 = M0 + M2;% 大气修正折射率
    m2 = M2*1e-6+1;% 大气修正折射指数
    g2 = (m2(2:end)-m2(1:end-1))/zdelta; 
    %% 第三个折射率剖面 
    evap_const = 1.5e-4; % evaporation duct constant, typical value 空气动力学粗糙度因子
    M0 = 330;
    Mdelta = 20; % 波导高度
    M3 = 0.125*(height - Mdelta*log(height./evap_const+1));
    M3 = M0 + M3;% 大气修正折射率
    m3 = M3*1e-6+1;% 大气修正折射指数
    g3 = (m3(2:end)-m3(1:end-1))/zdelta; 
    %% 角度参数,输入角度是与水平面之间的俯仰角,与grazing angle(入射余角)一样都是与水平面的夹角。内部计算的时候用的是与z轴顺时针的夹角
    angle_start = 0.1; %anticlockwise 逆时针正
    angle_end = -0.1;
    tetadel = 0.002;
    % Ntheta = floor(abs(angle_start-angle_end)/tetadel);% 步进数,角度个数
    angle=[angle_start:-tetadel:angle_end]*pi/180;%度数
    N_angle=length(angle);%角度个数
    %% 
    %****** 射线方程开始 ***********
    x = zeros(N_angle,10000);%距离
    z = zeros(N_angle,10000);%高度
    for ii = 1:N_angle
        StepNum = 1;
        x(ii,StepNum) = 0.0; % 第0步
        z(ii,StepNum) = tx_height;
        theta_i = angle(ii);% 初始出射角,公式里面关于角度的计算都是用的是弧度
        h_i = abs(zdelta); % 初始步长,取参考值
                           % 这里假设出射点不在折射率转折点附近
    %% 
    %********************************
        while z(ii,StepNum) <= zmax_user && x(ii,StepNum)<= rmax_user1% 终止条件,超过计算空间范围
            if theta_i > 0 && theta_i<= (3*pi/180) % = 0.0524 向上传播(怎么来的)3度
                deltam = interp1(m1,(z(ii,StepNum)+zdelta)/zdelta+1)-interp1(m1,z(ii,StepNum)/zdelta+1);
                r = theta_i^2 + 2*deltam;%出射角
                if r>= 0 % 向上传播
                    h_i = min(zdelta,(floor(z(ii,StepNum)/zdelta)+1)*zdelta-z(ii,StepNum));
                    h_i = max(h_i,0.1*zdelta);
                    deltam = interp1(m1,(z(ii,StepNum)+h_i)/zdelta+1)-interp1(m1,z(ii,StepNum)/zdelta+1);
                    theta_ip1 = sqrt(theta_i^2 +2*deltam);
                    StepNum = StepNum+1;
                    z(ii,StepNum) = z(ii,StepNum-1)+ h_i ;%加高度
                    x(ii,StepNum) = x(ii,StepNum-1) + (theta_ip1-theta_i)./(deltam/h_i);
                    theta_i = theta_ip1;
                else % 向上传播的时候发生反转
                    theta_ip1 = 0;% 射线在未到达下一剖面层时已经发生反转,现在需要确定是在多大的高度发生反转
                    h_i = (theta_ip1^2-theta_i^2)./(2*g1(ceil(z(ii,StepNum)/zdelta))); %positive
                    StepNum = StepNum+1;
                    z(ii,StepNum) = z(ii,StepNum-1)+ h_i;
                    x(ii,StepNum) = x(ii,StepNum-1) + (theta_ip1 - theta_i)/ g1(ceil(z(ii,StepNum-1)/zdelta)) ;
                    theta_i = theta_ip1;
                end   
            elseif theta_i<0 && theta_i >= -(3*pi/180)   %向下传播
                deltam = interp1(m1,(z(ii,StepNum)-zdelta)./zdelta+1)-interp1(m1,z(ii,StepNum)./zdelta+1);
                r = theta_i.^2 + 2*deltam;
                if z(ii,StepNum) <= 0 % zdelta % 到达下界面反转
                    theta_i = -theta_i;
                    StepNum = StepNum+1;
                    z(ii,StepNum) = z(ii,StepNum-1);
                    x(ii,StepNum) = x(ii,StepNum-1);
                elseif r>=0
                    h_i = min(zdelta,z(ii,StepNum)-(ceil(z(ii,StepNum)/zdelta)-1)*zdelta);
                    h_i = max(h_i,0.1*zdelta);
                    deltam = interp1(m1,(z(ii,StepNum)-h_i)/zdelta+1)-interp1(m1,z(ii,StepNum)/zdelta+1);
                    theta_ip1 = - sqrt(theta_i^2 +2*deltam);
                    StepNum = StepNum+1;
                    z(ii,StepNum) = z(ii,StepNum-1)- h_i ;
                    x(ii,StepNum) = x(ii,StepNum-1) + (theta_ip1-theta_i)./(deltam/(-h_i));
                    theta_i = theta_ip1;
                elseif r < 0
                    theta_ip1 = 0; % 射线在未到达下一剖面层时已经发生反转,现在需要确定是在多大的高度发生反转
                    h_i = (theta_ip1^2-theta_i^2)./(2*g1(ceil(z(ii,StepNum)/zdelta))); %positive
                    StepNum = StepNum+1;
                    z(ii,StepNum) = z(ii,StepNum-1)- h_i;
                    x(ii,StepNum) = x(ii,StepNum-1) + (theta_ip1 - theta_i)/ g1(ceil(z(ii,StepNum-1)/zdelta)) ;
                    theta_i = theta_ip1; 
                end
            elseif theta_i > (3*pi/180) % 0.0524  
                h_i = zdelta;
                m_i = interp1(m1,(z(ii,StepNum))/zdelta+1);
                m_ip1 = interp1(m1,(z(ii,StepNum)+h_i)/zdelta+1);
                re = 6370*1e3; % 地球半径
                StepNum = StepNum + 1;
                z(ii,StepNum) = z(ii,StepNum-1) + h_i;
                x(ii,StepNum) = x(ii,StepNum-1) + re/(re+z(ii,StepNum))*m_i*cos(theta_i)*h_i/sqrt(m_ip1^2-(m_i*cos(theta_i))^2);
                theta_ip1 = atan(h_i/(x(ii,StepNum)-x(ii,StepNum-1))); 
                theta_i = theta_ip1;     
            elseif theta_i < -(3*pi/180) % 0.0524 
                if z(ii,StepNum)>= zdelta
                   h_i = zdelta;
                   m_i = interp1(m1,(z(ii,StepNum))/zdelta+1);
                   m_ip1 = interp1(m1,(z(ii,StepNum)-h_i)/zdelta+1);
                   re = 6370*1e3; % 地球半径
                   StepNum = StepNum + 1;
                   z(ii,StepNum) = z(ii,StepNum-1) - h_i;
                   x(ii,StepNum) = x(ii,StepNum-1) + re/(re+z(ii,StepNum))*m_i*cos(theta_i)*h_i/sqrt(m_ip1^2-(m_i*cos(theta_i))^2);
                   theta_ip1 = -atan(h_i/(x(ii,StepNum)-x(ii,StepNum-1)));  
                   theta_i = theta_ip1;
                else 
                    theta_i = -theta_i;
                    StepNum = StepNum+1;
                    x(ii,StepNum) = x(ii,StepNum-1);
                    z(ii,StepNum) = z(ii,StepNum-1);
                end
             elseif theta_i == 0
                if g1(ceil(z(ii,StepNum)/zdelta))>0 % 继续向上走一步
                   h_i = zdelta;
                   deltam = interp1(m1,(z(ii,StepNum)+h_i)/zdelta+1)-interp1(m1,z(ii,StepNum)/zdelta+1);
                   theta_ip1 = sqrt(theta_i^2 +2*deltam);
                   StepNum = StepNum+1;
                   z(ii,StepNum) = z(ii,StepNum-1)+ h_i ;
                   x(ii,StepNum) = x(ii,StepNum-1) + (theta_ip1-theta_i)./(deltam/h_i);
                   theta_i = theta_ip1;
                else 
                % 继续向下走一步
                   h_i = zdelta;
                   deltam = interp1(m1,(z(ii,StepNum)-h_i)/zdelta+1)-interp1(m1,z(ii,StepNum)/zdelta+1);
                   theta_ip1 = -sqrt(theta_i^2 +2*deltam);
                   StepNum = StepNum+1;
                   z(ii,StepNum) = z(ii,StepNum-1)- h_i ;
                   x(ii,StepNum) = x(ii,StepNum-1) + (theta_ip1-theta_i)./(deltam/(-h_i));
                   theta_i = theta_ip1;
                end  
            end
        end
    %%
    % ***********************           
        while z(ii,StepNum)<=zmax_user && x(ii,StepNum)>rmax_user1 && x(ii,StepNum)<=rmax_user2
             if theta_i > 0 && theta_i<= (3*pi/180)
                deltam = interp1(m2,(z(ii,StepNum)+zdelta)/zdelta+1)-interp1(m2,z(ii,StepNum)/zdelta+1);
                r = theta_i^2 + 2*deltam;
                if r>= 0 
                    h_i = min(zdelta,(floor(z(ii,StepNum)/zdelta)+1)*zdelta-z(ii,StepNum));
                    h_i = max(h_i,0.1*zdelta);
                    deltam = interp1(m2,(z(ii,StepNum)+h_i)/zdelta+1)-interp1(m2,z(ii,StepNum)/zdelta+1);
                    theta_ip1 = sqrt(theta_i^2 +2*deltam);
                    StepNum = StepNum+1;
                    z(ii,StepNum) = z(ii,StepNum-1)+ h_i ;
                    x(ii,StepNum) = x(ii,StepNum-1) + (theta_ip1-theta_i)./(deltam/h_i);
                    theta_i = theta_ip1;
                else % 向上传播的时候发生反转
                    theta_ip1 = 0;% 射线在未到达下一剖面层时已经发生反转,现在需要确定是在多大的高度发生反转
                    h_i = (theta_ip1^2-theta_i^2)./(2*g2(ceil(z(ii,StepNum)/zdelta+0.01))); %positive
                    StepNum = StepNum+1;
                    z(ii,StepNum) = z(ii,StepNum-1)+ h_i;
                    x(ii,StepNum) = x(ii,StepNum-1) + (theta_ip1 - theta_i)/ g2(ceil(z(ii,StepNum-1)/zdelta+0.01)) ;
                    theta_i = theta_ip1;
                end     
             elseif theta_i<0 && theta_i >= -(3*pi/180)   %向下传播
                deltam = interp1(m2,(z(ii,StepNum)-zdelta)./zdelta+1)-interp1(m2,z(ii,StepNum)./zdelta+1);
                r = theta_i.^2 + 2*deltam;
                if z(ii,StepNum) <= 0 %zdelta % 到达下界面反转
                    theta_i = -theta_i;
                    StepNum = StepNum+1;
                    z(ii,StepNum) = z(ii,StepNum-1);
                    x(ii,StepNum) = x(ii,StepNum-1);
                elseif r>=0
                    h_i = min(zdelta,z(ii,StepNum)-(ceil(z(ii,StepNum)/zdelta)-1)*zdelta);
                    h_i = max(h_i,0.1*zdelta);
                    deltam = interp1(m2,(z(ii,StepNum)-h_i)/zdelta+1)-interp1(m2,z(ii,StepNum)/zdelta+1);
                    theta_ip1 = - sqrt(theta_i^2 +2*deltam);
                    StepNum = StepNum+1;
                    z(ii,StepNum) = z(ii,StepNum-1)- h_i ;
                    x(ii,StepNum) = x(ii,StepNum-1) + (theta_ip1-theta_i)./(deltam/(-h_i));
                    theta_i = theta_ip1;
                elseif r < 0
                    theta_ip1 = 0;% 射线在未到达下一剖面层时已经发生反转,现在需要确定是在多大的高度发生反转
                    h_i = (theta_ip1^2-theta_i^2)./(2*g2(ceil(z(ii,StepNum)/zdelta))); %positive
                    StepNum = StepNum+1;
                    z(ii,StepNum) = z(ii,StepNum-1)- h_i;
                    x(ii,StepNum) = x(ii,StepNum-1) + (theta_ip1 - theta_i)/ g2(ceil(z(ii,StepNum-1)/zdelta)) ;
                    theta_i = theta_ip1; 
                end    
             elseif theta_i > (3*pi/180) % 0.0524        
                h_i = zdelta;
                m_i = interp1(m2,(z(ii,StepNum))/zdelta+1);
                m_ip1 = interp1(m2,(z(ii,StepNum)+h_i)/zdelta+1);
                re = 6370*1e3; % 地球半径
                StepNum = StepNum + 1;
                z(ii,StepNum) = z(ii,StepNum-1) + h_i;
                x(ii,StepNum) = x(ii,StepNum-1) + re/(re+z(ii,StepNum))*m_i*cos(theta_i)*h_i/sqrt(m_ip1^2-(m_i*cos(theta_i))^2);
                theta_ip1 = atan(h_i/(x(ii,StepNum)-x(ii,StepNum-1))); 
                theta_i = theta_ip1;
             elseif theta_i < -(3*pi/180) % 0.0524
                if z(ii,StepNum)>= zdelta
                   h_i = zdelta;
                   m_i = interp1(m2,(z(ii,StepNum))/zdelta+1);
                   m_ip1 = interp1(m2,(z(ii,StepNum)-h_i)/zdelta+1);
                   re = 6370*1e3; % 地球半径
                   StepNum = StepNum + 1;
                   z(ii,StepNum) = z(ii,StepNum-1) - h_i;
                   x(ii,StepNum) = x(ii,StepNum-1) + re/(re+z(ii,StepNum))*m_i*cos(theta_i)*h_i/sqrt(m_ip1^2-(m_i*cos(theta_i))^2);
                   theta_ip1 = -atan(h_i/(x(ii,StepNum)-x(ii,StepNum-1)));  
                   theta_i = theta_ip1;
                else 
                    theta_i = -theta_i;
                    StepNum = StepNum+1;
                    x(ii,StepNum) = x(ii,StepNum-1);
                    z(ii,StepNum) = z(ii,StepNum-1);
                end                  
             elseif theta_i == 0  
                if g2(ceil(z(ii,StepNum)/zdelta))>0 % 继续向上走一步
                   h_i = zdelta;
                   deltam = interp1(m2,(z(ii,StepNum)+h_i)/zdelta+1)-interp1(m2,z(ii,StepNum)/zdelta+1);
                   theta_ip1 = sqrt(theta_i^2 +2*deltam);
                   StepNum = StepNum+1;
                   z(ii,StepNum) = z(ii,StepNum-1)+ h_i ;
                   x(ii,StepNum) = x(ii,StepNum-1) + (theta_ip1-theta_i)./(deltam/h_i);
                   theta_i = theta_ip1;
                else 
                % 继续向下走一步
                   h_i = zdelta;
                   deltam = interp1(m2,(z(ii,StepNum)-h_i)/zdelta+1)-interp1(m2,z(ii,StepNum)/zdelta+1);
                   theta_ip1 = -sqrt(theta_i^2 +2*deltam);
                   StepNum = StepNum+1;
                   z(ii,StepNum) = z(ii,StepNum-1)- h_i ;
                   x(ii,StepNum) = x(ii,StepNum-1) + (theta_ip1-theta_i)./(deltam/(-h_i));
                   theta_i = theta_ip1;
                end      
             end
         end
    %**********************************************  
    %%
    % ***********************           
        while z(ii,StepNum)<=zmax_user && x(ii,StepNum)>rmax_user2 && x(ii,StepNum)<=rmax_user3
             if (theta_i > 0 && theta_i<= (3*pi/180)) 
                deltam = interp1(m3,(z(ii,StepNum)+zdelta)/zdelta+1)-interp1(m3,z(ii,StepNum)/zdelta+1);
                r = theta_i^2 + 2*deltam;
                if r>= 0 
                    h_i = min(zdelta,(floor(z(ii,StepNum)/zdelta)+1)*zdelta-z(ii,StepNum));
                    h_i = max(h_i,0.1*zdelta);
                    deltam = interp1(m3,(z(ii,StepNum)+h_i)/zdelta+1)-interp1(m3,z(ii,StepNum)/zdelta+1);
                    theta_ip1 = sqrt(theta_i^2 +2*deltam);
                    StepNum = StepNum+1;
                    z(ii,StepNum) = z(ii,StepNum-1)+ h_i ;
                    x(ii,StepNum) = x(ii,StepNum-1) + (theta_ip1-theta_i)./(deltam/h_i);
                    theta_i = theta_ip1;
                else % 向上传播的时候发生反转
                    theta_ip1 = 0;% 射线在未到达下一剖面层时已经发生反转,现在需要确定是在多大的高度发生反转
                    h_i = (theta_ip1^2-theta_i^2)./(2*g2(ceil(z(ii,StepNum)/zdelta+0.01))); %positive
                    StepNum = StepNum+1;
                    z(ii,StepNum) = z(ii,StepNum-1)+ h_i;
                    x(ii,StepNum) = x(ii,StepNum-1) + (theta_ip1 - theta_i)/ g2(ceil(z(ii,StepNum-1)/zdelta+0.01)) ;
                    theta_i = theta_ip1;
                end     
             elseif (theta_i<0 && theta_i >= -(3*pi/180)) %向下传播
                deltam = interp1(m3,(z(ii,StepNum)-zdelta)./zdelta+1)-interp1(m3,z(ii,StepNum)./zdelta+1);
                r = theta_i.^2 + 2*deltam;
                if z(ii,StepNum) <= 0 %zdelta % 到达下界面反转
                    theta_i = -theta_i;
                    StepNum = StepNum+1;
                    z(ii,StepNum) = z(ii,StepNum-1);
                    x(ii,StepNum) = x(ii,StepNum-1);
                elseif r>=0
                    h_i = min(zdelta,z(ii,StepNum)-(ceil(z(ii,StepNum)/zdelta)-1)*zdelta);
                    h_i = max(h_i,0.1*zdelta);
                    deltam = interp1(m3,(z(ii,StepNum)-h_i)/zdelta+1)-interp1(m3,z(ii,StepNum)/zdelta+1);
                    theta_ip1 = - sqrt(theta_i^2 +2*deltam);
                    StepNum = StepNum+1;
                    z(ii,StepNum) = z(ii,StepNum-1)- h_i ;
                    x(ii,StepNum) = x(ii,StepNum-1) + (theta_ip1-theta_i)./(deltam/(-h_i));
                    theta_i = theta_ip1;
                elseif r < 0
                    theta_ip1 = 0;% 射线在未到达下一剖面层时已经发生反转,现在需要确定是在多大的高度发生反转
                    h_i = (theta_ip1^2-theta_i^2)./(2*g2(ceil(z(ii,StepNum)/zdelta))); %positive
                    StepNum = StepNum+1;
                    z(ii,StepNum) = z(ii,StepNum-1)- h_i;
                    x(ii,StepNum) = x(ii,StepNum-1) + (theta_ip1 - theta_i)/ g2(ceil(z(ii,StepNum-1)/zdelta)) ;
                    theta_i = theta_ip1; 
                end    
             elseif theta_i > (3*pi/180) % 0.0524        
                h_i = zdelta;
                m_i = interp1(m3,(z(ii,StepNum))/zdelta+1);
                m_ip1 = interp1(m3,(z(ii,StepNum)+h_i)/zdelta+1);
                re = 6370*1e3; % 地球半径
                StepNum = StepNum + 1;
                z(ii,StepNum) = z(ii,StepNum-1) + h_i;
                x(ii,StepNum) = x(ii,StepNum-1) + re/(re+z(ii,StepNum))*m_i*cos(theta_i)*h_i/sqrt(m_ip1^2-(m_i*cos(theta_i))^2);
                theta_ip1 = atan(h_i/(x(ii,StepNum)-x(ii,StepNum-1))); 
                theta_i = theta_ip1;
             elseif theta_i < -(3*pi/180) % 0.0524
                if z(ii,StepNum)>= zdelta
                   h_i = zdelta;
                   m_i = interp1(m3,(z(ii,StepNum))/zdelta+1);
                   m_ip1 = interp1(m3,(z(ii,StepNum)-h_i)/zdelta+1);
                   re = 6370*1e3; % 地球半径
                   StepNum = StepNum + 1;
                   z(ii,StepNum) = z(ii,StepNum-1) - h_i;
                   x(ii,StepNum) = x(ii,StepNum-1) + re/(re+z(ii,StepNum))*m_i*cos(theta_i)*h_i/sqrt(m_ip1^2-(m_i*cos(theta_i))^2);
                   theta_ip1 = -atan(h_i/(x(ii,StepNum)-x(ii,StepNum-1)));  
                   theta_i = theta_ip1;
                else 
                    theta_i = -theta_i;
                    StepNum = StepNum+1;
                    x(ii,StepNum) = x(ii,StepNum-1);
                    z(ii,StepNum) = z(ii,StepNum-1);
                end                  
             elseif theta_i == 0 
                if g2(ceil(z(ii,StepNum)/zdelta))>0 % 继续向上走一步
                   h_i = zdelta;
                   deltam = interp1(m3,(z(ii,StepNum)+h_i)/zdelta+1)-interp1(m3,z(ii,StepNum)/zdelta+1);
                   theta_ip1 = sqrt(theta_i^2 +2*deltam);
                   StepNum = StepNum+1;
                   z(ii,StepNum) = z(ii,StepNum-1)+ h_i ;
                   x(ii,StepNum) = x(ii,StepNum-1) + (theta_ip1-theta_i)./(deltam/h_i);
                   theta_i = theta_ip1;
                else 
                % 继续向下走一步
                   h_i = zdelta;
                   deltam = interp1(m3,(z(ii,StepNum)-h_i)/zdelta+1)-interp1(m3,z(ii,StepNum)/zdelta+1);
                   theta_ip1 = -sqrt(theta_i^2 +2*deltam);
                   StepNum = StepNum+1;
                   z(ii,StepNum) = z(ii,StepNum-1)- h_i ;
                   x(ii,StepNum) = x(ii,StepNum-1) + (theta_ip1-theta_i)./(deltam/(-h_i));
                   theta_i = theta_ip1;
                end      
             else 
                 break
             end
         end
    %********************************************** 
    %% 
        xx = zeros(1,StepNum-1);
        zz = zeros(1,StepNum-1);
        for jj=1:StepNum-1
                xx(jj) = x(ii,jj)./1e3;
                zz(jj) = z(ii,jj);
         end
        plot(xx,zz,'-r')
    %     axis([0 337 0 100])
        hold on
    end
    set(gca,'fontsize',18, 'FontName','Times')
    set(gca,'xtick',0:20:200)
    set(gca,'ytick',0:10:100)
    axis([0 125 0 50])
    xlabel('Range (km)')
    ylabel('Height (m)')
    toc
    % dis = 0:200;
    % edh = [ones(101,1)*16; ones(100,1)*30];
    
    % plot(dis,edh,'--b','linewidth',3)
    % print(gcf,'-r600','-djpeg','Ray-tracing_EDH=30,16_AT=20.jpg')
    

    三、PE模型

    1、主函数

    %PE_model函数
    % SSPE_function(freq, ...
    %     thetabw, thetae, polrz, tx_height, range, zmax_user, edge_range, edge_height, ...
    %     duct_type, duct_M, duct_height, duct_range, terrain_type, interp_type, backward,...
    %     ground_type, epsilon, sigma, delx, delz)
    clear all
    %% ***********************************************************
    %初始赋值
    %***************************************************
    %d大气波导数据
    duct_M_array1=[300,385.400000000000,0,0,0;
                   350,300,350,0,0;
                   340,356,340,358,0;
                   300,330,310,350,0;
                   300,0,0,0,0;
                   450,250,300,0,0];%大气波导折射率值
    duct_height_array1=[0,300,0,0,0;
                        0,200,300,0,0;
                        0,135,150,300,0;
                        0,50,150,300,0;
                        20,0,0,0,0;
                        0,100,250,0,0];%大气波导高度值           
    duct_type_array1=3;%大气波导类型选择
    duct_M = duct_M_array1(duct_type_array1,:); %折射率值
    duct_height = duct_height_array1(duct_type_array1,:);%高度值
    duct_type = duct_type_array1;
    duct_range = 0;
    
    freq =3000;%频率
    thetabw=2;%三分贝波束宽度
    thetae=0;%
    polrz=1;%极化方式
    tx_height=10;%天线高度
    range=100;%水平距离
    zmax_user=300;%竖直高度
    
    edge_range=[5.13636000000000,7.31818000000000,9.50000000000000,11.1364000000000,...
        12.9545000000000,15.2273000000000,16.9545000000000,19.4091000000000,21.4091000000000,...
        23.6818000000000,25.2273000000000,26.8636000000000,28.9545000000000,31.1364000000000,...
        33.7727000000000,36.0455000000000,37.9545000000000,39.5909000000000,41.1364000000000,...
        42.7727000000000,44.5000000000000,46.5909000000000,48.4091000000000,49.3182000000000,...
        49.6818000000000];%地形x轴(km)
    edge_height=[2.88461500000000,10.5769200000000,18.2692300000000,33.6538500000000,...
        41.3461500000000,50.9615400000000,60.5769200000000,74.0384600000000,97.1153800000000,...
        106.730800000000,75.9615400000000,50.9615400000000,29.8076900000000,22.1153800000000,...
        14.4230800000000,14.4230800000000,20.1923100000000,45.1923100000000,89.4230800000000,...
        108.653800000000,135.576900000000,129.807700000000,139.423100000000,81.7307700000000,...
        14.4230800000000];%地形y轴(m)
    terrain_type=2;%地形类型
    interp_type=3;%插值方式
    
    backward=1;%后项模式
    
    ground_type=1;%表面模式
    epsilon=15;%介电常数
    sigma=0.2293;%电磁导电率
    
    delz=0.2900;%高度步进
    delx=200;%水平距离步进(m)
    %% 
    %函数主体
    tic    
    % warning_gui;%调用提醒函数
    % pause(.1)
    % f1 = findobj('tag','figurew');
    
    stopflag = 0;
    
    path_loss = [];%预留空间
    prop_fact = [];
    free_space_loss = [];
    
    
    %% ************************************************************************
    % CONSTANTS and DEFAULT INPUT PARAMETERS(常数)
    % *************************************************************************
    inputs.c          = 3*1e8;     % meter/second, velocity of light in free space光速
    inputs.eps0       = (1e-9)/(36*pi);  % F/m, permittivity 介电常数
    inputs.mu0        = 4*pi*1e-7;       % H/m, permeability of free space自由场介电常数
    inputs.nu0        = 120*pi;          % ohm, intrinsic impedance of the free space自由场固有阻抗
    inputs.ae         = 6378*1e3;  % meter, earth radius 地球半径
    inputs.sgrad      = 0.118;     % 1/meter, standart atmosphere gradient of modified refractivity标准大气修正折射率梯度
    inputs.evap_const = 1.5e-4;    % meter, evaporation duct constant, typical value波导常数类型值
    inputs.N          = 1024*1;    % FFT size, # of points btw [0, zmax_user]  fft点数
    inputs.maxangle   = 15;        % degree, max allowable angle 最大允许角度 
    inputs.wind_ratio = 1/2;	   % the ratio of height extension (wrt N) to apply window function窗函数高度延伸比
                                   % N used in the program = N*(wind_ratio+1)
    
    minf = 2001;%频率
    if (freq <= 401)
       inputs.wind_ratio = 8;  % N used in the program = N*wind_ratio
    elseif (freq <= 1001)
       inputs.wind_ratio = 4;  % N used in the program = N*wind_ratio      
    elseif (freq < minf)
       inputs.wind_ratio = 2;  % N used in the program = N*wind_ratio   
    end
    
    inputs.win_type   = 1;         % win_type=1 ==> hanning window窗函数选择
                                   % win_type=2 ==> hamming window
    inputs.eps = 1e-10;
    
    inputs.threshold = 0.025;   % Threshold value of difference matrix in backward propagation反向传播中差分矩阵的阈值
    inputs.max_iter  = 1000;    % Max. number of iterations 迭代次数
                               
    %% ************************************************************************
    % INPUT PARAMETERS 输入参数
    % *************************************************************************                                
    inputs.freq  = freq*1e6;      % Hz, frequency (conversion from MHz to Hz)频率
    inputs.range = range*1e3;     % m, output range (conversion from km to m) 水平距离                        
    inputs.zmax_user = zmax_user; % meter, maximum height (max desired calculation height)高度
    inputs.polrz = polrz;         % polrz=1 ==> odd, horizontal polarization极化方式
                                  % polrz=2 ==> even, vertical polarization
         
    inputs.thetabw = thetabw*pi/180;%三分贝波束宽度(单位rad)
    inputs.thetae = thetae*pi/180;%仰角度数(单位rad)
    inputs.tx_height = tx_height;%天线高度
    
    
    %% ************************************************************************
    % PARAMETERS CALCULATED FROM INPUT PARAMETERS 由输入值得到的常数
    % delx, delz, zmax, z, p, pmax, etc.
    %**************************************************************************
    lamda = inputs.c/inputs.freq;    % meter, wavelength 波长
    beta  = 2*pi/lamda;	           % 1/meter, wavenumber 理论物理中定义为:k=2π/λ,波数
    
    zmax = inputs.zmax_user*(1+inputs.wind_ratio); %????什么高度
    
    %if (ground_type == 2) && ((inputs.freq*1e-6) < 400) % mixed
    if ((inputs.freq*1e-6) < minf) % mixed
       zmax = inputs.zmax_user*inputs.wind_ratio; 
    end
    
    
    %%delz = lamda / (2*sin(inputs.maxangle*pi/180));
    %delz = inputs.zmax_user/(inputs.N-1);
    
    %if ground_type == 2 % mixed
    %   delz = 19.53125;    
    %end
    
    z = 0:delz:zmax;%高度方向递进
    inputs.N = length(z);
    
    pmax = (pi/delz);%角度个数?
    p    = linspace(0, pmax, inputs.N);%???
    
    %delx = 2*beta*delz^2; 
    %delx = min(delx, 1000);
    %delx = max(delx, 30);
    
    if inputs.tx_height == 0 %天线高度
       inputs.tx_height = inputs.tx_height + delz; 
    end;
    
    tx_range_index = 1;
    
    inputs.delx = delx;%水平步进
    inputs.delz = delz;%高度步进
    inputs.z = z;%???
    inputs.beta = beta;%波数
    
    inputs.delp = pi/zmax;%0.007??
    
    
    
    %% ************************************************************************
    % OUTPUT domain points
    %**************************************************************************
    range_vec = [0:delx:inputs.range];  % output.x,画图x轴
    [val, savez] = min(abs(z-inputs.zmax_user));%值与位置,0.14,1035  
    
    z_user = z(1:savez);   % output.z ,画图y轴
    
    zae = z / inputs.ae;%高度除以半径
    
    Nx = length(range_vec);%水平方向个数
    N = inputs.N;%高度方向个数
    
    
    %% ************************************************************************                              
    % DEFINITION OF TERRAIN PROFILE  地形参数定义
    %**************************************************************************
    if ~isempty(edge_range)
    
        temp(:,1) = edge_range.';
        temp(:,2) = edge_height.';
    
        ind = find(edge_range <= range+1e-8);%单位不统一???km
        ind2 = find(edge_height <= zmax+1e-8);%(m)
        ind = cat(2, ind, ind2);%连接两个矩阵
        ind = unique(sort(ind));%排序
        temp = temp(ind,:);%????
    
        temp = sortrows(temp);%按列排序
        edge_range = temp(:,1).';
        edge_height = temp(:,2).';%大小重新排列
        clear temp;
    
        num_of_edges = length(edge_range);
        edge_range = edge_range.*1e3;%变换单位   
        edge_range_index  = floor(edge_range/delx) + 1;
        edge_height_index = floor(edge_height/delz) + 1; %地形下标数
    
        ind = find(diff(edge_range_index) == 0);%将相邻差值为0的数找出来
        edge_range_index(ind) = [];
        edge_height_index(ind) = [];%去掉相同的值
    
        if (terrain_type == 2) && (num_of_edges > 1) && (interp_type > 1) % terrain case地形模式、插值模式
    
           if interp_type == 2 % linear线性插值
              aa = fit(edge_range_index.', edge_height_index.', 'linear');
           elseif interp_type == 3 % cubic spline
              aa = fit(edge_range_index.', edge_height_index.', 'cubicspline'); %拟合曲线     
           end
    
           edge_range_index = edge_range_index(1):edge_range_index(end);%按顺序排列
           edge_height_index = aa(edge_range_index);
           edge_height_index = floor(edge_height_index) + 1;%扩充到224个数据,怎么用???
        end
    
    end
    
    %% ************************************************************************
    % WINDOW FUNCTION CALCULATION 窗函数计算
    %**************************************************************************
    %if (ground_type == 2) && ((inputs.freq*1e-6) < 400) % mixed
    if ((inputs.freq*1e-6) < minf) % mixed
       wind = fun_window2(inputs); % WINDOW FUNCTION DEFINITION
    else
       wind = fun_window(inputs); % WINDOW FUNCTION DEFINITION 
    end
    wind = wind.';
    
    
    %% ************************************************************************
    % DEFINITION OF REFRACTIVITY PROFILE  折射剖面
    %**************************************************************************
    temp(:,1) = duct_range';
    temp(:,2) = duct_type';
    
    num = size(duct_height,2);
    temp(:,3:3+num-1) = duct_height;
    temp(:,3+num:3+2*num-1) = duct_M;
    
    ind = find(duct_range <= range+1e-8);
    temp = temp(ind,:);
    
    temp = sortrows(temp);
    duct_range = temp(:,1)';
    duct_type = temp(:,2)';
    duct_height = temp(:,3:3+num-1);
    duct_M = temp(:,3+num:3+2*num-1);
    
    clear temp;
    
    np = length(duct_type); 
    duct_range = duct_range.*1e3;
    %duct_range_index = [1 round(duct_range/delx) Nx];
    duct_range_index = floor(duct_range/delx)+1;
    
    nprofile = zeros(np, N); mprofile = zeros(np, N);
    for i = 1:np
        zero_vec = find(duct_height(i,:) == 0);
                 
        if length(zero_vec) == 1         
            duct_heighti = duct_height(i,:);            
            duct_Mi      = duct_M(i,:);                          
        else        
            duct_heighti = duct_height(i, 1:zero_vec(2)-1);        
            duct_Mi      = duct_M(i, 1:zero_vec(2)-1);                
        end;   
            
        [nprofile(i,:), mprofile(i,:)] = fun_refrac(duct_Mi, duct_type(i), duct_heighti, inputs);
    end
    
    
    if np == 1
        %if ground_type == 1 % PEC               
        %   mn = nprofile.';   
        %else        
           mn = mprofile.';
        %end
           
    else    
       % Interpolate (Linear)
       mn = zeros(N, Nx); 
       for i = 1:np-1
           indi  = duct_range_index(i);
           indi1 = duct_range_index(i+1);
       
           for j = 1:N
               %if ground_type == 1 % PEC
               %    mn(j,indi:indi1) = linspace(nprofile(i,j), nprofile(i+1,j), indi1-indi+1);          
               %else
                   mn(j,indi:indi1) = linspace(mprofile(i,j), mprofile(i+1,j), indi1-indi+1);
               %end
           end;   
       end; 
       
       wind = repmat(wind,1,Nx);
    end
    
    %clear nprofile; clear mprofile;   
    
    %% ************************************************************************
    % WINDOWED ENVIRONMENT TERM 窗口环境
    %**************************************************************************
    %if ground_type == 1 % PEC
       %wide-angle
       prop = exp(1j*beta*delx*(sqrt(1-p.^2./beta^2)-1));    
       envpr = exp(1j * beta * delx * (mn-1));  % ENVIRONMENT TERM 
       
       %prop = exp(-1j * p.^2 .* delx / (2*beta));
       %envpr = exp(1j*0.5 * beta * delx * mn);  % ENVIRONMENT TERM   
       
       prop = prop.' .* wind(:,1);    
       envpr = envpr .* wind;    
    
    %else
       %envpr = exp(1j*0.5 * beta * delx * mn);  % ENVIRONMENT TERM   
       
    %   envpr = exp(1j*beta * delx * mn);  % ENVIRONMENT TERM   
    %   envpr = envpr .* wind;    
       
    %end;
    
    %clear mn; clear wind;
    
    
    %% ************************************************************************
    % INITIAL FIELD DEFINITION 初始场定义
    %**************************************************************************
    u0z = fun_initial_field(inputs); % INITIAL FIELD DEFINITION    
    u0z = u0z.';
    
    
    %% ************************************************************************
    % CALCULATE PARAMETERS if GROUND is MIXED TYPE 计算地面混合类型时的参数
    %**************************************************************************
    % Reflection Coefficient
    ref_coef = -1;
    
    alg = 0;
    % if alg==0, PEC solution
    % if alg==1, central difference DMFT
    % if alg==2, backward difference DMFT 
    
    if ground_type == 2 % mixed
    %u0z = u0z./max(abs(u0z));
    
    % DMFT Calculations
    %if (inputs.polrz==2) %vertical polrz
        alg = 2; %backward difference DMFT    
        if (inputs.freq*1e-6) < 400    
            alg = 1; %central difference DMFT
        end
    %end
    
    
    er = epsilon + 1i*sigma*60*lamda;
    
    if inputs.polrz == 2  %vertical polarization   
        alfa = 1i*beta*sqrt(er-1)./er;
    else  %horizontal polarization
        alfa = 1i*beta*sqrt(er-1);
    end
    
    if alg == 1 %central difference DMFT
       if inputs.polrz == 2  %vertical polarization   
          r = sqrt(1+(alfa*delz).^2)-alfa*delz;  % eq.20    
       else  %horizontal polarization
          r = -sqrt(1+(alfa*delz).^2)-alfa*delz;  % eq.21
       end
       
    else %backward difference DMFT      
        r = 1 / (1+(alfa*delz));    
    end
    
    
    NN = inputs.N-1;
    rn = r.^(0:NN).';
    
    ad = (log(r)/delz).^2;
    
    if alg == 1 %central difference DMFT
       dmft.rk = 2*(1-r^2) / (1+r^2) / (1-r^(2*N));
       dmft.c1x = exp(1j*delx*sqrt(beta^2+ad));
       ad = ((log(r)-1j*pi)/delz).^2;
       dmft.c2x = exp(1j*delx*sqrt(beta^2+ad));   
    else
       dmft.c3x = exp(1j*delx*sqrt(beta^2+ad));
    end
    
    %**********
    if alg == 1  %central difference DMFT
       dmft.ck1 = 0.5*(u0z(1) + u0z(end)*rn(end));
       dmft.ck2 = 0.5*(u0z(1)*rn(end) + u0z(end));
       
       dmft.ck1 = dmft.ck1 + sum(u0z(2:end-1) .* rn(2:end-1));
       
       uzf = fliplr(u0z);
       dmft.ck2 = dmft.ck2 + sum(uzf(2:N-1) .* rn(2:N-1) .* (-1).^(1:N-2)');   
       
       dmft.ck1 = dmft.ck1*dmft.rk;
       dmft.ck2 = dmft.ck2*dmft.rk;
       
    else  %backward difference DMFT          
       dmft.ck3 = sum(u0z(1:end-1) .* rn(1:end-1));
    end
    
    dmft.alfa = alfa;
    dmft.r = r;
    dmft.rn = rn;
    clear rn;
    %**********
    % END OF DMFT Calculations
    
    
    
    % Reflection Coefficient for TERRAIN   
    if inputs.polrz == 2  %vertical polarization               
        nu2 = inputs.nu0 * sqrt(er-1) ./ er;           
    else  %horizontal polarization        
        nu2 = inputs.nu0 * sqrt(er-1);                   
    end
    nu1 = inputs.nu0;
    ref_coef = (nu2-nu1) ./ (nu2+nu1);
        
    end
    
    
    %% ************************************************************************
    % ITERATION STARTS  (FIELD CALCULATION)迭代计算(场计算)
    %**************************************************************************
    u_matrix = zeros(inputs.N, Nx);  % total matrix
    u_matrix(:,tx_range_index) = u0z;
    
    if terrain_type == 1,    % NO TERRAIN CASE (FLAT)
       uz = u0z; % initial field 
       
       
       for i = tx_range_index:Nx-1,
    
           if np == 1 % range-indep. refrac.       
               envpri = envpr;           
           else           
               envpri = envpr(:,i);          
           end
           
           if ground_type == 1 % PEC
              uz = fun_field_pec(uz, inputs, prop, envpri); 
    
           else % mixed
               if (er == 0) || (alg == 0)
                  uz = fun_field_pec(uz, inputs, prop, envpri); 
               else
                  [uz, dmft] = fun_field_mixed(uz, inputs, prop, envpri, alg, dmft);  
               end
           end
           u_matrix(:, i+1) = abs(uz);
           
           
           set (findobj(f1,'tag','text2'),'String',' ');       
           pause(.00001)
           
           if isempty(findobj('tag','figurew'))
              stopflag = 1;
              break;      
           end;       
       end
          
       if stopflag == 1   
           return;       
       end   
       
    elseif terrain_type == 2,       % terrain case  1WAY 
        if backward == 1 % 1-way SSPE
           uz = u0z;  % initial field
        
           edgeh = sparse(1, Nx);
           edgeh(edge_range_index) = edge_height_index;
                 
        
           for i = tx_range_index:Nx-1,  
    
               if np == 1 % range-indep. refrac.                  
                   envpri = envpr;                  
               else               
                   envpri = envpr(:,i);       
               end
    
               if ground_type == 1 % PEC           
                   uz = fun_field_pec(uz, inputs, prop, envpri);        
               else               
                   if (er == 0) || (alg == 0)
                      uz = fun_field_pec(uz, inputs, prop, envpri); 
                   else
                      [uz, dmft] = fun_field_mixed(uz, inputs, prop, envpri, alg, dmft);  
                   end
               end           
               uz(1:full(edgeh(i+1)),1) = 0;       
               u_matrix(:, i+1) = uz;    
               
         
    %            set (findobj(f1,'tag','text2'),'String',' ');
    %            pause(.00001)
    % 
    %            if isempty(findobj('tag','figurew'))
    %               stopflag = 1;
    %               break;               
    %            end;       
           end
           
           if stopflag == 1
              return;
           end
       
        else % backward == 2 2-way SSPE RECURSIVE 
    
        uz = u0z;  % initial field
        
        %u_matrix(:,tx_range_index) = uz;  
        
        iter_user = 1;
        dif = 10^10;
        %ref_coef    = -1.0;
        threshold   = inputs.threshold;
        max_iter    = inputs.max_iter; 
            
        output.bounce = sparse(1, Nx);
              
        %%
        isedge = sparse(1, Nx);
        isedge(edge_range_index) = 1;
         
        edger = sparse(1, Nx);
        edger(edge_range_index) = edge_range_index;
        
        edgeh = sparse(1, Nx);
        edgeh(edge_range_index) = edge_height_index;
        ind = find(edgeh == 1);
        edgeh(ind) = 0;
        isedge(ind) = 0;
        edger(ind) = 0;     
        
        if tx_range_index == 1
           move.now = tx_range_index;        
           way.now = 'F'; %FORWARD 
           matrix.now(:,1) = uz;
        else
           move.now = [tx_range_index tx_range_index];        
           way.now(1) = 'F';
           way.now(2) = 'B'; % BACKWARD
           matrix.now(:,1) = uz;   
           matrix.now(:,2) = uz;       
        end
        
        matrix.next = []; move.next = [];
        iter  = 1;
        while dif > threshold,  
                   
            if isempty(findobj('tag','figurew'))
               stopflag = 1;
               return       
            end;
           
            set (findobj(f1,'tag','text2'),'String',cat(2,'Threshold = ',num2str(dif), ' > ', num2str(threshold)));
            pause(.0001)
           
            
            if (iter ~= 1)
                move.now = move.next;
                move.next = [];
                way.now = way.next;
                way.next = 'T';
                matrix.now = matrix.next;
                matrix.next = [];
                            
                ind = find(way.now ~= 'T');  % Not TERMINATION
                move.now = move.now(ind);
                way.now = way.now(ind);  
                matrix.now = matrix.now(:,ind);                        
            end
            
            
            len = length(move.now);
            ic = 1;
            for i = 1:len,
                uz = matrix.now(:,i);
                
                %uznew = fun_field_pec(uz, inputs, prop, envpr);     
                
                if np == 1 % range-indep. refrac.             
                    envpri = envpr;                 
                else                
                    envpri = envpr(:,move.now(i));       
                end
                
                if ground_type == 1 % PEC       
                    uznew = fun_field_pec(uz, inputs, prop, envpri);               
                else
                   if (er == 0) || (alg == 0)
                      uznew = fun_field_pec(uz, inputs, prop, envpri); 
                   else
                      [uznew, dmft] = fun_field_mixed(uz, inputs, prop, envpri, alg, dmft);  
                   end
                end
                
                
                %% FORWARD PROPAGATION
                if (way.now(i) == 'F') && (move.now(i) ~= Nx)
                   ind = find(move.next == move.now(i)+1, 1);
                   add_flag = 1;
                   if ~isempty(ind)
                       if (way.next(ind) == 'F')
                           matrix.next(:,ind) = matrix.next(:,ind) + uznew;
    
                           if isedge(move.now(i)+1) % meet edge
                               matrix.next(1:edgeh(move.now(i)+1), ind) = 0; 
                           end                       
                           add_flag = 0;
                       end
                   end
    
                   
                   if add_flag
                       move.next(ic) = move.now(i)+1;
                       matrix.next(:,ic) = uznew;
                       if isedge(move.now(i)+1) % meet edge
                          matrix.next(1:edgeh(move.now(i)+1), ic) = 0; 
                       end
    
                       way.next(ic) = 'F';
                       if ((move.now(i)+1) == Nx)
                          way.next(ic) = 'T';                   
                       end               
                      ic = ic+1;
                   end
                   
                                   
                   if isedge(move.now(i)+1) % meet edge
                      if isedge(move.now(i))
                          if (edgeh(move.now(i)) < edgeh(move.now(i)+1))                         
                             uznew = uznew*ref_coef *exp(1j*beta*2*(edger(move.now(i)+1)-1)*delx);                         
                             uznew(edgeh(move.now(i)+1)+1:end) = 0; 
    
                             %uznew = fun_field_pec(uznew, inputs, prop, envpr);     
    
                             if np == 1 % range-indep. refrac.             
                                 envpri = envpr;                             
                             else                             
                                 envpri = envpr(:,move.now(i));            
                             end
                             
                             if ground_type == 1 % PEC      
                                 uznew = fun_field_pec(uznew, inputs, prop, envpri);               
                             else                             
                                 if (er == 0) || (alg == 0)                  
                                     uznew = fun_field_pec(uznew, inputs, prop, envpri);                
                                 else                                
                                     [uznew, dmft] = fun_field_mixed(uznew, inputs, prop, envpri, alg, dmft);               
                                 end
                             end
                             
                             ind = find(move.next == move.now(i), 1);
                             add_flag = 1;
                             if ~isempty(ind)
                                if (way.next(ind) == 'B')
                                   matrix.next(:,ind) = matrix.next(:,ind) + uznew;
                                   matrix.next(1:edgeh(move.now(i)), ind) = 0;
                                   
                                   add_flag = 0;
                                end
                             end
                             
                             if add_flag
                                 move.next(ic) = move.now(i);                                               
                                 matrix.next(:,ic) = uznew;
                                 matrix.next(1:edgeh(move.now(i)), ic) = 0;                          
                                 way.next(ic) = 'B';
                                 ic = ic+1;                            
                             end
                          end
                          
                      else           
                          uznew = uznew*ref_coef *exp(1j*beta*2*(edger(move.now(i)+1)-1)*delx);
                          uznew(edgeh(move.now(i)+1)+1:end) = 0; 
    
                          %uznew = fun_field_pec(uznew, inputs, prop, envpr);     
    
                          if np == 1 % range-indep. refrac.             
                              envpri = envpr;                             
                          else                          
                              envpri = envpr(:,move.now(i));            
                          end
                          
                             if ground_type == 1 % PEC       
                                 uznew = fun_field_pec(uznew, inputs, prop, envpri);               
                             else                             
                                 if (er == 0) || (alg == 0)                  
                                     uznew = fun_field_pec(uznew, inputs, prop, envpri);                
                                 else                                 
                                     [uznew, dmft] = fun_field_mixed(uznew, inputs, prop, envpri, alg, dmft);               
                                 end
                             end
                          
                          
                          ind = find(move.next == move.now(i), 1);
                          add_flag = 1;
                          if ~isempty(ind)
                             if (way.next(ind) == 'B')
                                matrix.next(:,ind) = matrix.next(:,ind) + uznew;
                                add_flag = 0;
                             end
                          end
    
                          if add_flag
                              move.next(ic) = move.now(i);                      
                              matrix.next(:,ic) = uznew;
                              way.next(ic) = 'B';
                              ic = ic+1;  
                          end
                      end
    
                      output.bounce(move.now(i)+1) = output.bounce(move.now(i)+1) + 1;
                   end
                    
    
                   
                %% BACKWARD PROPAGATION   
                elseif (way.now(i) == 'B') && (move.now(i) ~= 1)
                   ind = find(move.next == move.now(i)-1, 1);
                   add_flag = 1;
                   if ~isempty(ind)
                       if (way.next(ind) == 'B')
                           matrix.next(:,ind) = matrix.next(:,ind) + uznew;
      
                           if isedge(move.now(i)-1) % meet edge
                              matrix.next(1:edgeh(move.now(i)-1), ind) = 0; 
                           end
                           add_flag = 0;
                       end
                   end
                   
                   if add_flag
                       move.next(ic) = move.now(i)-1;
                       matrix.next(:,ic) = uznew;
                       if isedge(move.now(i)-1) % meet edge
                          matrix.next(1:edgeh(move.now(i)-1), ic) = 0; 
                       end
                   
                       way.next(ic) = 'B';
                       if (move.now(i)-1) == 1
                          way.next(ic) = 'T';                   
                       end               
                       ic = ic+1;
                   end
                   
                    
                   if isedge(move.now(i)-1) % meet edge
                      if isedge(move.now(i))
                          if (edgeh(move.now(i)) < edgeh(move.now(i)-1))                         
                             uznew = uznew*ref_coef *exp(1j*beta*2*(edger(move.now(i)+1)-1)*delx);
                             uznew(edgeh(move.now(i)-1)+1:end) = 0; 
    
                             %uznew = fun_field_pec(uznew, inputs, prop, envpr);     
    
                             if np == 1 % range-indep. refrac.             
                                 envpri = envpr;                             
                             else                             
                                 envpri = envpr(:,move.now(i));            
                             end
                             
                             if ground_type == 1 % PEC      
                                 uznew = fun_field_pec(uznew, inputs, prop, envpri);               
                             else
                                 if (er == 0) || (alg == 0)                  
                                     uznew = fun_field_pec(uznew, inputs, prop, envpri);                
                                 else                                 
                                     [uznew, dmft] = fun_field_mixed(uznew, inputs, prop, envpri, alg, dmft);               
                                 end
                             end
                             
                             
                             ind = find(move.next == move.now(i), 1);
                             add_flag = 1;
                             if ~isempty(ind)
                                 if (way.next(ind) == 'F')
                                   matrix.next(:,ind) = matrix.next(:,ind) + uznew;
                                   matrix.next(1:edgeh(move.now(i)), ind) = 0;
                                   
                                   add_flag = 0;
                                 end
                             end
                             
                             if add_flag
                                 move.next(ic) = move.now(i);                         
                                 matrix.next(:,ic) = uznew;
                                 matrix.next(1:edgeh(move.now(i)), ic) = 0;                          
                                 way.next(ic) = 'F';
                                 ic = ic+1;  
                             end
                          end
                          
                      else                      
                          uznew = uznew*ref_coef *exp(1j*beta*2*(edger(move.now(i)+1)-1)*delx);
                          uznew(edgeh(move.now(i)-1)+1:end) = 0; 
                          
                          %uznew = fun_field_pec(uznew, inputs, prop, envpr);     
                          
                          if np == 1 % range-indep. refrac.                             
                              envpri = envpr;                             
                          else                          
                              envpri = envpr(:,move.now(i));            
                          end
                          
                             if ground_type == 1 % PEC       
                                 uznew = fun_field_pec(uznew, inputs, prop, envpri);               
                             else
                                 if (er == 0) || (alg == 0)                  
                                     uznew = fun_field_pec(uznew, inputs, prop, envpri);                
                                 else                                 
                                     [uznew, dmft] = fun_field_mixed(uznew, inputs, prop, envpri, alg, dmft);               
                                 end
                             end
                          
                          
                          ind = find(move.next == move.now(i), 1);
                          add_flag = 1;
                          if ~isempty(ind)
                              if (way.next(ind) == 'F')
                                matrix.next(:,ind) = matrix.next(:,ind) + uznew;
                                add_flag = 0;
                              end
                          end
                          
                          if add_flag
                              move.next(ic) = move.now(i);                      
                              matrix.next(:,ic) = uznew;
                              way.next(ic) = 'F';
                              ic = ic+1;                                               
                          end
                      end
                      
                      output.bounce(move.now(i)-1) = output.bounce(move.now(i)-1) + 1;                  
                   end
                   
                    
                else 
                    disp('Error');
                end     
                
            end
    
            
            utemp = zeros(inputs.N, Nx);        
            lenn = length(move.next);
            dif = 0;
            for i = 1:lenn,          
                utemp(:,move.next(i)) = utemp(:,move.next(i)) + matrix.next(:,i);
                u_matrix(:,move.next(i)) = u_matrix(:,move.next(i)) + matrix.next(:,i);            
                dif = dif + norm(matrix.next(:,i));
            end
        
    
            %dif = norm(utemp);
                  
           output.convergence(iter) = dif;
           iter = iter+1;
           
            %if mod(iter, 1)==0,
           
            %   disp(way.next);
            %   disp(num2str(move.next));
            %   disp(['Difference (< ' sprintf('%.2e', threshold) ') = ' sprintf('%.5f', dif)]);  
            %   disp(['Iteration = ' sprintf('%d', iter)]);              
            %   disp(' ');
               %disp(output.bounce(find(output.bounce~=0)));
            %  disp('*****************************************************');
            %end
    
    
            if (dif < threshold) && (iter < Nx)
                while dif < threshold
                    threshold = threshold*(0.9);
                end
            end
            
           if (iter > iter_user*max_iter),
              iter_user = iter_user+1;
              %disp('Max number of iterations is exceeded..');
              %disp('Do you want to continue for iteration?');
              %answer = input('If yes, press enter; otherwise press ''0'' ==> ');
              %if answer == 0,
              %   disp('The iteration is stopped by the user without satisfying the predefined threshold!');
              %   break;
              %end;
           end;       
        end             
       end;
    end;
    
    
    range_matrix = repmat(range_vec, inputs.N, 1);
    %u_matrix     = u_matrix.*exp(-1j*beta*range_matrix); 
    u_matrix = abs(u_matrix);
    
    u_matrix = u_matrix(1:savez,:);
    
    log10lamda = log10(lamda);
    log10umatrix = log10(u_matrix(1:savez,:));
    
    %log10umatrix2 = log10(u_matrix(1:savez,:) ./ sqrt(range_matrix(1:savez,:)));
    
    
    %% ************************************************************************
    % CALCULATE PROPAGATON FACTOR
    %**************************************************************************
    prop_fact = 20*log10umatrix + 10*log10(range_matrix(1:savez,:)) + 10*log10lamda; %dB
    
    %% ************************************************************************
    % CALCULATE PATH LOSS 
    %*************************************************************************
    path_loss = -20*log10umatrix + 20*log10(4*pi)+ ...
                 20*log10(range_matrix(1:savez,:)) - 20*log10lamda; %dB
               
    %% ************************************************************************
    % CALCULATE FREE-SPACE LOSS
    %**************************************************************************
    free_space_loss = 32.45+20*log10(inputs.freq*1e-6)+20*log10(range_vec*1e-3);  %dB
    toc
    %% 
    %画图表示
    plot_array = prop_fact;
    plot_flag = 2;
    
    figure
    axes;
    
    new_x = range_vec./1e3;%水平距离
    new_y = z_user; %高度
    xmin = new_x(1);%画图范围
    xmax = new_x(length(new_x));
    ymin = z_user(1);
    ymax = z_user(length(z_user));
    
    
    hhimage = imagesc(new_x, new_y, plot_array); %画图
    % shading interp; %阴影 
    % view(0,90);%视角选择
    
    
    % set(gcf,'WindowButtonMotionFcn','guimousevalue');
    % imageflag = 1;
    
    set(gca,'Ydir','normal');%y轴设置
    hx=xlabel('Range (km)','Linewidth',2,'fontsize',9);%坐标标注
    hy=ylabel('Altitude (m)','Linewidth',2,'fontsize',9);
    % set(hx,'pos',get(hx,'pos') + [0 10.0 0]);
    %set(hy,'pos',get(hy,'pos') + [0.3 0.0 0]);
    
    axis tight;
    
    colormap jet
    cb = colorbar('eastoutside');%东边外部
    %% 
    

    2、窗函数

    function [wind] = fun_window(inputs)
    N = inputs.N;
    wind_ratio = inputs.wind_ratio/2;
    
    wind = ones(1,N);
    
    if inputs.win_type == 1,
       ha = hanning(2*round(N*wind_ratio)+1).';
       ha = ha(round(N*wind_ratio)+1:end);
       
    elseif inputs.win_type == 2,
       ha = hamming(2*round(N*wind_ratio)+1).';
       ha = ha(round(N*wind_ratio)+1:end);   
    end;
    
    wind(N-length(ha)+1:N) = ha;
    

    3、窗函数

    % WINDOWING FUNCTION窗函数
    function [wind] = fun_window2(inputs)
    N = round(inputs.N/2);
    wind = ones(1,inputs.N);
    
    if inputs.win_type == 1,
       ha = hanning(2*N+1).';
       ha = ha(N+1:end);  
    elseif inputs.win_type == 2,
       ha = hamming(2*N+1).';
       ha = ha(N+1:end);
    end;
    
    wind(inputs.N-length(ha)+1:inputs.N) = ha;
    

    4、折射剖面函数

    %% ************************************************************************
    % REFRACTIVITY PROFILE FUNCTION
    function [n, m] = fun_refrac(duct_M, duct_type, duct_height, inputs)
                                                                                                              
    M(1) = duct_M(1); 
    
    % standard atmosphere
    if duct_type == 1,
       term = inputs.delz*inputs.sgrad;
       M = M(1)*ones(1,inputs.N);
       M = M + (0:term:(inputs.N-1)*term);
       
    % evaporation duct
    elseif duct_type == 5,	
       term = 0.125*(inputs.z(2:inputs.N)-duct_height(1)*log10(inputs.z(2:inputs.N)/inputs.evap_const));
       M(2:inputs.N) = M(1) + term;
        
    % linear profile
    % (user defined, surface duct, surface_based duct, elevated duct) 
    else
        num = length(duct_height);
        rg1 = 2;
    
        for i = 1:num-1,
            if i == (num-1),
                rg2 = inputs.N;
            else    
                rg2 = round(duct_height(i+1)/inputs.delz);
            end;
            
            duct_grad = (duct_M(i+1)-duct_M(i))/(duct_height(i+1)-duct_height(i));   % 1/meter, gradient of the profile        
            
            term = inputs.delz*duct_grad; 
           
            for ii = rg1:rg2,
                M(ii) = M(ii-1)+term;
            end;
            rg1 = rg2+1;
        end;    
    end; 
    
    n = M*(1e-6) - inputs.z / inputs.ae + 1;
    m = n.*n - 1 + 2.*inputs.z / inputs.ae;
    %N = M-(1e6).*inputs.z / inputs.ae; 
       
    %n = M*(1e-6) + 1;
    %m = n.*n - 1;
    %n = M*(1e-6) + 1;
    %m = n.*n - 1;
    

    5、天线初始场计算

    %% ***********************************************************************
    % INITIAL FIELD CALCULATION FROM ANTENNA PATTERN
    function [u0z] = fun_initial_field(inputs)
    
    u0z = 0;
    for i = 1:length(inputs.tx_height)
    
    ww = sqrt(2*log(2))./(inputs.beta*sin(inputs.thetabw(i)/2));
    
    ufsp = 1/(sqrt(pi)*ww)*exp(-1i*inputs.beta*sin(inputs.thetae(i))*inputs.z).*exp(-((inputs.z-inputs.tx_height(i))/ww).^2);
    ufsn = 1/(sqrt(pi)*ww)*exp(-1i*inputs.beta*sin(inputs.thetae(i))*(-inputs.z)).*exp(-((-inputs.z-inputs.tx_height(i))/ww).^2);
    
    if inputs.polrz == 1, % H polrz
        u0z = u0z + (ufsp-ufsn);
    else    % V polrz
        u0z = u0z + (ufsp+ufsn);
    end;  
    
    end
    

    6、  

    function [uz] = fun_field_pec(uz, inputs, prop, envpr)
    
      N = length(uz);
      
       if inputs.polrz == 1,   % H polrz
          up = dst(uz(2:end-1));
    
          % If Partial Differential Toolbox doesn't exist in your Matlab, dst
          % and dct functions may not work. In this case, disable above comand
          % and enable the following commands:
          
          %up = cat(2, -fliplr(uz(2:end)), uz);
          %up = fftshift(fft(ifftshift(up)));
    
       else    % V polrz
          up = dct(uz);
    
          % If Partial Differential Toolbox doesn't exist in your Matlab, dst
          % and dct functions may not work. In this case, disable above comand
          % and enable the following commands:
          
          %up = cat(2, fliplr(uz(2:end)), uz);
          %up = fftshift(fft(ifftshift(up)));
       end;  
    
       
       if inputs.polrz == 1,  
           up = up.*prop(2:end-1);      
           uz = [0; idst(up); 0];
       
          % If Partial Differential Toolbox doesn't exist in your Matlab, dst
          % and dct functions may not work. In this case, disable above comand
          % and enable the following commands:
           
           %up = up.*cat(2, fliplr(prop(2:end)), prop); 
           %uz = fftshift(ifft(ifftshift(up)));
           %uz = uz(N:end);
           %uz(1)=0;
           
       else
           up = up.*prop;     
           uz = idct(up);      
           
          % If Partial Differential Toolbox doesn't exist in your Matlab, dst
          % and dct functions may not work. In this case, disable above comand
          % and enable the following commands:
           
           %up = up.*cat(2, fliplr(prop(2:end)), prop); 
           %uz = fftshift(ifft(ifftshift(up)));
           %uz = uz(N:end);
       end; 
    
       
       uz = uz.*envpr;
    

    7、

    function [uz, dmft] = fun_field_mixed(uz, inputs, prop, envpr, alg, dmft)
    
    %tic
    N = length(uz);  
    
    if alg == 1 %central difference DMFT
       w = (uz(3:end)-uz(1:end-2)) / (2*inputs.delz) + dmft.alfa*uz(2:end-1);
       w = [0; w; 0];
    
       %**********
       if inputs.polrz == 1,   % H polrz
          wp = dst(w(2:end-1));   
       else    % V polrz      
          wp = dct(w);
       end;  
    
       if inputs.polrz == 1,  
          wp = wp.*prop(2:end-1);             
          w = [0; idst(wp); 0];          
       else    
          wp = wp.*prop;       
          w = idct(wp);         
       end; 
       %**********   
    
       dmft.ck1 = dmft.ck1 * dmft.c1x;
       dmft.ck2 = dmft.ck2 * dmft.c2x;
    
       ym = zeros(1,N-1);
       for i = 2:N-1
           ym(i) = 2*inputs.delz*w(i) + dmft.r * ym(i-1);
       end
    
       %**********
       uz(N) = 0;
       for i = 2:N,         
           nmi = N-i+1;         
           uz(nmi) = dmft.r*(ym(nmi)-uz(nmi+1));     
       end; 
    
       %**********
       %ar = dmft.ck1 - dmft.rk*(0.5*uz(1) + 0.5*uz(end)*dmft.rn(end) + sum(uz(2:N-1).*dmft.rn(2:N-1)));
       ar = dmft.ck1 - dmft.rk*(0.5*uz(1) + 0.5*uz(end)*dmft.rn(end) + sum(uz.*dmft.rn));   
       uzf = fliplr(uz);
       br = dmft.ck2 - dmft.rk*(0.5*uz(1)*dmft.rn(end) + 0.5*uz(end) + sum(uzf(2:N-1) .* dmft.rn(2:N-1) .* (-1).^(1:N-2)'));
       
      
       %**********
       rnf = fliplr(dmft.rn);  
       uz = uz + ar*dmft.rn + br*rnf .* (-1).^(N:-1:1)';
    
    
    else %backward difference DMFT
        
        w = uz(2:N-1) - dmft.r * uz(1:N-2);
        w = [0; w; 0];
           
       %**********
       if inputs.polrz == 1,   % H polrz
          wp = dst(w(2:end-1));   
       else    % V polrz      
          wp = dct(w);
       end;  
    
       if inputs.polrz == 1,  
          wp = wp.*prop(2:end-1);             
          w = [0; idst(wp); 0];          
       else    
          wp = wp.*prop;       
          w = idct(wp);         
       end; 
       %********** 
       
       dmft.ck3 = dmft.ck3 * dmft.c3x;
       
       uz(1) = 0;
       for i = 2:N,         
           uz(i) = w(i) + dmft.r * uz(i-1);     
       end; 
       
       ar = dmft.ck3 - sum(uz(1:N-1).*dmft.rn(1:N-1));
       
       uz = uz + ar*dmft.rn;
    end
       
    
    uz = uz.*envpr;
    

      

      

      

      

     

      

  • 相关阅读:
    spark 修改默认log4j.properties 配置
    shell $x的含义
    hadoop hdfs 有内网、公网ip后,本地调试访问不了集群解决
    JAVA concurrent包下Semaphore、CountDownLatch等用法
    ETL DAG调度策略
    python2.7 Cheetah You don't have the C version of NameMapper installed
    python threading 用法
    log4j2 Filter用法详解
    ThreadLocal 原理及一些实现
    ETL hive update 之 deltamerge 优化
  • 原文地址:https://www.cnblogs.com/ruo-li-suo-yi/p/8280389.html
Copyright © 2011-2022 走看看