Периодическое граничное условие для уравнения теплопроводности в] 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 , и я знаю, как использовать (однородный) Нейман до н.э. для дискретизации лапласиана на границе, например, с добавлением двух фиктивные точки x1 и xN+2 и равенства:

u1u12h=0=uN+2uN2h

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

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

но я не уверен. Я тоже не знаю, сколько неизвестных мне нужно иметь. Это ?N+1

bela83
источник
У вас есть граничные условия Дирихле или Неймана? Количество клеток-призраков зависит от порядка аппроксимации для вас граничных условий Неймана.
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[x0x1xN]=1Δx2[xN2x0+x1x02x1+x2xN12xN+x0]

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

tx=1Δx2Ax
A=[21001121000012110012].

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

В качестве простого примера, следующие 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π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]

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

u1uN=0u2u02ΔxuN+1uN12Δ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:

[0100010101010100000IΔ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.

ilciavo
источник
I don't understand the statement : "add two additional cells u1 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 uN1 and you add two cells u1 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