Solver de auto-similaridade dinâmica para EDPs

Busca simbólica por reduções de escala de EDP → EDO

A equação de KdV $u_t + 6u\,u_x + u_{xxx} = 0$ admite uma solução auto-similar onde a combinação relevante de variáveis é $\eta = x\,t^{-1/3}$ e a amplitude decai como $t^{-2/3}$. Esses expoentes derivam da exigência de que cada termo na EDP dimensione-se identicamente, uma restrição que se reduz a um sistema linear; resolver isso manualmente significa fazer o acoplamento termo a termo, e a álgebra é propensa a erros o suficiente para que reduções válidas frequentemente passem despercebidas.

O pacote automatiza isso via o método de dilatação: ele atribui um expoente de escala formal a cada variável e termo, escreve a restrição de invariância como um sistema linear nesses expoentes e lê a EDO reduzida diretamente do espaço nulo (kernel) desse sistema linear. Não é necessário adivinhar ou testar potências candidatas; se existir uma similaridade de lei de potência, o método a encontra exatamente. Um wrapper baseado em strings (find_similarity_v2) também está disponível para usuários que preferem não trabalhar diretamente com expressões Symbolics.jl.

using SimilaritySolver, Symbolics

@variables x t u(..)
Dt = Differential(t); Dx = Differential(x)
kdv = Dt(u(x,t)) + 6*u(x,t)*Dx(u(x,t)) + Dx(Dx(Dx(u(x,t))))

results = find_ode_dilation(kdv; indep_vars=[x,t], dep_vars=[u(x,t)])
# results[1]["similarity_variable"]  =>  x * t^(-1//3)
# results[1]["gamma"]                =>  -2//1   (u scales as t^(-2/3))

O método retorna todas as reduções de similaridade válidas, não apenas uma. Atualmente, ele lida com duas variáveis independentes com escalas de lei de potência; a extensão para três ou mais variáveis e para simetrias que não sejam de lei de potência (logarítmicas, espirais) está em andamento.

Referências