Equazione di Poisson: impone il gradiente completo come condizione al contorno tramite i moltiplicatori di Lagrange


11

Ho un problema fisico governato dall'equazione di Poisson in due dimensioni Ho misurazioni dei due componenti del gradiente e lungo una parte del confine, , quindi vorrei imporre e si propagano nel campo lontano.u /xu /y Γ m u

2u=f(x,y),inΩ
u/xu/yΓm
uXio0=gm,onΓm

Il componente gradiente tangenziale, , posso solo integrare e quindi applicare attraverso una condizione di Dirichlet, tale che Per imporre simultaneamente il componente normale, , ho raccolto che avrei dovuto passare attraverso i moltiplicatori di Lagrange.ΓmuuX(t,0)u

ΓmuX(t,0)dS=u0
uX(n,0)

Quindi penso che la forma variazionale sia quindi Ho passato molto tempo a cercare di metterlo insieme dalle informazioni sui problemi correlati come https: //answers.launchpad.net/fenics/+question/212434 https://answers.launchpad.net/fenics/+question/216323

ΩuvdX-λΓm(uX(n,0)-gm)vdS=ΩfvdX

ma ancora non riesco a vedere dove sto sbagliando. Il mio tentativo di soluzione finora è:

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)

che corre ma dà un risultato rumoroso per nulla simile a una soluzione di un'equazione di Poisson. Sembra avere qualcosa a che fare con gli spazi delle funzioni combinate, ma non riesco a trovare l'errore.
Gradirei qualsiasi aiuto o suggerimento nella giusta direzione - molte grazie già!
Saluti
Markus


Fammi capire bene: hai entrambi i dati di Dirichlet e Neumann, ma solo su parte del confine?
Christian Clason,

1
Come ho capito l'OP, è il gradiente che viene dato al confine. I dati di Dirichlet vengono utilizzati per imporre la derivata tangenziale. Ho pensato che fosse strano imporre sia Dirichlet che Neumann a una parte del confine, ma forse in questa particolare situazione è coerente. Quindi, il problema è piuttosto come applicare i dati del gradiente al confine (tramite moltiplicatori).
Jan

È vero, ciò darebbe dati coerenti, ma hai ancora il problema della mancanza di stabilità e del fatto che hai condizioni al contorno solo su una parte del confine.
Christian Clason,

Ok, lasciami dare qualche informazione in più sul problema fisico specifico che sto cercando di risolvere. Ho un campo magnetico statico che posso ragionevolmente presumere essere simmetrico alla rotazione, quindi 2D. Misuro componenti radiali e assiali del vettore di densità del campo magnetico lungo una linea, abbastanza vicino all'asse di rotazione e vorrei vedere questo campo magnetico a una distanza sostanziale da questo asse di rotazione. La combinazione di Dirichlet e Neumann BC era solo la mia idea di affrontare il problema, come descritto in modo eloquente da Jan, imponendo dati di gradiente al confine.
Markus

1
OK, questo cambia le cose in modo significativo. Quindi hai un dominio illimitato e informazioni derivate sull'intera parte "finita" del confine?
Christian Clason,

Risposte:


8

In primo luogo, un punto generale: non è possibile prescrivere condizioni al contorno arbitrarie per un operatore differenziale parziale e aspettarsi che l'equazione differenziale parziale (che include sempre sia condizioni operatore che al contorno) sia ben posizionata, cioè ammetta una soluzione unica che dipende continuamente dal dati: tutto ciò è una condizione necessaria per provare effettivamente a calcolare qualcosa.

A seconda dell'operatore, ci sono spesso un certo numero di condizioni valide che puoi imporre (per avere un assaggio, vedi la monografia a tre volumi di Lions e Magenes). Tuttavia, ciò che si sta tentando di fare (specificare il gradiente completo, che equivale a entrambe le condizioni di Dirichlet e Neumann sullo stesso (parte del) limite per un PDE ellittico di secondo ordine) non è tra questi - questo è noto come problema di Cauchy lateralee non è corretto: non vi è alcuna garanzia che una determinata coppia di dati limite ammetta una soluzione e, anche se ne esiste una, non vi è stabilità rispetto a piccole perturbazioni nei dati. (In realtà, questo è l'originale problema mal posto nel senso di Hadamard, e l'esempio classico per cui non puoi ignorare le condizioni al contorno quando discuti di buona posizione. Puoi trovare un esempio esplicito nelle sue lezioni sul problema di Cauchy in differenziale parziale lineare equazioni degli anni '20).

Ora al tuo problema specifico (che potrebbe essere un esempio da manuale di un problema XY ). Se ho capito bene, desideri risolvere un problema esteriore per l'equazione di Poisson e prendi un dominio computazionale bidimensionale . Hai dati completi (Dirichlet - usando il trucco derivativo tangenziale - e Neumann) su (diciamo) . Se è sufficientemente grande, puoi giustificare una condizione di radiazione (che prescrive il comportamento asintotico della tua soluzione da ); vedi, ad esempio, il libro Metodi numerici per problemi esterni di Long'an Ying. La domanda è cosa sai delle restanti parti di confine, ex = r R x y = a y = b(r,R)×(un',B)X=rRXy=un'y=B .

  1. Se puoi imporre condizioni al contorno (Neumann, Robin, Dirichlet - di cui avresti bisogno per fissare la costante nell'integrazione della derivata tangenziale, a proposito), allora è sufficiente usare entrambi i componenti normali del tuo gradiente come condizione di Neumann (se è possibile correggere la modalità costante) o integrare i componenti tangenziali come condizione di Dirichlet. Poiché entrambe le condizioni presumibilmente corrispondono alla stessa funzione, si ottiene la stessa soluzione in entrambi i modi.

  2. Se non conosci il comportamento in e , hai davvero un problema di Cauchy laterale e non puoi calcolare una soluzione usando metodi standard agli elementi finiti. Il modo standard di affrontarlo è il metodo della quasi-reversibilità (introdotto da Lattés e Lions negli anni '60; vedi il loro libro ), che consiste nell'approssimare il problema del secondo ordine con un problema del quarto ordine (dove puoi - e necessità - prescrivere due condizioni al contorno). Nel tuo caso, ciò equivarrebbe a sostituire con per alcuni piccoliy = b - Δ u = f - Δ u + ε Δ 2 u = f ε > 0 H 2 u u ε u ε 0y=un'y=B-Δu=f-Δu+εΔ2u=fε>0. (Questo può anche essere interpretato come minimizzare il residuo in una norma adeguata e aggiungere un termine di regolarizzazione ; correlato al tuo commento sul trattamento del problema come un problema inverso.) Puoi mostrare che per i dati compatibili (cioè una coppia di condizioni al contorno che corrispondono effettivamente a una soluzione dell'equazione di Poisson), le soluzioni di quasi-reversibilità convergono in come .H2uuεuε0

    Poiché questo è ora un problema del quarto ordine con soluzioni in , il modo migliore per risolverlo numericamente è usare una formulazione mista di elementi finiti come quella descritta nel documento di Dardé, Hannukainen e Hyvönen. (Ci sono anche alcune diapositive online.) Non dovrebbe essere troppo difficile implementare questo approccio usando FEniCS.H2


Per l'implementazione di elementi misti in FEniCS vedere la biharmonicdemo. Questo è probabilmente senza termine di Laplace ma immagino che possa essere facilmente aggiunto.
Jan Blechta,

Ciao Christian, grazie per il tuo suggerimento! Avevo l'impressione che l'equazione di Poisson fosse benigna per quanto riguarda la stabilità numerica, grazie per averlo sottolineato. Lo leggerò come mi hai suggerito. Non sono sicuro che ciò cambi sostanzialmente le cose, ma come menzionato più avanti nel commento, la combinazione Dirichlet-Neumann è forse fuorviante. "Tutto" che sto cercando è un modo per imporre i dati del gradiente al limite.
Markus

2
L'equazione di Poisson è benigna, ma non è l'equazione che stai cercando di risolvere :) (Le condizioni al contorno sono parte integrante dell'equazione; l'operatore da solo non è sufficiente a decidere la stabilità).
Christian Clason,

Bene, questo mi dà qualcosa da masticare. Grazie a tutti per il vostro tempo, i consigli e la pazienza - e le mie scuse per essere caduto nella trappola XY ...
Markus

4

Non puoi aspettarti che la soluzione al tuo problema alterato sarebbe una soluzione al problema di Poisson perché è necessario modificare il problema in qualche modo per renderlo ben posizionato.

F(u,λ)=Ω12|u|2dX-ΩfudX-ΓNgudS+ΓNλ(u-uD)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μ(u-uD)dS(v,μ)V×L2(ΓN),
-Δu=fun=g-λΓNΓN

λ«|g|

ΓDvVΓD

La conclusione è che non puoi aspettarti che il PDE del secondo ordine ammetta due condizioni al contorno indipendenti.


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

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


2u-fuH1

Purtroppo la mia matematica non è all'altezza e non sono sicuro delle implicazioni matematiche degli spazi di Banach, ma faccio fatica a capire perché l'equazione non è una soluzione a un'equazione di Poisson quando il termine del moltiplicatore di Lagrange svanisce. Da un punto di vista fisico una soluzione (al problema pratico che ho descritto, non intendo una soluzione in senso matematico) deve esistere per quanto posso vedere
Markus,

Quindi è piuttosto un problema inverso, trovare la condizione al contorno per il campo lontano che, insieme alla condizione di Dirichlet che è possibile imporre, produce il gradiente normale osservato al confine in cui si misura?
Markus,

3

Il tuo approccio non può funzionare, sicuramente a causa dell'implementazione e probabilmente a causa della tua formulazione.

L'imposizione delle condizioni di Dirichlet in Dolfin, infine, porta a zero i corrispondenti DOF del tuo spazio test.

Questo è un estratto dal manuale fenics :

Capitolo 3.3.9 (fine): l'applicazione di una condizione al contorno di Dirichlet su un sistema lineare identificherà tutti i gradi di libertà che dovrebbero essere impostati sul valore dato e modificherà il sistema lineare in modo tale che la sua soluzione rispetti la condizione al contorno. Ciò si ottiene azzerando e inserendo 1 sulla diagonale delle righe della matrice corrispondente ai valori di Dirichlet e inserendo il valore di Dirichlet nella corrispondente voce del vettore sul lato destro [...]

vΓm

In sintesi, usando la routine predefinita in dolfin non è possibile applicare sia Dirichlet che altre condizioni sullo stesso limite.

Tuttavia, prima di provare a risolvere questo problema nella tua implementazione, vai a trovare gli spazi di prova giusti per la tua formulazione matematica (come appena menzionato da @Jan Blechta).


Vedo il tuo punto - penso che la mia formulazione potrebbe non rispecchiare esattamente ciò che ho implementato - le mie scuse. Il principio variazionale non è che un ricordo nebuloso e sto cercando di aggirarlo di nuovo. Ho letto il manuale avanti e indietro insieme ad alcuni esempi di codice FEniCS che implementano i moltiplicatori di Lagrange. Ho pensato che il problema che hai sollevato fosse esattamente il motivo per cui avresti usato una seconda funzione di test 'd'.
Markus,

Sono d'accordo con @JanBlechta. All'inizio devi trovare lo spazio giusto per il moltiplicatore, che non è banale. Forse i testi sull'ottimizzazione del vincolo PDE, in cui si utilizzano moltiplicatori per incorporare condizioni secondarie, daranno alcune idee utili. In questo documento , viene utilizzato un moltiplicatore per tenere conto delle condizioni di Dirichlet dipendenti dal tempo.
Jan
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.