Étrange oscillation lors de la résolution de l'équation d'advection par différence finie avec des conditions aux limites de Neumann complètement fermées (réflexion aux limites)


33

J'essaie de résoudre l'équation d'advection mais j'ai une étrange oscillation apparaissant dans la solution lorsque l'onde se réfléchit depuis les limites. Si quelqu'un a déjà vu cet artefact, je serais intéressé de connaître la cause et comment l'éviter!

Ceci est un gif animé, ouvert dans une fenêtre séparée pour voir l'animation (il ne jouera qu'une fois ou pas à la fois il a été mis en cache!) Propagation d'une impulsion gaussienne

Notez que la propagation semble très stable jusqu'à ce que l'onde commence à se refléter depuis la première frontière. Que pensez-vous qu'il pourrait se passer ici? J'ai passé quelques jours à vérifier mon code et je ne trouve aucune erreur. C'est étrange car il semble y avoir deux solutions de propagation: une positive et une négative; après la réflexion de la première frontière. Les solutions semblent se déplacer le long des points de maillage adjacents.

Les détails de l'implémentation suivent.

L'équation d'advection,

ut=vux

où est la vitesse de propagation.v

Le Crank-Nicolson est une discrétisation stable inconditionnellement (lien pdf) pour l'équation d'advection à condition que varie lentement dans l'espace (ne contient que des composantes basses fréquences lors de la transformation de Fourier).u(x)

La discrétisation que j'ai appliquée est,

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

Mettre les inconnues sur le côté droit permet de l'écrire sous la forme linéaire,

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

où (pour prendre la moyenne temporelle uniformément pondérée entre le point présent et futur) et .r = v Δ tβ=0.5r=vΔt2Δx

Ces équations ont la forme matricielle , où,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)

Les vecteurs et sont connus et inconnus de la quantité que nous voulons résoudre.u n + 1unun+1

J'applique ensuite les conditions aux limites fermées de Neumann sur les limites gauche et droite. Par frontières fermées, j'entends sur les deux interfaces. Pour les frontières fermées, il s'avère que (je ne montrerai pas mon travail ici) nous avons juste besoin de résoudre l'équation de matrice ci-dessus. Comme l'a souligné @DavidKetcheson, les équations matricielles ci-dessus décrivent en fait les conditions aux limites de Dirichlet . Pour les conditions aux limites de Neumann,ux=0

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

Mise à jour

Le comportement semble assez indépendant du choix des constantes que j'utilise, mais ce sont les valeurs du graphique que vous voyez ci-dessus:

  • v = 2
  • dx = 0,2
  • dt = 0,005
  • σ = 2 (hwhm gaussien)
  • β = 0,5

Mise à jour II

Une simulation avec un coefficient de diffusion non nul, (voir commentaires ci-dessous), l'oscillation disparaît, mais l'onde ne réfléchit plus!? Je ne comprends pas pourquoi?D=1

Diffusion et advection


qu'avez-vous pris pour ? v
chris

v=2 dans ces simulations. Je mettrai à jour le paramètre de simulation. Bonne idée.
boyfarrell

Ensuite, je m'attendrais à ce que la condition initiale soit advectée vers la droite et disparaisse à travers la frontière droite. Tout ce qui me vient à l'esprit est que le schéma central peut donner des oscillations parasites à moins qu'il ne soit appliqué à l'équation d'advection-diffusion avec un nombre de cellules de Peclet inférieur à 2. Peut-être essayer le schéma au près?
chris

Pensez-vous qu'il pourrait y avoir une erreur de signe avec l'équation. En fait, mon objectif final est d'appliquer cela avec l'équation d'advection-diffusion. Je teste actuellement différents cas limites. Dans l'exemple ci-dessus, le coefficient de diffusion a été fixé à zéro. J'ai inclus une nouvelle animation ci-dessus. Je ne comprends pas pourquoi le pic ne se reflète pas lorsque le coefficient de diffusion est non nul? Il fait exactement ce que vous avez mentionné (en dehors de la direction).
boyfarrell

Je pensais à , donc le signe est ok. Le deuxième complot me semble correct. Pourquoi voudriez-vous que quelque chose reflète? Cela ne pourrait se produire que si change de signe d'une manière ou d'une autre. Essayez avec le schéma au vent pour l'advection au lieu du schéma central, alors vous devriez voir quelque chose de similaire pour . tu+vxu=0vD=0
chris

Réponses:


28

L'équation que vous résolvez ne permet pas de solutions à droite, il n'y a donc pas de condition aux limites réfléchissantes pour cette équation. Si vous considérez les caractéristiques, vous vous rendrez compte que vous ne pouvez imposer une condition aux limites qu'à la droite. Vous essayez d'imposer une condition aux limites de Dirichlet homogène à la limite de gauche, qui est mathématiquement invalide.

Pour réitérer: la méthode des caractéristiques dit que la solution doit être constante le long d' une ligne de la forme pour toute constante . Ainsi, la solution le long de la frontière gauche est déterminée par la solution à des moments antérieurs à l'intérieur de votre domaine de problème; vous ne pouvez pas y imposer de solution.xνt=CC

Contrairement à l'équation, votre schéma numérique n'admet des solutions à droite en cours. Les modes à droite sont appelés modes parasites et impliquent des fréquences très élevées. Notez que l'onde de droite est un paquet d'ondes en dents de scie, associé aux fréquences les plus élevées qui peuvent être représentées sur votre grille. Cette onde est purement un artefact numérique, créé par votre discrétisation.

Pour mettre l'accent: vous n'avez pas noté le problème complet de la valeur de limite initiale que vous essayez de résoudre. Si vous le faites, il sera clair que ce n'est pas un problème mathématique bien posé.

Je suis heureux que vous ayez posté ceci ici, car c'est une belle illustration de ce qui peut se produire lorsque vous discrétisez un problème qui n'est pas bien posé et du phénomène des modes parasites. Un gros +1 pour votre question de ma part.


merci pour la discussion et les corrections. Je n'avais pas apprécié que la matrice n'aura pas les mêmes propriétés que l'équation différentielle. Plus de commentaires à suivre ...
boyfarrell

Oui, je vois maintenant comment ce sont réellement les conditions aux limites de Dirichlet. J'ai fait une note ci-dessus pour la correction. C'est la première fois que j'essaie (en ernest) de vraiment comprendre le processus de résolution de ces équations, je continue à frapper des bosses sur la route. Je suis heureux de poster mes progrès!
Boyfarrell

@David Ketcheson: Je rencontre le même problème et j'ai posté mon problème dans le lien suivant scicomp.stackexchange.com/questions/30329/… Pouvez-vous m'expliquer pourquoi dites-vous que le problème n'est pas "mathématiquement bien posé" ? Merci.
Herman Jaramillo

@HermanJaramillo Vous essayez d'imposer une valeur de solution à la limite gauche, où elle est déjà déterminée par le PDE. Tout manuel qui comprend une discussion sur l'advection indiquera également quelles sont les conditions aux limites valides et pourquoi. J'ai ajouté un deuxième paragraphe avec des explications supplémentaires; J'espère que ça t'as aidé.
David Ketcheson

1
@HermanJaramillo: pas "mathématiquement bien posé" signifie essentiellement que vous avez deux équations pour une valeur de fonction à la frontière, la condition aux limites ainsi que la PDE elle-même. En général, ces deux équations se contredisent. Plus généralement, on peut considérer cela comme un problème d'optimisation dans lequel les deux objectifs doivent être satisfaits au mieux.
davidhigh

0

J'ai beaucoup appris des réponses ci-dessus. Je veux inclure cette réponse parce que je pense qu'elle offre des perspectives différentes sur le problème.

Considérons l'équation avec une vitesse d'onde constante .

uxx+1cutt=0.
c

Sans conditions initiales et aux limites, cette équation a une solution de la forme . (une impulsion se déplaçant vers la droite)u(x,t)=f(xct)

Si nous imposons une condition initiale , alors la solution de l'équation dans l'intervalle est . Il n'y a pas de frontière et c'est la solution.u(x,t0)=p(x)x(,)p[xc(tt0)]

Supposons maintenant que nous définissions un domaine borné , après que tous les ordinateurs aient une mémoire limitée. Ensuite, nous devons spécifier les valeurs en et , sinon nous sommes bloqués sur le plan du calcul.x[a,b]ab

Une façon de définir les conditions aux limites consiste à utiliser Dirichlet sur la limite de gauche et une condition cohérente avec la solution en cours de propagation. Autrement dit, nous pouvons définir (supposer l'instant initial ) t0

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

Cela produit une impulsion allant vers la droite jusqu'à ce qu'elle disparaisse sur le bord droit.

Poussez ici pour l'animation sur Dirichlet sur la limite gauche

Je reçois toujours du bruit que je ne peux pas comprendre (n'importe qui pourrait aider ici s'il vous plaît?)

L'autre option consiste à imposer des conditions aux limites périodiques. C'est au lieu d'imposer la condition aux limites de Dirichlet à gauche, nous pouvons imposer le paquet d'onde qui est cohérent avec la limite à gauche. C'est:

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

Cependant pour et , et comme nous devons mettre des données à l'intérieur de l'intervalle nous ajoutons une "période" de longueur , puis nous trouvons , de sorte que la condition à gauche serait (pareil!) et nous aurions une impulsion sortant sur à droite et en entrant à gauche.ac(tt0)<at>t0c>0[a,b]baac(tt0)+ba=a+b(tt0)u(a,t0)=p[bc(tt0]

Ce lien montre ce que j'appellerais des conditions aux limites périodiques.

J'ai fait les animations en python et le schéma est un schéma de Crank-Nicholson comme indiqué dans la question ici.

Je lutte toujours avec le modèle de bruit après que l'onde ait atteint la première limite (à droite).


1
Je ne pouvais pas voir l'animation sur mon téléphone portable, mais je pense que votre motif de bruit est dû au manque de précision numérique. L'absorption ne fonctionne que parce que vous imposez la solution exacte à la frontière. Par rapport à cette solution exacte, la solution numérique arrivant à la frontière droite diffère légèrement en fréquence et en phase. Cela conduit à nouveau à la réflexion et donc à l'interférence.
davidhigh

@davidhigh: Merci pour vos informations. Je vais vérifier ça. Je suis désolé que l'animation n'ait pas fonctionné sur votre téléphone. Cela ne fonctionnait pas non plus sur mon téléphone (Samsung). Cela pourrait être un logiciel manquant dans les téléphones. Cela devrait fonctionner dans un ordinateur. Merci encore.
Herman Jaramillo

De rien. L'animation elle-même n'est pas si importante, je voulais juste voir l'ampleur des erreurs. Btw, en imposant la solution exacte à la frontière, vous évitez le "mal posé" par la conception. Autrement dit, vous avez toujours deux équations pour une valeur à la frontière, mais en utilisant le résultat exact, vous les forcez à être cohérentes. Mais cela ne fonctionne qu'approximativement, car le résultat numérique n'est pas complètement exact.
davidhigh

Et un autre commentaire: la solution analytique générale à l'équation d'onde est une superposition d'une impulsion se déplaçant vers la gauche et une impulsion se déplaçant vers la droite. Dans votre cas, vous ne considérez que l'impulsion se déplaçant vers la droite, vous avez donc déjà appliqué des conditions initiales - contrairement à ce que vous énoncez dans le texte.
davidhigh

@davidhigh: J'ai réfléchi un peu à vos idées sur le bruit après que l'impulsion ait atteint la limite. Je pense que vous avez raison et qu'il y a une différence entre la solution analytique exacte et l'impulsion propagée numérique. Dans la limite, cette petite différence génère le petit motif de bruit qui y est observé. Le système d'advection CN montré dans cette discussion est dispersif et je pense que bien que la dispersion ne soit pas remarquée avant que l'impulsion n'atteigne la limite, elle pourrait déclencher mais la petite perturbation (différence entre les solutions analytiques et numériques) à la frontière. Merci encore.
Herman Jaramillo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.