Periodische Randbedingung für die Wärmegleichung in] 0,1 [


13

Betrachten wir eine glatte Ausgangsbedingung und die Wärmegleichung in einer Dimension:

tu=xxu
im offenen Intervall ]0,1[ , und nehmen wir an, dass wir sie numerisch mit endlichen Differenzen lösen wollen.

Ich weiß, dass ich mein Problem mit Randbedingungen bei x=0 und ausstatten muss, damit es gut gestellt ist x=1. Ich weiß, dass Dirichlet oder Neumann gut funktionieren.

Wenn ich im ersten Fall N innere Punkte habe, ist fürk=1,,N, dann habe ichNUnbekannte:uk=u(xk)fürk=1,,N, weilxk=kN+1k=1,,NNuk=u(xk)k=1,,N an den Grenzen vorgeschrieben ist.u

Im zweiten Fall habe ich wirklich Unbekannte u 0 , , u N + 1 , und ich weiß, wie man den (homogenen) Neumann BC verwendet, um den Laplace an der Grenze zu diskretisieren, zum Beispiel mit dem Zusatz von zwei fiktiven Punkten x - 1 und x N + 2 und die Gleichungen:N+2u0,,uN+1x1xN+2

u1u12h=0=uN+2uN2h

Meine Frage betrifft das periodische BC. Ich habe das Gefühl, dass ich eine Gleichung verwenden könnte, nämlich aber vielleicht zwei, und dann würde ich x u ( 0 ) = x u (

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

aber ich bin mir nicht sicher. Ich weiß auch nicht, wie viele Unbekannte ich haben sollte. Ist es N+1 ?


Haben Sie Dirichlet- oder Neumann-Randbedingungen? Die Anzahl der Geisterzellen richtet sich nach der Reihenfolge der für Sie angenäherten Neumann-Randbedingungen.
Ilciavo

@ilciavo, es geht um periodische Randbedingungen.
Bill Barth

Antworten:


8

Der beste Weg, dies zu tun, ist (wie Sie sagten), einfach die Definition der periodischen Randbedingungen zu verwenden und Ihre Gleichungen von Anfang an korrekt unter Verwendung der Tatsache aufzustellen, dass . Tatsächlich identifizieren periodische Randbedingungen noch stärker x = 0 mit x = 1 . Aus diesem Grund sollten Sie nur einen dieser Punkte in Ihrer Lösungsdomäne haben. Ein offenes Intervall ist bei periodischen Randbedingungen nicht sinnvoll, da es keine Grenze gibt .u(0)=u(1)x=0x=1

Diese Tatsache bedeutet, dass Sie keinen Punkt bei da er mit x = 0 identisch ist . Diskretisierung mit N + 1 Punkten, verwenden Sie dann die Tatsache , dass der Punkt links von definitions x 0 heißt x N und der Punkt rechts von x N istx=1x=0N+1x0 xNxN x0 .

Schema eines periodischen Gitters

Ihre PDE kann dann im Raum als diskretisiert werden

t[x0x1xN]=1Δx2[xN2x0+x1x02x1+x2xN12xN+x0]

Dies kann in Matrixform als wobei A=[ - 2 1 0 0 1 1 - 2 1

tx=1Δx2Ax
A=[21001121000012110012].

Natürlich muss diese Matrix nicht erstellt oder gespeichert werden. Die endlichen Differenzen sollten im laufenden Betrieb berechnet werden, wobei darauf zu achten ist, dass der erste und der letzte Punkt nach Bedarf behandelt werden.

Als einfaches Beispiel löst das folgende MATLAB-Skript mit periodischen Randbedingungen auf der Domäne x [ - 1 , 1 ) . Die hergestellte Lösung U Ref ( t , x ) = exp ( - t ) cos ( 5 π x ) = ( 25 π 2 -

tu=xxu+b(t,x)
x[1,1)uRef(t,x)=exp(t)cos(5πx) verwendet wird, was bedeutet , . Ich habe der Einfachheit halber die Euler-Vorwärts-Zeitdiskretisierung verwendet und die Lösung sowohl mit als auch ohne Bildung der Matrix berechnet. Die Ergebnisse sind unten gezeigt.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

Plot of initial condition

Plot of solution at t = 0.5

Plot of solution at t = 1.0

Plot of solution at t = 2.0


1
Tolle und einfache Lösung !! falls jemand es braucht hier die umsetzungen in
python

x

@ bela83 Sie haben Recht, dass Sie nur die Anfangsbedingung angeben müssen. Dies würde zu einem überbestimmten System führen. Alles, was Sie tun müssen, ist ein wenig vorsichtig in der Nähe der Endpunkte des Intervalls zu sein, um sicherzustellen, dass Sie die Dinge regelmäßig richtig herumwickeln. Es gibt viele gültige Möglichkeiten, dies zu tun.
Doug Lipinski

-1

Nach dieser sollten Sie periodische Randbedingungen wie zu verhängen:

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

Eine Möglichkeit, die Wärmegleichung implizit mit dem Rückwärts-Euler zu diskretisieren, ist

un+1-unΔt=uich+1n+1-2uichn+1+uich+1n+1Δx2

Lösen des Gleichungssystems

[ich-ΔtΔx2EIN][u1n+1u1n+1uNn+1]=[u1nu2nuNn]

Wo

EIN=[-2100001-2100001-2100001-2100001-2000001-2]

Sie können Ihre periodischen Randbedingungen einbeziehen, indem Sie zwei weitere Gleichungen und zwei zusätzliche (Geister-) Zellen hinzufügen u0 und uN+1 so dass:

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:

[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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.