Періодична гранична умова для рівняння тепла в] 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+1x1xN+2

u1u12h=0=uN+2uN2h

Моє запитання стосується періодичної ери. У мене є відчуття, що я міг би використовувати одне рівняння, а саме але, можливо, два, і тоді я використовував би 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[x0x1xN]=1Δx2[xN2x0+x1x02x1+x2xN12xN+x0]

tx=1Δx2Ax
A=[21001121000012110012].

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

tu=xxu+b(t,x)
x[1,1)uRef(t,x)=exp(t)cos(5πx)b(t,x)=(25π21)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+1unΔt=ui+1n+12uin+1+ui+1n+1Δx2

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

[IΔtΔx2A][u1n+1u1n+1uNn+1]=[u1nu2nuNn]

A=[210000121000012100001210000120000012]

u0uN+1

u1uN=0u2u02ΔxuN+1uN12Δx=0

ux

[0100010101010100000IΔtΔx2A0000000][u0n+1u1n+1u2n+1uNn+1uN+1n+1]=[00u1nu2nuNn]

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

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


u1uNuN]0,1[xk=kN+1xN=NN+1

Nu0uN1u1uNu1uNu0uN+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.