Strana oscillazione quando si risolve l'equazione di avanzamento per differenza finita con condizioni al contorno di Neumann completamente chiuse (riflessione ai confini)


33

Sto cercando di risolvere l'equazione di avanzamento ma ho una strana oscillazione che appare nella soluzione quando l'onda si riflette dai confini. Se qualcuno avesse già visto questo artefatto, sarei interessato a conoscere la causa e come evitarlo!

Questa è una gif animata, aperta in una finestra separata per visualizzare l'animazione (verrà riprodotta solo una volta o meno una volta memorizzata nella cache!) Propagazione di un polso gaussiano

Si noti che la propagazione sembra altamente stabile fino a quando l'onda inizia a riflettere dal primo confine. Cosa pensi possa succedere qui? Ho trascorso alcuni giorni a controllare due volte il mio codice e non riesco a trovare alcun errore. È strano perché sembrano esserci due soluzioni di propagazione: una positiva e una negativa; dopo il riflesso dal primo confine. Le soluzioni sembrano viaggiare lungo punti mesh adiacenti.

Seguono i dettagli di implementazione.

L'equazione di avanzamento,

ut=vux

dove è la velocità di propagazione.v

Crank-Nicolson è una discretizzazione stabile incondizionatamente (pdf link) per l'equazione di avanzamento a condizione che stia lentamente cambiando nello spazio (contiene solo componenti a basse frequenze quando Fourier si trasforma).u(x)

La discretizzazione che ho applicato è,

ϕjn+1ϕjnΔt=v[1β2Δx(ϕj+1nϕj1n)+β2Δx(ϕj+1n+1ϕj1n+1)]

Mettere le incognite sul lato destro consente di scrivere questo in forma lineare,

βrϕj1n+1+ϕjn+1βrϕj+1n+1=(1β)rϕj1n+ϕjn+(1β)rϕj+1n

dove (per prendere la media temporale ponderata uniformemente tra il punto presente e futuro) e .β=0.5r=vΔt2Δx

Questo insieme di equazioni ha la forma di matrice , dove,Aun+1=Mun

A=(1βr0βr1βrβr1βr0βr1)

M=(1(1β)r0(1β)r1(1β)r(1β)r1(1β)r0(1β)r1)

I vettori e sono noti e sconosciuti della quantità per cui vogliamo risolvere.unun+1

Applico quindi le condizioni al contorno di Neumann chiuse sui confini sinistro e destro. Per confini chiusi intendo su entrambe le interfacce. Per limiti chiusi si scopre che (non mostrerò il mio lavoro qui) dobbiamo solo risolvere l'equazione della matrice sopra. Come sottolineato da @DavidKetcheson, le equazioni di matrice sopra descrivono effettivamente le condizioni al contorno di Dirichlet . Per le condizioni al contorno di Neumann,ux=0

A=(100βr1βrβr1βr001)

Aggiornare

Il comportamento sembra abbastanza indipendente dalla scelta delle costanti che uso, ma questi sono i valori per la trama che vedi sopra:

  • v = 2
  • dx = 0,2
  • dt = 0.005
  • σ = 2 (Gaussian hwhm)
  • β = 0,5

Aggiornamento II

Una simulazione con coefficiente di diffusione diverso da zero, (vedi commenti sotto), l'oscillazione scompare, ma l'onda non riflette più !? Non capisco perché?D=1

Diffusione e consulenza


cosa hai preso per ? v
chris

v=2 in quelle simulazioni. Aggiornerò con l'impostazione della simulazione. Buona idea.
boyfarrell

Quindi mi aspetterei che la condizione iniziale sia indicata a destra e scompaia attraverso il confine giusto. Tutto ciò che mi viene in mente è che lo schema centrale può dare oscillazioni spurie a meno che non venga applicato all'equazione di diffusione dell'avvezione con il numero Peclet della cella inferiore a 2. Forse provare lo schema controvento?
chris

Pensi che potrebbe esserci un errore di segno con l'equazione. In realtà, il mio obiettivo finale è quello di applicare questo con l'equazione di avanzamento-diffusione. Attualmente sto testando diversi casi limitanti. Nell'esempio sopra il coefficiente di diffusione è stato impostato su zero. Ho incluso una nuova animazione sopra. Non capisco perché il picco non rifletta quando il coefficiente di diffusione è diverso da zero? Fa esattamente come hai detto (a parte la direzione).
boyfarrell

Stavo pensando a , quindi il segno è ok. La seconda trama mi sembra ok. Perché dovresti aspettarti che qualcosa rifletta? Ciò potrebbe accadere solo se cambia in qualche modo segno. Prova con lo schema controvento per l'avanzamento invece dello schema centrale, quindi dovresti vedere qualcosa di simile per . tu+vxu=0vD=0
chris

Risposte:


28

L'equazione che stai risolvendo non consente le soluzioni giuste, quindi non esiste una condizione al contorno riflettente per questa equazione. Se consideri le caratteristiche, ti renderai conto che puoi solo imporre una condizione al limite giusto. Stai cercando di imporre una condizione omogenea al confine di Dirichlet al limite sinistro, che è matematicamente non valida.

Per ribadire: il metodo delle caratteristiche dice che la soluzione deve essere costante lungo qualsiasi linea del modulo per ogni costante . Quindi la soluzione lungo il limite sinistro è determinata dalla soluzione in tempi precedenti all'interno del dominio del problema; non puoi imporre una soluzione lì.xνt=CC

Diversamente l'equazione, il tuo schema numerico non ammette soluzioni destro del corso. Le modalità di funzionamento a destra sono definite modalità parassitarie e coinvolgono frequenze molto elevate. Si noti che l'onda a destra è un pacchetto di onde a dente di sega, associato alle frequenze più alte che possono essere rappresentate sulla griglia. Quell'onda è puramente un artefatto numerico, creato dalla tua discretizzazione.

Per enfasi: non hai scritto l'intero problema del valore del limite iniziale che stai cercando di risolvere. Se lo fai, sarà chiaro che non è un problema matematicamente ben posto.

Sono contento che tu l'abbia pubblicato qui, tuttavia, poiché è una bella illustrazione di ciò che può accadere quando discretizzi un problema che non è ben posto, e del fenomeno delle modalità parassitarie. Un grande +1 per la tua domanda da parte mia.


grazie per la discussione e le correzioni. Non avevo apprezzato il fatto che la matrice non avesse le stesse proprietà dell'equazione differenziale. Altri commenti da seguire ...
boyfarrell

Sì, vedo ora come queste siano effettivamente le condizioni al contorno di Dirichlet che ho preso nota sopra per la correzione. Questa è la prima volta che ho provato (in fondo) a capire veramente il processo di risoluzione di queste equazioni, continuo a colpire dossi sulla strada. Sono felice di pubblicare i miei progressi!
boyfarrell

@David Ketcheson: sto riscontrando lo stesso problema e ho pubblicato il mio problema nel seguente link scicomp.stackexchange.com/questions/30329/… Puoi spiegarmi perché dici che il problema non è "matematicamente ben posto" ? Grazie.
Herman Jaramillo,

@HermanJaramillo Stai cercando di imporre un valore di soluzione al limite sinistro, dove è già determinato dal PDE. Qualsiasi libro di testo che includa una discussione dell'avviso indicherà anche quali sono le condizioni al contorno valide e perché. Ho aggiunto un secondo paragrafo con spiegazioni aggiuntive; spero che sia d'aiuto.
David Ketcheson,

1
@HermanJaramillo: non "matematicamente ben posato" significa sostanzialmente che hai due equazioni per un valore di funzione al limite, la condizione al contorno e lo stesso PDE. In generale, queste due equazioni si contraddicono a vicenda. Più in generale, si può considerare questo come un problema di ottimizzazione in cui entrambi gli obiettivi devono essere raggiunti nel miglior modo possibile.
davidhigh,

0

Ho imparato molto dalle risposte sopra. Voglio includere questa risposta perché credo che offra diverse intuizioni al problema.

Consideriamo l'equazione con velocità d'onda costante .

uxx+1cutt=0.
c

Senza condizioni iniziali e al contorno questa equazione ha una soluzione della forma . (un impulso si sposta verso destra)u(x,t)=f(xct)

Se imponiamo una condizione iniziale , la soluzione dell'equazione nell'intervallo è . Non c'è limite e questa è la soluzione.u(x,t0)=p(x)x(,)p[xc(tt0)]

Supponiamo ora di definire un dominio limitato , dopo che tutti i computer hanno memoria limitata. Quindi dobbiamo specificare i valori in e , altrimenti computazionalmente siamo bloccati.x[a,b]ab

Un modo per definire le condizioni al contorno è usare Dirichlet sul limite sinistro e una condizione coerente con la soluzione da propagare. Cioè, possiamo definire (assumiamo il tempo iniziale ) t0

u(a,t0)=0,u(b,t0)=p[bc(tt0)].

Questo produce un impulso che corre verso destra finché non scompare sul bordo destro.

spingere qui per l'animazione su Dirichlet sul limite sinistro

Continuo a sentire un po 'di rumore che non riesco a capire (qualcuno potrebbe aiutarmi qui per favore?)

L'altra opzione è quella di imporre condizioni al contorno periodiche. Cioè invece di imporre la condizione di confine di Dirichlet a sinistra, possiamo imporre il pacchetto d'onda che è coerente con il confine a sinistra. Questo è:

u(a,t0)=p[ac(tt0)],u(b,t0)=p[bc(tt0)].

Tuttavia per e , e poiché abbiamo bisogno di inserire i dati all'interno dell'intervallo aggiungiamo un "periodo" di lunghezza e quindi troviamo , in modo che la condizione a sinistra sia (stesso!) e avremmo un impulso in uscita a destra ed entrando a sinistra.ac(tt0)<at>t0c>0[a,b]baac(tt0)+ba=a+b(tt0)u(a,t0)=p[bc(tt0]

Questo link mostra quelle che definirei condizioni al contorno periodiche.

Ho realizzato le animazioni in pitone e lo schema è uno schema di Crank-Nicholson come indicato nella domanda qui.

Sto ancora lottando con il modello di rumore dopo che l'onda ha colpito il primo (giusto) limite.


1
Non riuscivo a vedere l'animazione sul mio cellulare, ma credo che il tuo rumore sia causato dalla mancanza di precisione numerica. L'assorbimento funziona solo perché imponi la soluzione esatta sul confine. Scritta questa soluzione esatta, la soluzione numerica che arriva al limite destro differisce leggermente in frequenza e fase. Questo porta di nuovo alla riflessione e quindi all'interferenza.
davidhigh,

@davidhigh: grazie per le tue informazioni. Controllerò questo. Mi dispiace che l'animazione non abbia funzionato nel tuo telefono. Non ha funzionato nemmeno nel mio telefono (Samsung). Potrebbe trattarsi di un software mancante nei telefoni. Dovrebbe funzionare in un computer. Grazie ancora.
Herman Jaramillo,

Prego. L'animazione in sé non è così importante, volevo solo vedere quanto sono grandi gli errori. A proposito, imponendo la soluzione esatta al confine, si evita la "cattiveria" dal design. Cioè, hai ancora due equazioni per un valore al limite, ma usando il risultato esatto le costringi a essere coerenti. Ma questo funziona solo approssimativamente, poiché il risultato numerico non è del tutto esatto.
davidhigh,

E un altro commento: la soluzione analitica generale all'equazione delle onde è una sovrapposizione di un impulso che si muove a sinistra e uno che si muove a destra. Nel tuo caso, consideri solo l'impulso che si muove a destra, quindi hai già applicato le condizioni iniziali, in contrasto con ciò che affermi nel testo.
davidhigh,

@davidhigh: ho riflettuto un po 'sulle tue intuizioni sul rumore dopo che il polso ha toccato il limite. Credo che tu abbia ragione e c'è una differenza tra la soluzione analitica esatta e l'impulso numerico propagato. Nel confine quella piccola differenza genera il piccolo schema di rumore visto lì. Il sistema di avanzamento CN mostrato in questa discussione è dispersivo e credo che mentre la dispersione non viene notata prima che l'impulso colpisca il limite, potrebbe innescare ma la piccola perturbazione (differenza tra soluzioni analitiche e numeriche) al limite. Grazie ancora.
Herman Jaramillo,
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.