Condições de contorno para a equação de advecção discretizada por um método de diferenças finitas

14

Estou tentando encontrar alguns recursos para ajudar a explicar como escolher condições de contorno ao usar métodos de diferenças finitas para resolver PDEs.

Os livros e notas aos quais tenho acesso atualmente dizem coisas semelhantes:

As regras gerais que governam a estabilidade na presença de limites são muito complicadas para um texto introdutório; eles exigem maquinaria matemática sofisticada

(A. Iserles, um primeiro curso de análise numérica de equações diferenciais)

Por exemplo, ao tentar implementar o método de salto em duas etapas para a equação de advecção:

uin+1=uin1+μ(ui+1nui1n)

usando MATLAB

M = 100; N = 100;

mu = 0.5;

c = [mu 0 -mu];
f = @(x)(exp(-100*(x-0.5).^2));

u  = zeros (M, N);
x = 1/(M+1) * (1:M);

u(:,1) = f(x);
u(:,2) = f(x + mu/(M+1));

for i = 3:N
    hold off;
    u(:,i) = conv(u(:,i-1),c,'same') + u(:,i-2);
    plot(x, u(:,i));
    axis( [ 0 1 0 2] )
    drawnow;
end

A solução se comporta bem até atingir o limite, quando de repente começa a se comportar mal.

Onde posso aprender a lidar com condições de contorno como essa?

Simon Morris
fonte

Respostas:

12

A resposta de Sloede é muito completa e correta. Eu só queria acrescentar alguns pontos para facilitar a compreensão.

Basicamente, qualquer equação de onda tem uma velocidade e direção inerentes. Para uma equação de onda unidimensional: a velocidade da onda é a constante a que determina não apenas a velocidade na qual a informação está se propagando no domínio, mas também sua direção. Se um > 0 , as informações vão da esquerda para a direita e se um < 0 é o contrário.

ut+aux=0
aa>0a<0

Para o método do sapo com salto, quando você discretiza as equações, obtém: ou: u n i =u n - 2 i +μ(u n - 1 i + 1 -u n - 1 i - 1 ) emqueμ=-aΔt/Δx. No seu caso,μ>0

uinuin22Δt+aui+1n1ui1n12Δx=0
uin=uin2+μ(ui+1n1ui1n1)
μ=aΔt/Δxμ>0que se traduz em uma onda indo para a esquerda. Agora, se você pensar bem, uma onda que está viajando para a esquerda precisará apenas de uma condição de limite no limite direito, pois todos os valores à esquerda estão sendo atualizados por meio de seus vizinhos direitos. De fato, especificar qualquer valor no limite esquerdo é inconsistente com a natureza do problema. Em certos métodos, como simples contra o vento, isso é resolvido automaticamente, pois o esquema também envolve apenas os vizinhos corretos no estêncil. Em outros métodos, como o sapo de salto, você precisa especificar algum valor "correto".

Isso geralmente é feito por extrapolação do domínio interno para encontrar o valor que falta. Para problemas multidimensionais e não canônicos, isso envolve encontrar todos os vetores próprios do fluxo jacobiano para determinar quais partes da fronteira realmente precisam de condições de fronteira e quais partes requerem extrapolação.

GradGuy
fonte
Fisicamente, o que significaria usar essa equação com uma condição de contorno no lado esquerdo e direito?
Frank Frank
5

Resposta geral
Seu problema é que você não define (nem sequer especifica) as condições de contorno - seu problema numérico está mal definido.

Geralmente, existem duas maneiras possíveis de especificar as condições de contorno:

  1. u0u101
  2. Altere o estêncil numérico para que ele use apenas informações internas no limite.

O caminho a seguir depende muito da física do seu problema. Para problemas do tipo equação de onda, geralmente determina-se os valores próprios do fluxo jacobiano para decidir se são necessárias condições de contorno externas ou se a solução interior deve ser usada (esse método é geralmente chamado de 'upwinding').



vocêEu-1nvocêEu+1nEun+1Eu=1você0 0nvocê100n+1você101n

você1nvocê100n

Você pode encontrar uma versão modificada do seu código-fonte abaixo:

M = 100; N = 100;

mu = 0.5;

c = [mu 0 -mu];
f = @(x)(exp(-100*(x-0.5).^2));

u  = zeros (M, N);
x = 1/(M+1) * (1:M);

u(:,1) = f(x);
u(:,2) = f(x + mu/(M+1));

for i = 3:N
    hold off;
    %u(:,i) = conv(u(:,i-1),c,'same') + u(:,i-2);

    % Apply the numerical stencil to all interior points
    for j = 2:M-1
        u(j,i) = u(j,i-2) + mu*(u(j+1,i-1) - u(j-1,i-1));
    end

    % Set the boundary values by interpolating linearly from the interior
    u(1,i) = 2*u(2,i) - u(3,i);
    u(M,i) = 2*u(M-1,i) - u(M-2,i);

    plot(x, u(:,i));
    axis( [ 0 1 0 2] )
    drawnow;
end
Michael Schlottke-Lakemper
fonte
Boa resposta e bem-vindo ao scicomp, Sloede. Uma pergunta, normalmente vejo "upwinding", definido como o uso de um estêncil unilateral, em que as informações são extraídas de apenas um limite do domínio. Você quis dizer isso em sua resposta?
Aron Ahmadia
1
Sim, de fato. Desculpe, se minha resposta não foi clara o suficiente. Geralmente, no entanto, "upwinding" significa apenas que você leva em consideração a direção do fluxo de informações. Isso não significa que você descarta completamente um lado da solução, apenas significa que você dá uma preferência à parte da solução que está na direção "contra o vento".
Michael Schlottke-Lakemper
Se você criar N = 1000e executar o código um pouco mais, descobrirá que ele não se comporta exatamente como o esperado.
Simon Morris
A razão para isso é que minha solução de "solução rápida" não é fisicamente correta e, além disso, é bastante sensível a oscilações espúrias na solução. Não use isso para cálculos científicos reais!
Michael Schlottke-Lakemper
2

Portanto, analisei isso com mais detalhes e parece que isso (pelo menos nos casos básicos com os quais estou lidando) depende da velocidade do grupo do método.

O método leapfrog (por exemplo) é:

vocêEun+1=vocêEun-1+μ(vocêEu+1n-vocêEu-1n)

vocêkn=eEu(ζkΔx+ω(ζ)nΔt)

e2EuωΔt=1+μeEuωΔt(eEuζΔx-e-EuζΔx)

pecado(ωΔt)=μpecado(ζΔx)

dωdζ=porque(ζΔx)1-μ2sEun2(ζΔx)[-1,1]

Agora precisamos descobrir a velocidade do grupo das condições de contorno:

você1n+2=você1n+μvocê2n+1

Podemos calcular a velocidade do grupo de fronteira da seguinte maneira:

2Eupecado(ωΔt)=μeEuζΔx

Então, para encontrar algumas velocidades de grupo que os limites permitem, precisamos encontrar:

ω=cζ

porque(ζΔx)=0 0,μpecado(ζΔx)=2pecado(ζcΔt)

ζ=π2Δxμ=2sin(cμπ2)c[1,1]μ


u0n+1=u1n[1,1]

Ainda tenho muito a ler sobre isso antes de entender completamente. Penso que as palavras-chave que procuro são a teoria GKS.

Fonte para tudo isso notas de A Iserles Part III


Um cálculo mais claro do que eu fiz pode ser encontrado aqui: http://people.maths.ox.ac.uk/trefethen/publication/PDF/1983_7.pdf

Simon Morris
fonte
-2

Pessoal, sou muito novo neste site. Talvez este não seja o lugar para perguntar, mas, por favor, me perdoe, porque sou muito novo aqui :) Estou tendo um problema extremamente semelhante, a única diferença é a função inicial que, no meu caso, é uma onda cosseno. Meu código é este: limpe tudo; clc; feche tudo;

M = 1000; N = 2100;

mu = 0,5;

c = [mu 0-mu]; f = @ (x) 1- cos (20 * pi * x-0,025). ^ 2; u = zeros (M, N); x = 0: (1 / M): 0,05; u (1: comprimento (x), 1) = f (x); u (1: comprimento (x), 2) = f (x - mu / (M)); x = espaço interno (0,1, M);

para i = 3: N adie;

% Apply the numerical stencil to all interior points
for j = 2:M-1
    u(j,i) = u(j,i-2) - mu*(u(j+1,i-1) - u(j-1,i-1));
end

% Set the boundary values by interpolating linearly from the interior
u(M,i) =  2*u(M-1,i-1) - u(M-2,i-1);

plot (x, u (:, i)); desenho do eixo ([0 1,5 -0,5 2]); % final de pausa

Já existe esse código aqui, mas por algum motivo, provavelmente relacionado à onda cosseno, meu código falha: / qualquer ajuda seria apreciada :) obrigado!

John
fonte
2
Bem-vindo ao SciComp.SE! Você deve fazer disso uma nova pergunta. (As respostas são apenas para respostas reais.) Se você usar o link "faça sua própria pergunta" na parte inferior (é amarelo escuro em amarelo claro, é certo que é difícil ver se você não sabe que existe). , vinculará automaticamente a pergunta a esta. (Você também pode incluir um link para esta questão na sua.)
Christian Clason