Équation de Poisson: Imposer le gradient complet comme condition aux limites via les multiplicateurs de Lagrange

11

J'ai un problème physique régi par l'équation de Poisson en deux dimensions J'ai des mesures des deux composantes du gradientu /x etu /y le long d'une partie de la frontière, Γ m , je voudrais donc imposer u

2u=f(x,y),inΩ
u/xu/yΓm et se propager dans le champ lointain.
uxi0=gm,onΓm

La composante du gradient tangentiel, , je peux simplement intégrer puis appliquer à travers une condition de Dirichlet, telle que Γmuux(t,0) Afin d'imposer simultanément la composante normale,u

Γmux(t,0)ds=u0
, j'ai compris que je devrais passer par des multiplicateurs de Lagrange.ux(n,0)

Je pense donc que la forme variationnelle est alors J'ai passé beaucoup de temps à essayer de le reconstituer à partir des informations sur des problèmes connexes tels que https://answers.launchpad.net/fenics/+question/212434https://answers.launchpad.net/fenics/+question / 216323

ΩuvdxλΓm(ux(n,0)gm)vds=Ωfvdx

mais je ne vois toujours pas où je vais mal. Jusqu'à présent, ma tentative de solution est la suivante:

from dolfin import *

# Create mesh and define function space
mesh = UnitSquareMesh(64, 64)
V = FunctionSpace(mesh, "Lagrange", 1)
R = FunctionSpace(mesh, "R", 0)
W = V * R

# Create mesh function over cell facets
boundary_parts = MeshFunction("uint", mesh, mesh.topology().dim()-1)

# Mark left boundary facets as subdomain 0
class LeftBoundary(SubDomain):
    def inside(self, x, on_boundary):
        return on_boundary and x[0] < DOLFIN_EPS

Gamma_Left = LeftBoundary()
Gamma_Left.mark(boundary_parts, 0)

class FarField(SubDomain):
    def inside(self, x, on_boundary):
        return on_boundary and ( (x[0] > 1.0-DOLFIN_EPS) \
               or (x[1]<DOLFIN_EPS) or (x[1]> 1.0-DOLFIN_EPS) )

Gamma_FF = FarField()
Gamma_FF.mark(boundary_parts, 1)

# Define boundary condition
u0 = Expression("sin(x[1]*pi)")
bcs = [DirichletBC(V, u0, Gamma_Left)]

# Define variational problem
(u, lmbd) = TrialFunctions(W)
(v, d) = TestFunctions(W)

f = Expression("10*exp(-(pow(x[0] - 0.5, 2) + pow(x[1] - 0.5, 2)) / 0.02)")
g = Constant(0.0)
h = Constant(-4.0)
n = FacetNormal(mesh)

F = inner(grad(u), grad(v))*dx + d*dot(grad(u),n)*ds(0) + lmbd*dot(grad(v),n)*ds(0)-\
   (f*v*dx + g*v*ds(1) + h*d*ds(0) + lmbd*h*ds(0))

a = lhs(F)
L = rhs(F)

# Compute solution
A = assemble(a, exterior_facet_domains=boundary_parts)
b = assemble(L, exterior_facet_domains=boundary_parts)
for bc in bcs: bc.apply(A, b)

w = Function(W)
solve(A, w.vector(), b, 'lu')
(u,lmbd) = w.split()

# Plot solution
plot(u, interactive=True)

qui s'exécute mais donne un résultat bruyant ne ressemblant pas du tout à une solution d'une équation de Poisson. Cela semble avoir quelque chose à voir avec les espaces fonctionnels combinés, mais je ne trouve pas l'erreur.
J'apprécierais toute aide ou indication dans la bonne direction - merci beaucoup déjà!
À la vôtre
Markus

Markus
la source
Permettez-moi de bien comprendre: vous avez à la fois des données de Dirichlet et de Neumann, mais seulement sur une partie de la frontière?
Christian Clason
1
Si j'ai bien compris l'OP, c'est le gradient qui est donné à la frontière. Les données de Dirichlet sont utilisées pour imposer la dérivée tangentielle. J'ai trouvé étrange d'imposer à la fois Dirichlet et Neumann à une partie de la frontière, mais peut-être que dans cette situation particulière, c'est cohérent. Ainsi, le problème est plutôt de savoir comment appliquer des données de gradient à la frontière (via des multiplicateurs).
Jan
Certes, cela donnerait des données cohérentes, mais vous avez toujours le problème du manque de stabilité et du fait que vous n'avez des conditions aux limites que sur une partie de la frontière.
Christian Clason
Ok, permettez-moi de donner plus d'informations sur le problème physique spécifique que j'essaie de résoudre. J'ai un champ magnétique statique que je peux raisonnablement supposer être symétrique en rotation, donc 2D. Je mesure les composantes radiales et axiales du vecteur de densité de champ magnétique le long d'une ligne, assez près de l'axe de rotation et j'aimerais voir ce champ magnétique à une distance substantielle de cet axe de rotation. La combinaison de Dirichlet et Neumann BC était juste mon idée d'approcher le problème comme Jan l'a décrit avec éloquence - imposé des données de gradient à la frontière.
Markus
1
OK, cela change les choses de manière significative. Vous avez donc un domaine illimité et des informations dérivées sur toute la partie "finie" de la frontière?
Christian Clason

Réponses:

8

Tout d'abord, un point général: vous ne pouvez pas prescrire des conditions aux limites arbitraires pour un opérateur différentiel partiel et vous attendre à ce que l'équation différentielle partielle (qui inclut toujours à la fois l'opérateur et les conditions aux limites) soit bien posée, c'est-à-dire qu'elle admette une solution unique qui dépend en permanence de la données - tout cela est une condition nécessaire pour réellement essayer de calculer quelque chose.

Selon l'opérateur, il existe souvent un certain nombre de conditions valides que vous pouvez imposer (pour avoir un avant-goût, voir la monographie en trois volumes de Lions et Magenes). Cependant, ce que vous essayez de faire (spécifiez le gradient complet, qui équivaut à la fois aux conditions de Dirichlet et de Neumann sur la même (partie de la) frontière pour un PDE elliptique du deuxième ordre) ne fait pas partie d'eux - c'est ce qu'on appelle un problème de Cauchy latéral, et est mal posé: il n'y a aucune garantie qu'une paire donnée de données aux limites admet une solution, et même s'il en existe une, il n'y a pas de stabilité par rapport aux petites perturbations dans les données. (En fait, c'est le problème d'origine mal posé au sens de Hadamard, et l'exemple classique pour lequel vous ne pouvez pas ignorer les conditions aux limites lorsque vous discutez de la bonne pose. Vous pouvez trouver un exemple explicite dans ses conférences sur le problème de Cauchy en différentiel partiel linéaire équations des années 1920.)

(r,R)×(a,b)x=rRxy=ay=b

  1. Si vous pouvez imposer des conditions aux limites (Neumann, Robin, Dirichlet - dont vous auriez besoin pour fixer la constante dans l'intégration de la dérivée tangentielle, soit dit en passant), alors il suffit d'utiliser soit les composantes normales de votre gradient comme condition de Neumann (si vous pouvez fixer le mode constant) ou intégrez les composants tangentiels en tant que condition de Dirichlet. Étant donné que les deux conditions correspondent probablement à la même fonction, vous obtenez la même solution dans les deux cas.

  2. y=ay=bΔu=fΔu+εΔ2u=fε>0H2uuεuε0

    H2

Christian Clason
la source
Pour l'implémentation par des éléments mixtes dans FEniCS, voir la biharmonicdémo. C'est probablement sans terme Laplace mais je suppose qu'il peut être facilement ajouté.
Jan Blechta
Salut Christian, merci pour ta suggestion! J'avais l'impression que l'équation de Poisson était bénigne en ce qui concerne la stabilité numérique - merci de l'avoir signalé. Je vais le lire comme vous l'avez suggéré. Je ne sais pas si cela change sensiblement les choses, mais comme mentionné dans le commentaire plus haut, la combinaison Dirichlet-Neumann est peut-être trompeuse. «Tout» ce que je recherche, c'est un moyen d'imposer des données de gradient à la frontière.
Markus
2
L'équation de Poisson est bénigne, mais ce n'est pas l'équation que vous essayez de résoudre :) (Les conditions aux limites font partie intégrante de l'équation; l'opérateur seul est insuffisant pour décider de la stabilité.)
Christian Clason
D'accord, cela me donne quelque chose à mâcher. Merci à tous pour votre temps, vos conseils et votre patience - et mes excuses pour être tombé dans le piège XY ...
Markus
4

Vous ne pouvez pas vous attendre à ce que la solution à votre problème modifié soit une solution au problème de Poisson parce que vous devez changer le problème d'une manière ou d'une autre pour qu'il soit bien posé.

F(u,λ)=Ω12|u|2dxΩfudxΓNgudS+ΓNλ(uuD)dS
(u,λ)V×L2(ΓN)V={vH1;v|ΓD=0}ΓDuDΓNF(u)
0=DF(u)[v]=ΩuvdxΩfvdxΓNgvdSvV,
ΓNΓD
0=DF(u,λ)[v,μ]=ΩuvdxΩfvdxΓNgvdS+ΓNλvdS+ΓNμ(uuD)dS(v,μ)V×L2(ΓN),
Δu=fun=gλΓNΓN

λ|g|

ΓDvVΓD

La conclusion est que vous ne pouvez pas vous attendre à ce que le PDE de second ordre admette deux conditions aux limites indépendantes.


F(u,λ)DF(u,λ)[v,μ]derivative()

F(u,λ)λL2(ΓN)λL2(Ω)λR

Jan Blechta
la source
2ufuH1
Malheureusement, mes calculs ne sont pas à la hauteur et je ne suis pas sûr des implications mathématiques des espaces de Banach, mais j'ai du mal à voir pourquoi l'équation n'est pas une solution à une équation de Poisson lorsque le terme multiplicateur de Lagrange disparaît. D'un point de vue physique, une solution (au problème pratique que j'ai décrit, je ne veux pas dire une solution au sens mathématique) doit exister pour autant que je puisse voir
Markus
C'est donc plutôt un problème inverse, trouver la condition aux limites pour le champ lointain qui, avec la condition de Dirichlet que vous pouvez imposer, donne le gradient normal observé à la limite à laquelle vous mesurez?
Markus
3

Votre approche ne peut pas fonctionner, certainement à cause de la mise en œuvre et probablement à cause de votre formulation.

L'imposition de conditions Dirichlet dans dolfin définit finalement les DOF ​​correspondants de votre espace de test à zéro.

Ceci est un extrait du manuel fenics :

Chapitre 3.3.9 (fin): L'application d'une condition aux limites de Dirichlet à un système linéaire identifiera tous les degrés de liberté qui devraient être définis à la valeur donnée et modifiera le système linéaire de sorte que sa solution respecte la condition aux limites. Ceci est accompli en mettant à zéro et en insérant 1 sur la diagonale des lignes de la matrice correspondant aux valeurs de Dirichlet, et en insérant la valeur de Dirichlet dans l'entrée correspondante du vecteur de droite [...]

vΓm

En résumé, en utilisant la routine par défaut dans dolfin, vous ne pouvez pas appliquer à la fois Dirichlet et d'autres conditions sur la même frontière.

Cependant, avant d'essayer de résoudre ce problème dans votre implémentation, allez trouver les bons espaces de test pour votre formulation mathématique (comme vient de le mentionner @Jan Blechta.)

Jan
la source
Je vois votre point - je pense que ma formulation ne reflète pas exactement ce que j'ai mis en œuvre - mes excuses. Le principe variationnel n'est qu'un souvenir flou et j'essaye de me remettre dans la tête. J'ai lu le manuel en avant et en arrière avec quelques exemples de code FEniCS implémentant des multiplicateurs Lagrange. Je pensais que le problème que vous soulevez est exactement la raison pour laquelle vous utiliseriez une deuxième fonction de test «d».
Markus
Je suis d'accord avec @JanBlechta. Au début, vous devez trouver le bon espace pour le multiplicateur, ce qui n'est pas trivial. Peut-être que les textes sur l'optimisation des contraintes PDE, où l'on utilise des multiplicateurs pour incorporer des conditions secondaires, donneront quelques idées utiles. Dans cet article , un multiplicateur est utilisé pour tenir compte des conditions de Dirichlet dépendant du temps.
Jan