Condizioni al contorno per l'equazione di avanzamento discretizzata con un metodo della differenza finita


14

Sto cercando di trovare alcune risorse per aiutare a spiegare come scegliere le condizioni al contorno quando si usano metodi a differenza finita per risolvere i PDE.

I libri e le note a cui attualmente ho accesso dicono cose simili:

Le regole generali che governano la stabilità in presenza di confini sono troppo complicate per un testo introduttivo; richiedono sofisticati macchinari matematici

(A. Iserles Un primo corso nell'analisi numerica delle equazioni differenziali)

Ad esempio, quando si tenta di implementare il metodo leapfrog in due passaggi per l'equazione di avanzamento:

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

La soluzione si comporta bene fino a quando non raggiunge il limite, quando improvvisamente inizia a comportarsi male.

Dove posso imparare a gestire condizioni al contorno come questa?

Risposte:


12

La risposta di Sloede è molto accurata e corretta. Volevo solo aggiungere alcuni punti per facilitare la comprensione.

Fondamentalmente, qualsiasi equazione d'onda ha una velocità e una direzione intrinseche dell'onda. Per un'equazione d'onda monodimensionale: la velocità dell'onda è la costante a che determina non solo la velocità con cui l'informazione si sta propagando nel dominio ma anche la sua direzione. Se un > 0 , le informazioni sta andando da sinistra a destra e se un < 0 è il contrario.

ut+aux=0
aa>0a<0

Per il metodo del salto con la rana, quando discretizzi le equazioni ottieni: oppure: u n i =u n - 2 i +μ(u n - 1 i + 1 -u n - 1 i - 1 )doveμ=-aΔt/Δx. Nel tuo caso,μ>0

uion-uion-22Δt+un'uio+1n-1-uio-1n-12ΔX=0
uion=uion-2+μ(uio+1n-1-uio-1n-1)
μ=-un'Δt/ΔXμ>0che si traduce in un'onda che va a sinistra. Ora, se ci pensate, un'onda che sta viaggiando verso sinistra, avrà solo bisogno di una condizione al contorno al limite destro poiché tutti i valori a sinistra vengono aggiornati tramite i loro vicini di destra. In effetti, specificare qualsiasi valore al limite sinistro non è coerente con la natura del problema. In alcuni metodi, come il semplice controvento, questo viene gestito automaticamente poiché lo schema coinvolge anche solo i vicini corretti nel suo stencil. In altri metodi, come il salto della rana, devi specificare un valore "corretto".

Questo di solito viene fatto tramite estrapolazione dal dominio interno per trovare il valore mancante. Per problemi multidimensionali e non canonici, ciò implica la ricerca di tutti gli autovettori del flusso giacobino per determinare quali parti del confine necessitano effettivamente delle condizioni al contorno e quali parti richiedono l'estrapolazione.


Fisicamente, cosa significherebbe usare questa equazione con una condizione al contorno a sinistra e a destra?
Frank,

5

Risposta generale
Il problema è che non si impostano (o addirittura si specificano) le condizioni al contorno - il problema numerico è mal definito.

In generale, ci sono due modi possibili per specificare le condizioni al contorno:

  1. u0u101
  2. Cambia lo stencil numerico in modo che utilizzi solo le informazioni interne al confine.

Il modo in cui vai pesantemente dipende dalla fisica del tuo problema. Per i problemi di tipo di equazione d'onda, di solito si determinano gli autovalori del flusso giacobino per decidere se sono necessarie condizioni al contorno esterne o se deve essere utilizzata la soluzione interna (questo metodo è comunemente chiamato "controvento").



uio-1nuio+1nion+1io=1u0nu100n+1u101n

u1nu100n

Di seguito puoi trovare una versione modificata del tuo codice sorgente:

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

Bella risposta, e benvenuto su Scicomp, Sloede. Una domanda, normalmente vedo "controvento" definito come l'uso di uno stencil unilaterale in cui le informazioni sono tratte da un solo confine del dominio. Intendevi dire questo nella tua risposta?
Aron Ahmadia,

1
Si Certamente. Scusa, se la mia risposta non fosse abbastanza chiara. In genere, tuttavia, "riavvolgimento" significa solo che si tiene conto della direzione del flusso di informazioni. Non deve significare che scarti completamente un lato della soluzione, significa solo che dai la preferenza alla parte della soluzione che si trova nella direzione "controvento".
Michael Schlottke-Lakemper,

Se crei N = 1000ed esegui il codice un po 'più a lungo, scopri che non si comporta esattamente come previsto.
Simon Morris,

La ragione di ciò è che la mia soluzione di "correzione rapida" non è fisicamente sana, e soprattutto piuttosto sensibile alle oscillazioni spurie nella soluzione. Non usarlo per calcoli scientifici reali!
Michael Schlottke-Lakemper,

2

Quindi ho esaminato questo aspetto in modo più dettagliato e sembra che questo (almeno nei casi di base che sto gestendo) dipenda dalla velocità di gruppo del metodo.

Il metodo leapfrog (ad esempio) è:

uion+1=uion-1+μ(uio+1n-uio-1n)

uKn=eio(ζKΔX+ω(ζ)nΔt)

e2ioωΔt=1+μeioωΔt(eioζΔX-e-ioζΔX)

peccato(ωΔt)=μpeccato(ζΔX)

dωdζ=cos(ζΔX)1-μ2Sion2(ζΔX)[-1,1]

Ora dobbiamo scoprire la velocità del gruppo delle condizioni al contorno:

Il mio metodo :u1n+2=u1n+μu2n+1

Possiamo calcolare la velocità del gruppo di limiti come segue:

2iopeccato(ωΔt)=μeioζΔX

quindi per trovare alcune velocità di gruppo consentite dai confini dobbiamo trovare:

ω=cζ

cos(ζΔX)=0,μpeccato(ζΔX)=2peccato(ζcΔt)

ζ=π2ΔX darebbe μ=2peccato(cμπ2) per cui una soluzione per c[-1,1]esisterà. (Per la maggior parte delle scelte diμ almeno)


La soluzione che ho trovato in letteratura è quella di prendere u0n+1=u1n poiché questo ha un numero d'onda al contorno che si trova all'esterno [-1,1].

Ho ancora un bel po 'di più da leggere su questo prima di capirlo completamente. Penso che le parole chiave che sto cercando siano la teoria GKS.

Fonte per tutte queste note di A Iserles Parte III


Un calcolo più chiaro di ciò che ho fatto è disponibile qui: http://people.maths.ox.ac.uk/trefethen/publication/PDF/1983_7.pdf


-2

Ragazzi, sono molto nuovo su questo sito. Forse questo non è il posto dove chiedere, ma per favore perdonami perché sono molto nuovo qui :) Sto avendo un problema estremamente simile, l'unica differenza è la funzione di avvio che, nel mio caso, è un'onda di coseno. Il mio codice è questo: cancella tutto; CLC; chiudi tutto;

M = 1000; N = 2100;

mu = 0,5;

c = [mu 0 -mu]; f = @ (x) 1- cos (20 * pi * x-0,025). ^ 2; u = zeri (M, N); x = 0: (1 / M): 0,05; u (1: lunghezza (x), 1) = f (x); u (1: lunghezza (x), 2) = f (x - mu / (M)); x = linspace (0,1 M);

per i = 3: N hold off;

% 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);

trama (x, u (:, i)); asse ([0 1.5 -0.5 2]) drawnow; % pausa fine

C'è già questo codice qui, ma per qualche ragione, probabilmente correlato all'onda del coseno, il mio codice fallisce: / qualsiasi aiuto sarebbe apprezzato :) grazie!


2
Benvenuti su SciComp.SE! Dovresti farne una nuova domanda. (Le risposte sono pensate solo per, beh, risposte effettive.) Se usi il "link alla tua domanda" in fondo (è giallo scuro su giallo chiaro, è un po 'difficile vedere se non sai che è lì) , collegherà automaticamente la domanda a questa. (Puoi anche includere un link a questa domanda nella tua.)
Christian Clason,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.