Simulação de Lasers de Modo Trancado em MATLAB com o Método Split-Step Fourier e o Algoritmo Runge-Kutta

Introdução à Modelagem de Lasers de Modo Trancado

A simulação precisa de lasers de modo trancaod é crucial para entender sua dinâmica complexa em física óptica. Neste artigo, apresentamos como utilizar o MATLAB para resolver as equações de Schrödinger não lineares acopladas (CNLSE) por meio do método split-step Fourier (SSFM) combinado com o algoritmo Runge-Kutta, permitindo observar a evolução dinâmica de pulsos e espectros.

Equações de Schrödinger Não Lineares Acopladas

As equações CNLSE descrevem a propagação de pulsos ópticos em meios dispersivos e não lineares, como fibras ópticas. A forma geral é dada por:

i ∂E/∂z + (β₂/2) ∂²E/∂t² - γ|E|²E = 0

Aqui, E representa o envelope do campo elétrico, z é a distância de propagação, t é o tempo, β₂ é o coeficiente de dispersão de segunda ordem e γ é o coeficiente não linear. Em simulações realistas de lasers de modo trancado, as equações podem incluir termos adicionais de acoplamento entre modos.

Implementação do Método Split-Step Fourier

O SSFM separa o processo de propagação em etapas de dispersão e não linearidade, tratando cada uma individualmente. A seguir, um exemplo de código em MATLAB adaptado com variáveis renomeadas e ligeiras modificações na estrutura:

% Definição de parâmetros
distancia_max = 1;
passo_z = 0.01;
janela_tempo = 10;
passo_t = 0.01;
tempo = (-janela_tempo/2:passo_t:janela_tempo/2 - passo_t)';
num_pontos = length(tempo);
distancia = 0:passo_z:distancia_max;
coef_disp = -0.02;
coef_nao_linear = 1;

% Pulso inicial
campo_e = exp(-(tempo.^2)/(2*0.1^2)); % Pulso gaussiano

% Vetor de números de onda
num_onda = 2*pi*(0:num_pontos - 1)/num_pontos/passo_t;
num_onda = [num_onda(num_pontos/2 + 1:num_pontos), num_onda(1:num_pontos/2)];

% Propagação usando split-step Fourier
for iter = 1:length(distancia) - 1
    % Etapa não linear
    campo_e = campo_e .* exp(-1i * coef_nao_linear * passo_z * abs(campo_e).^2);
    % Transformada para o domínio da frequência
    campo_f = fftshift(fft(campo_e));
    % Etapa dispersiva
    campo_f = campo_f .* exp(-1i * coef_disp * (num_onda.^2) * passo_z / 2);
    % Transformada inversa para o domínio do tempo
    campo_e = ifft(ifftshift(campo_f));
end

Este código configura os parâmetros físicos, define um pulso inicial e executa a propagação iterativa, alternando entre domínios temporal e frequencial para aplicar efeitos não lineares e dispersivos.

Algoritmo Runge-Kutta para Termos Acoplados

Para situações onde os termos de acoplamento são complexos, o método Runge-Kutta de quarta ordem oferece maior precisão. A fórmula iterativa genérica para uma EDO dy/dt = f(t, y) é:

k₁ = h f(tₙ, yₙ)
k₂ = h f(tₙ + h/2, yₙ + k₁/2)
k₃ = h f(tₙ + h/2, yₙ + k₂/2)
k₄ = h f(tₙ + h, yₙ + k₃)
yₙ₊₁ = yₙ + (1/6)(k₁ + 2k₂ + 2k₃ + k₄)

Ao integrar com o MATLAB, podemos definir um sistema de EDOs para a CNLSE. Veja uma adaptação com funções renomeadas:

function derivada = equacoes_acopladas(z, campo, gama, beta2, termo_acoplamento)
    % Calcula a derivada temporal considerando dispersão, não linearidade e acoplamento
    derivada = -1i * beta2 / 2 * diff(diff(campo)) / (passo_t^2) - 1i * gama * abs(campo).^2 .* campo - 1i * termo_acoplamento .* campo;
end

% Resolução com Runge-Kutta usando ode45
tolerancias = odeset('RelTol', 1e-6, 'AbsTol', 1e-9);
[solucao_z, solucao_campo] = ode45(@(z, campo) equacoes_acopladas(z, campo, coef_nao_linear, coef_disp, C), distancia, campo_e, tolerancias);

Aqui, a função equacoes_acopladas encapsula a dinâmica do sistema, e o solver ode45 aplica o Runge-Kutta para integrar numericamente.

Visualização da Evolução Dinâmica

Os resultados da simulação permitem analisar como pulsos e espectros evoluem ao longo da propagação. O código abaixo gera gráficos para essa análise:

figure;
for idx = 1:10:length(distancia)
    subplot(2, 1, 1);
    plot(tempo, abs(solucao_campo(idx, :)));
    xlabel('Tempo (ps)');
    ylabel('Amplitude');
    title('Evolução do Pulso');
    hold on;
    subplot(2, 1, 2);
    espectro = fftshift(fft(solucao_campo(idx, :)));
    plot(num_onda, abs(espectro));
    xlabel('Frequência (THz)');
    ylabel('Amplitude');
    title('Evolução Espectral');
    hold on;
end
hold off;

Este script itera sobre diferentes distâncias de propagação, plotando o perfil temporal do pulso e seu espector correspondente, oferecendo uma visão completa da dinâmica óptica.

Tags: MATLAB split-step Fourier Runge-Kutta equações de Schrödinger não lineares acopladas laser de modo trancado

Publicado em 7-28 03:34