Gerando automaticamente matrizes de diferenças finitas para sistemas de PDEs


8

Suponha que você tenha um sistema de PDEs para resolver. Pelo menos por simplicidade, vamos supor que seja independente do tempo, quase linear (linear em suas derivadas) resolvido em uma grade retangular no espaço (x, y) e com condições de contorno especificadas ao redor. Minha pergunta é mais geral, mas vamos começar aqui.

Pode haver duas variáveis ​​dependentes, e . A equação geral pode ter a forma:u(x,y)v(x,y)

a(x,y)Yxx+b(x,y)Yyy+cYxy+d(x,y)Yx+e(x,y)Yy=f(x,y,Y)

onde todas as funções de a são matrizes 2x2, é uma matriz 2x1 e ée f YaefY

Y(x,y)=(u(x,y)v(x,y))

Suponha que você gostaria de calcular uma aproximação numérica de diferenças finitas. Suponha que os pontos da grade estejam uniformemente espaçados em x e y. Você pode discretizar em pontos e em pontos. E então você construiria uma solução como um vetor de coluna 2 (nm).N y MxNyM

X=(u11un1unmv11vnm)

Você resolveria algum tipo de equação da matriz

(A+B+C+D+E)X=b,

onde as matrizes 2nm x 2nm a são matrizes de diferenças finitas para os operadores diferenciais correspondentes. A matriz combinada entre parênteses terá algum tipo de estrutura em bloco. Seus valores de borda podem ser complicados devido a condições de contorno.EAE

Minha pergunta é simples: existe uma maneira fácil (principalmente no Matlab ) de gerar as matrizes a ? Ou, no mínimo, um guia simples para criar todas as matrizes necessárias (exceto talvez as modificações necessárias para condições de contorno, que podem ser uma entrada manual).EAE

O problema é que eu posso fazer isso manualmente, mas é (i) muita álgebra; e (ii) sujeito a muitos erros de digitação e quando você implementa.

Por exemplo, aqui está um código que fornece todos os vetores necessários para uma 'matriz' de diferença finita 1D para diferentes ordens de derivadas. Existe uma analogia para os sistemas de PDEs no avião?

Respostas:


3

Não conheço nenhuma solução fácil, mas não é muito difícil automatizar isso usando um pacote de computação simbólico como Maple ou Maxima . Você pode ver aqui um exemplo dessa idéia aplicada a uma equação de difusão 1D.

Em particular, você deseja as funções LinearAlgebra[GenerateMatrix](no Maple) ou augcoefmatrix(no Maxima). O MATLAB tem uma caixa de ferramentas de computação simbólica que eu acho que também pode ser usada para esse fim.

Com relação à automação da implementação, você pode usar o CodeGenerationmódulo no Maple para gerar o código MATLAB ou as funções grinde fortrando Maxima para produzir uma saída próxima ao MATLAB.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.