Рівняння Пуассона: накладіть повний градієнт як граничну умову через множники Лагранжа


11

У мене є фізична проблема, керована рівнянням Пуассона у двох вимірах мене є вимірювання двох компонентів градієнтаu /x таu /y вздовж деякої частини межі, Γ m , так що я хотів би накласти u

2u=f(x,y),inΩ
u/xu/yΓm і поширюється в далеке поле.
uxi0=gm,onΓm

Тангенціальна градієнтна складова, , я можу просто інтегруватись, а потім застосувати через умову Діріхле, так що Γmuux(t,0) Для того, щоб одночасно накласти нормальну складову,u

Γmux(t,0)ds=u0
, я зібрав, що мені доведеться пройти через множники Лагранжа.ux(n,0)

Тому я думаю, що тоді варіаційна форма Я витрачав тривалий час, намагаючись зібрати його з інформації про пов'язані проблеми, такі як https://answers.launchpad.net/fenics/+question/212434https://answers.launchpad.net/fenics/+question / 216323

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

але все ще не бачу, де я помиляюся. Моя спроба вирішення поки що:

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)

який працює, але дає галасливий результат, зовсім не схожий на рішення рівняння Пуассона. Здається, це має щось спільне з комбінованими просторами функцій, але я не можу знайти помилку.
Буду вдячний за будь-яку допомогу чи покажчики в правильному напрямку - вже велике спасибі!
Ура,
Маркус


Дозвольте мені правильно зрозуміти: у вас є дані Діріхле та Неймана, але лише на частині кордону?
Крістіан Класон

1
Як я зрозумів ОП, градієнт задається на межі. Дані Діріхле використовуються для нав'язування тангенціальної похідної. Я подумав, що дивно нав’язувати і Діріхлет, і Ноймана на одній частині кордону, але, можливо, в цій конкретній ситуації це відповідає. Отже, проблема полягає в тому, як застосовувати градієнтні дані на кордоні (через множники).
січня

Щоправда, це дасть суперечливі дані, але у вас все ще виникає проблема недостатньої стабільності та того, що у вас є граничні умови лише на частині кордону.
Крістіан Класон

Гаразд, дозвольте дати трохи більше інформації про конкретну фізичну проблему, яку я намагаюся вирішити. У мене є статичне магнітне поле, яке я можу вважати обертально симетричним, таким чином, 2D. Я вимірюю радіальні та осьові компоненти вектора густини магнітного поля вздовж лінії, досить близької до осі обертання, і хотів би бачити це магнітне поле на значній відстані від цієї осі обертання. Поєднання Діріхле і Неймана до н.е. було лише моєю ідеєю наблизитись до проблеми, як красномовно описав Ян - накладені градієнтні дані на межі.
Маркус

1
Гаразд, це суттєво змінює речі. Отже, у вас є необмежений домен та похідна інформація про всю "кінцеву" частину межі?
Крістіан Класон

Відповіді:


8

По-перше, загальний пункт: ви не можете прописати довільні граничні умови для часткового диференціального оператора і очікувати, що рівняння часткового диференціала (яке завжди включає в себе і оператор, і граничні умови) є добре поставленим, тобто допускає унікальне рішення, яке постійно залежить від Дані - все це є необхідною умовою насправді намагатися щось обчислити.

Залежно від оператора, часто існує достатня кількість дійсних умов, які ви можете встановити (щоб отримати смак, див. Тритомну монографію Lions and Magenes). Однак те, що ви намагаєтеся зробити (вкажіть повний градієнт, що еквівалентно умовам Діріхле та Неймана на одній і тій же (частині границі) для еліптичного PDE другого порядку) - серед них немає - це відоме як бічна проблема Коші, і це неправильно: немає гарантії, що дана пара граничних даних приймає рішення, і навіть якщо така існує, немає стабільності щодо невеликих збурень у даних. (Насправді, це оригінальна недоброзичлива проблема в значенні Адамара, і класичний приклад, чому ви не можете ігнорувати граничні умови, обговорюючи добре поставленість. Ви можете знайти чіткий приклад у його Лекціях про проблему Коші в лінійному частковому диференціалі рівняння 1920-х рр.)

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

  1. Якщо ви можете встановити граничні умови (Нейман, Робін, Діріхлет, - які вам, до речі, потрібно було б зафіксувати константу при інтеграції тангенціальної похідної), тоді достатньо використовувати або нормальні компоненти вашого градієнта як умову Неймана (якщо ви можете виправити постійний режим) або інтегрувати дотичні компоненти як умова Діріхле. Оскільки обидві умови, імовірно, відповідають одній і тій же функції, ви отримуєте однакове рішення в будь-якому випадку.

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

    H2


Для реалізації змішаних елементів у FEniCS див. biharmonicДемонстрацію. Це, мабуть, без терміна Лапласа, але я думаю, що його можна легко додати.
Ян Блехта

Привіт Крістіан, дякую за вашу пропозицію! У мене було враження, що рівняння Пуассона було доброякісним щодо чисельної стабільності - дякую, що вказали на це. Я прочитаю на ньому, як ви запропонували. Не впевнений, що це суттєво змінить ситуацію, але, як згадується в коментарі далі, поєднання Діріхле-Неймана, можливо, вводить в оману. Я все шукаю - це спосіб накладення градієнтних даних на межі.
Маркус

2
Рівняння Пуассона є доброякісним, але це не рівняння, яке ви намагаєтеся вирішити :) (Граничні умови є невід'ємною частиною рівняння; один оператор недостатній для вирішення стійкості.)
Крістіан Класон

Добре, це дає мені щось жувати. Дякую всім за ваш час, поради та терпіння - і вибачте за потрапляння у пастку XY ...
Маркус

4

Ви не можете розраховувати, що рішення вашої зміненої проблеми буде рішенням проблеми Пуассона, оскільки вам потрібно якось змінити проблему, щоб вона була добре поставлена.

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

Висновок: ви не можете очікувати, що PDE другого порядку визнає дві незалежні граничні умови.


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

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


2ufuH1

Моя математика, на жаль, не до кінця, і я не впевнений у математичних наслідках просторів Банаха, але я намагаюся зрозуміти, чому рівняння не є рішенням рівняння Пуассона, коли термін множника Лагранжа зникає. З фізичної точки зору рішення (до описаної нами практичної проблеми, я не маю на увазі рішення в математичному сенсі) має існувати, наскільки я бачу
Маркус

Отже, це скоріше зворотна проблема, що знаходить граничну умову для дальнього поля, яка разом із умовою Діріхле, яку ви можете накласти, дає спостережуваний нормальний градієнт на межі, на якій ви вимірюєте?
Маркус

3

Ваш підхід не може працювати, безумовно, через імплементацію та, можливо, через формулювання.

Нав'язуючи умови Діріхле в dolfin, врешті-решт встановлюється відповідне значення DOF у вашому тестовому просторі до нуля.

Це уривок із посібника з феніків :

Розділ 3.3.9 (кінець): Застосування межової умови Діріхле до лінійної системи визначить усі ступені свободи, які слід встановити заданому значенню, та модифікує лінійну систему таким чином, щоб її рішення відповідало крайовій умові. Це досягається нулюванням та вставкою 1 на діагоналі рядків матриці, що відповідає значенням Діріхле, та введенням значення Діріхле у відповідний запис правого бічного вектора [...]

vΓm

Підсумовуючи це, використовуючи стандартну процедуру в dolfin, ви не можете застосовувати і Діріхле, і інші умови на одній межі.

Однак перш ніж спробувати це виправити у своїй реалізації, перейдіть до пошуку правильних тестових просторів для вашої математичної постановки (як щойно згадував @Jan Blechta.)


Я бачу вашу думку - я думаю, що моя формулювання може не точно відображати те, що я реалізував - мої вибачення. Варіаційний варіант - це лише туманна пам’ять, і я намагаюся знову обійти його головою. Я прочитав посібник вперед і назад разом з деякими прикладами коду FEniCS, що реалізує множники Lagrange. Я подумав, що поставлене вами питання є саме тією причиною, чому ви використовуєте другу тестову функцію "d".
Маркус

Я згоден з @JanBlechta. Спочатку потрібно знайти правильний простір для множника, який нетривіальний. Можливо, тексти оптимізації обмежень PDE, де використовується множник для включення побічних умов, дадуть кілька корисних ідей. У цій роботі використовується множник для обліку часових умов Діріхле.
січня
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.