有限差分光束传输法

该博客介绍了如何使用有限差分法和隐式交替方向法(ADI)解决3D抛物型方程,模拟一个3D高斯脉冲在1500微米距离内的传播。作者Edgar Guevara Codina展示了生成动画并保存为AVI文件的过程,包括设置初始条件、矩阵生成、迭代传播和结果可视化等步骤。
摘要由CSDN通过智能技术生成

% Finite Difference Beam Propagation Method     18 Mayo 2007
% Edgar Guevara Codina 
% Dispositivos Optoelectronicos 
% Genera un pulso gaussiano en 3D y lo propaga 1500 um a lo largo del eje z
% Utiliza Diferencias Finitas para resolver la ecuacion parabolica en 3D
% Mediante el metodo Implicito de Direccion Alternante (ADI)
% Genera una animacion y la guarda en formato AVI

close all;                          % Cierra Ventanas
clear all;                          % Limpia Variables
clc;                                % Limpia Pantalla

% ---------- Declaracion de Variables -----------------
x1 = -50e-6;                                % Coordenada Inicial
x2 = 50e-6;                                 % Coordenada Final
num_samples = 128;                          % Numero de muestras (potencia de 2)
dx = (x2-x1)/num_samples;                   % Espaciado de las muestras en x
dz = 0.25e-6;                               % Incremento en z
x = linspace (x1, x2-dx, num_samples);      % Dominio espacial (simetrico en x y en y)
W0 = 8e-6;                                  % Radio de la cintura del pulso
lambda = 0.8e-6;                            % Longitud de onda
k0 = 2*pi/lambda;                           % Numero de onda

% -------- Generamos la reticula para graficar -------- 
[xx,yy] = meshgrid ([x1:dx:x2-dx],[x1:dx:x2-dx]);

% ------------ Generacion del pulso -------------------
modo = exp (-(xx/W0).^2-(yy/W0).^2);    % Pulso Gaussiano en 3D

% ---------- Constantes para metodo ADI -----------------
B = j/(2*k0);                       % Constante de difusion
G = B*dz/(dx^2);                    % Parametro de ganancia
d = zeros(1,num_samples);           % Terminos Independientes

matrix = zeros(num_samples);        % Inicializa Matriz

% --------- Generacion de la matriz tridiagonal ---------
for m = 1:1:num_samples,
    if ((m>1) && (m<num_samples))
        matrix(m,m-1) = -G;
        matrix(m,m) = 1 + 2*G;
        matrix(m,m+1) = -G;
    else
        matrix(1,1) = 1 + 2*G;
        matrix(1,2) = -G;
        matrix(num_samples,num_samples-1) = -G;
        matrix(num_samples,num_samples) = 1 + 2*G;
    end
end
matrix=sparse(matrix);  %la convierte a matriz escasamente poblada

% -------------- Posiciona la grafica --------------
scrsz = get(0,'ScreenSize');
figure('Position',[1 scrsz(4)/2 scrsz(3)/2 scrsz(4)/2]);

% --------------- Abre Archivo Video ---------------
%aviobj = avifile('FDBPM_3D_free_space.avi','fps',50,'quality',100);

% --------- Ciclo Principal de Propagacion ---------  

% ------------------ Primer paso -------------------
    for ir = 1:1:num_samples,
        for lc = 1:1:num_samples,
            if ((lc>1) && (lc<num_samples))
                d(lc) = G*modo(ir,lc-1) + (1 - 2*G)*modo(ir,lc) + G*modo(ir,lc+1);
            else
                if (lc == 1)
                    d(1) = eps;
                else
                    d(num_samples) = eps;
                end
            end
        end
        modo(:,ir) = matrix\d.';              % Resuelve la i-esima columna
    end

% ------------------ Segundo paso ------------------
for m = 1:1:1500,
    for lc = 1:1:num_samples,
        for ir = 1:1:num_samples,
            if ((ir>1) && (ir<num_samples))
                d(ir) = G*modo(ir-1,lc) + (1 - 2*G)*modo(ir,lc) + G*modo(ir+1,lc);
            else
                if (ir == 1)
                    d(1) = eps;
                else
                    d(num_samples) = eps;
                end
            end
        end
        modo(lc,:) = (matrix\d.')';              % Resuelve la l-esima fila
    end

% -- Graficamos la magnitud de nuestros pulsos propagados --
    subplot(1,2,1);
    contour(xx,yy,abs(modo),16);
    axis equal;
    xlabel('x');    ylabel('y');
    subplot(1,2,2);
    surf(xx,yy,abs(modo));
    shading interp;
    axis([x1 x2 x1 x2 0 1]);
    title(strcat(sprintf('Pulso Propagado en z = %3.0f ',m),' \mum'));
    xlabel('x');    ylabel('y');    zlabel('Amplitud');
    subplot(1,2,1);
    pause(0.005);
    %if (m==250)
        %print -djpeg100 3DFDBPM_0250.jpg       %Exporta la imagen
    %end
% ------- Captura y a馻de un cuadro al video -------
    %frame = getframe(gca,[-80 -40 scrsz(3)/2 scrsz(4)/2+40]);
    %aviobj = addframe(aviobj,frame);
end

% -------------- Cierra Archivo Video --------------
%aviobj = close(aviobj);

 D141

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值