Періодична гранична умова для рівняння тепла в] 0,1 [


13

Розглянемо гладку початкову умову та рівняння тепла в одному вимірі: у відкритому інтервалі ] 0 , 1 [ , і припустимо, що ми хочемо її вирішити чисельно з кінцевими різницями.

∂tu=∂xxu
]0,1[

Я знаю, що для того, щоб моя проблема була добре поставлена, мені потрібно наділити її граничними умовами при і x = 1 . Я знаю, що Діріхлет або Нойман добре працюють.x=0x=1

Якщо я маю в першому випадку внутрішніх точок x k = kN дляk=1,⋯,N, тоді у мене єNневідомих:uk=u(xk)дляk=1,⋯,N, тому щоuмежі задано на межах.xk=kN+1k=1,⋯,NNuk=u(xk)k=1,⋯,Nu

У другому випадку я дійсно маю невідомих u 0 , ⋯ , u N + 1 , і я знаю, як використовувати (однорідний) Neumann BC, щоб дискретизувати лаплаціана на кордоні, наприклад, з приєднанням двох вигаданих точок x - 1 і x N + 2 і рівності:N+2u0,⋯,uN+1x−1xN+2

u1−u−12h=0=uN+2−uN2h

Моє запитання стосується періодичної ери. У мене є відчуття, що я міг би використовувати одне рівняння, а саме але, можливо, два, і тоді я використовував би ∂ x u ( 0 ) = ∂ x u ( 1 )

u(0)=u(1)
∂xu(0)=∂xu(1)

але я не впевнений. Я не знаю, скільки невідомих я повинен мати. Це ?N+1


Чи є у вас межі Діріхле чи Неймана? Кількість клітин-привидів залежить від порядку наближення для вас граничних умов Неймана.
— ilciavo

@ilciavo, питання про періодичні граничні умови.
— Білл Барт

Відповіді:


8

Найкращий спосіб зробити це (як ви сказали) просто використовувати визначення періодичних граничних умов і правильно налаштувати свої рівняння з самого початку, використовуючи той факт, що . Насправді, ще сильніше, періодичні граничні умови ототожнюють x = 0 з x = 1 . З цієї причини у домені рішення вам слід мати лише один із цих моментів. Відкритий інтервал не має сенсу при використанні періодичних граничних умов, оскільки немає меж .u(0)=u(1)x=0x=1

x=1x=0N+1x0 xNxN x0

схема періодичної сітки

∂∂t[x0x1⋮xN]=1Δx2[xN−2x0+x1x0−2x1+x2⋮xN−1−2xN+x0]

∂∂tx→=1Δx2Ax→
A=[−210⋯011−210⋯0⋱⋱⋱⋱⋱⋱0⋯01−2110⋯01−2].

Звичайно, немає потреби насправді створювати та зберігати цю матрицю. Кінцеві відмінності слід обчислювати на льоту, обережно обробляючи першу та останню точки спеціально за потребою.

∂tu=∂xxu+b(t,x)
x∈[−1,1)uRef(t,x)=exp⁡(−t)cos⁡(5πx)b(t,x)=(25π2−1)exp⁡(−t)cos⁡(5πx)
clear

% Solve: u_t = u_xx + b
% with periodic boundary conditions

% analytical solution:
uRef = @(t,x) exp(-t)*cos(5*pi*x);
b = @(t,x) (25*pi^2-1)*exp(-t)*cos(5*pi*x);

% grid
N = 30;
x(:,1) = linspace(-1,1,N+1);

% leave off 1 point so initial condition is periodic
% (doesn't have a duplicate point)
x(end) = [];
uWithMatrix = uRef(0,x);
uNoMatrix = uRef(0,x);

dx = diff(x(1:2));
dt = dx.^2/2;

%Iteration matrix:
e = ones(N,1);
A = spdiags([e -2*e e], -1:1, N, N);
A(N,1) = 1;
A(1,N) = 1;
A = A/dx^2;

%indices (left, center, right) for second order centered difference
iLeft = [numel(x), 1:numel(x)-1]';
iCenter = (1:numel(x))';
iRight = [2:numel(x), 1]';

%plot
figure(1)
clf
hold on
h0=plot(x,uRef(0,x),'k--','linewidth',2);
h1=plot(x,uWithMatrix);
h2=plot(x,uNoMatrix,'o');
ylim([-1.2, 1.2])
legend('Analytical solution','Matrix solution','Matrix-free solution')
ht = title(sprintf('Time t = %0.2f',0));
xlabel('x')
ylabel('u')
drawnow

for t = 0:dt:1
    uWithMatrix = uWithMatrix + dt*( A*uWithMatrix + b(t,x) );
    uNoMatrix = uNoMatrix + dt*(  ( uNoMatrix(iLeft) ...
                                - 2*uNoMatrix(iCenter) ...
                                  + uNoMatrix(iRight) )/dx^2 ...
                                + b(t,x) );
    set(h0,'ydata',uRef(t,x))
    set(h1,'ydata',uWithMatrix)
    set(h2,'ydata',uNoMatrix)
    set(ht,'String',sprintf('Time t = %0.2f',t))
    drawnow
end

Сюжет початкового стану

Ділянка розчину при t = 0,5

Діаграма розчину при t = 1,0

Діаграма розчину при t = 2,0


1
Чудове і просте рішення !! на випадок, якщо комусь це знадобиться, тут реалізація в Python
— ilciavo

x

@ bela83 Ви праві, що не потрібно нічого більше вказувати, ніж початкова умова. Це призведе до надмірно визначеної системи. Все, що вам потрібно зробити, - це бути обережним біля кінцевих точок інтервалу, щоб переконатися, що ви періодично обертаєте речі. Існує багато дійсних способів зробити це.
— Дуг Ліпінський

-1

Згідно з цим вам слід вводити періодичні граничні умови як:

u(0,t)=u(1,t)ux(0,t)=ux(1,t)

Одним із способів дискредитації рівняння тепла, що імпліцитно використовується назад Ейлером, є

un+1−unΔt=ui+1n+1−2uin+1+ui+1n+1Δx2

Розв’язування системи рівнянь

[I−ΔtΔx2A][u1n+1u1n+1⋮uNn+1]=[u1nu2n⋮uNn]

A=[−21000…01−2100…001−210…0001−21…00001−2…0⋮⋮⋮⋮⋱⋱⋮000…01−2]

u0uN+1

u1−uN=0u2−u02Δx−uN+1−uN−12Δx=0

ux

[0100…0−10−1010…10−100000I−ΔtΔx2A0000000][u0n+1u1n+1u2n+1uNn+1uN+1n+1]=[00u1nu2nuNn]

Що дає вам рівняння N + 2 та невідомі N + 2.

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


u−1uNuN]0,1[xk=kN+1xN=NN+1

Nu0uN−1u−1uNu1uNu0uN+1

u0=uN+1N+1

Я змінив позначення. Це залежить від порядку наближення для . Перший походить від u ( 0 , t ) = uuxu(0,t)=u(1,t)ux(0,t)=ux(1,t)

1
u1 = uN додає до вашої системи додаткове обмеження (рівняння u1
— uN
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.