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


13

Давайте рассмотрим гладкое начальное условие и уравнение теплопроводности в одном измерении: в открытом интервале и предположим, что мы хотим решить его численно с конечными разностями.

∂TUзнак равно∂ИксИксU
]0,1[

Я знаю, что для того, чтобы моя задача была правильно поставлена, мне нужно наделить ее граничными условиями при и . Я знаю, что Дирихле или Нейман работают хорошо.Иксзнак равно0Иксзнак равно1

Если у меня в первом случае внутренних точек для , то у меня есть неизвестных: для k = 1, \ cdots, N , потому что u прописан на границах.N k=1,⋯,NNuk=u(xkxk=kN+1k=1,⋯,NNuk=u(xk)k=1,⋯,NU

Во втором случае у меня действительно есть N+2 неизвестных u0,⋯,uN+1 , и я знаю, как использовать (однородный) Нейман до н.э. для дискретизации лапласиана на границе, например, с добавлением двух фиктивные точки x−1 и xN+2 и равенства:

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

Мой вопрос о периодической до нашей эры. У меня есть ощущение, что я мог бы использовать одно уравнение, а именно но, может быть, два, и тогда я бы использовал ∂ x u ( 0)

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 = 0 . Дискретизируя с N + 1 точками, вы затем используете тот факт, что по определению точка слева от x 0 равна x N, а точка справа от x N равна x 0 .x=1x=0N+1x0 xNxN x0

схема периодической сетки

Ваш PDE может быть затем дискретизирован в пространстве как

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

Это можно записать в матричной форме как , где =[ - 2 1 0 ⋯ 0 1 1 -

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

Конечно, нет необходимости создавать или хранить эту матрицу. Конечные различия должны быть вычислены на лету, обращаясь к первым и последним точкам, особенно по мере необходимости.

В качестве простого примера, следующие MATLAB скрипт решает с периодическими граничными условиями на области х ∈ [ - 1 , 1 ) . Изготовленный раствор u Ref ( t , x ) = exp ( - t ) cos ( 5 π x

∂tu=∂xxu+b(t,x)
x∈[−1,1) , что означает b ( t ,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]

Your periodic boundary conditions can be included by adding two more equations and two additional(ghost) cells u0 and uN+1 such that:

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

According to Section 2.11 LeVeque this gives you a 2nd order accuracy for ux

Finally your system of equations will look like:

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

Which gives you N+2 equations and N+2 unknowns.

You can also get rid of the first to equations and the ghost cells and arrive at a system of N equations and N unknowns.


I don't understand the statement : "add two additional cells u−1 and uN" because uN is already a point in ]0,1[. I have in mind xk=kN+1 so that xN=NN+1.
— bela83

It's just a matter of indexing. You start with N cells (or points) from u0 to uN−1 and you add two cells u−1 and uN. If you have cells going from u1 to uN then you need to add cells at u0 and uN+1
— ilciavo

OK then I don't understand the two more equations ! The first should be (with the notation from the question): u0=uN+1 right ? But I don't understand the second one: why not choose a centered difference approximation ? Finally, that makes N+1 unknowns, if first and last values are equal. Please compare to the situation with (homogeneous) Neumann BC in the question.
— bela83

I've change the notation. It depends on the order of approximation for ux. The first comes from u(0,t)=u(1,t) and the second from ux(0,t)=ux(1,t)
— ilciavo

1
u1=uN adds an additional restriction(equation u1−uN=0) to your system
— ilciavo
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.