Condizione al contorno periodica per l'equazione del calore in] 0,1 [


13

Si consideri una condizione iniziale liscia e l'equazione del calore in una dimensione:

tu=XXu
nell'intervallo aperto ]0,1[ , e supponiamo che vogliamo risolverlo numericamente con differenze finite.

So che perché il mio problema sia ben posto, devo dotarlo di condizioni al contorno a X=0 e X=1 . So che Dirichlet o Neumann funzionano bene.

Se ho nel primo caso N punti interni XK=KN+1 perK=1,,N, quindi hoNincognite:uK=u(XK)perK=1,,N, perchéuè prescritto ai limiti.

Nel secondo caso ho davvero incognite u 0 , , u N + 1 e so come usare il (omogeneo) Neumann BC per discretizzare il laplaciano al confine, ad esempio con l'aggiunta di due punti fittizi x - 1 e x N + 2 e le uguaglianze:N+2u0,,uN+1X-1XN+2

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

La mia domanda riguarda il periodico BC. Ho la sensazione che potrei usare un'equazione, cioè ma forse due, e quindi userei ∂ x u ( 0 ) = x u ( 1 )

u(0)=u(1)
Xu(0)=Xu(1)

ma non sono sicuro. Non so neanche quante incognite dovrei avere. È ?N+1


Hai condizioni al contorno di Dirichlet o Neumann? Il numero di cellule fantasma dipende dall'ordine di approssimazione per le condizioni al contorno di Neumann.
ilciavo,

@ilciavo, la domanda riguarda le condizioni al contorno periodiche.
Bill Barth,

Risposte:


8

Il modo migliore per farlo è (come hai detto) semplicemente usare la definizione di condizioni al contorno periodiche e impostare le equazioni correttamente dall'inizio usando il fatto che . In effetti, ancora più fortemente, le condizioni al contorno periodiche identificano x = 0 con x = 1 . Per questo motivo, dovresti avere solo uno di questi punti nel dominio della tua soluzione. Un intervallo aperto non ha senso quando si utilizzano condizioni al contorno periodiche poiché non esiste alcun limite .u(0)=u(1)X=0X=1

Questo fatto significa che non dovresti posizionare un punto su poiché è uguale a x = 0 . Discretizzando con N + 1 punti, si usa quindi il fatto che, per definizione, il punto a sinistra di x 0 è x N e il punto a destra di x N è x 0 .X=1X=0N+1X0 XNXN X0

schema di una griglia periodica

Il PDE può quindi essere discretizzato nello spazio come

t[X0X1XN]=1ΔX2[XN-2X0+X1X0-2X1+X2XN-1-2XN+X0]

Questo può essere scritto in forma di matrice come dove A=[ - 2 1 0 0 1 1 - 2 1 0 0

tX=1ΔX2UNX
UN=[-210011-2100001-211001-2].

Ovviamente non è necessario creare o archiviare questa matrice. Le differenze finite dovrebbero essere calcolate al volo, avendo cura di gestire il primo e l'ultimo punto specialmente se necessario.

Come semplice esempio, il seguente script MATLAB risolve con condizioni al contorno periodiche sul dominio x [ - 1 , 1 ) . Viene utilizzata la soluzione prodotta u Ref ( t , x ) = exp ( - t ) cos ( 5 π x ) , che significa b ( t ,

tu=XXu+B(t,X)
X[-1,1)uarbitro(t,X)=exp(-t)cos(5πX) . Ho usato la discretizzazione temporale di Euler per semplicità e ho calcolato la soluzione sia con che senza formare la matrice. I risultati sono mostrati sotto.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

Trama della condizione iniziale

Grafico della soluzione at = 0,5

Grafico della soluzione at = 1,0

Grafico della soluzione at = 2,0


1
Ottima e semplice soluzione !! nel caso in cui qualcuno ne abbia bisogno qui le implementazioni in Python
ilciavo il

X

@ bela83 Hai ragione sul fatto che non è necessario specificare altro oltre alla condizione iniziale. Ciò comporterebbe un sistema troppo determinato. Tutto quello che devi fare è fare un po 'di attenzione vicino ai punti finali dell'intervallo per essere sicuro di avvolgere periodicamente le cose. Esistono molti modi validi per farlo.
Doug Lipinski,

-1

In base a ciò, è necessario imporre condizioni al contorno periodiche come:

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

Un modo per discretizzare l'equazione del calore in modo implicito usando l'Euler all'indietro è

un+1-unΔt=uio+1n+1-2uion+1+uio+1n+1ΔX2

Risolvere il sistema di equazioni

[io-ΔtΔX2UN][u1n+1u1n+1uNn+1]=[u1nu2nuNn]

Dove

UN=[-21000...01-2100...001-210...0001-21...00001-2...0000...01-2]

Le tue condizioni al contorno periodiche possono essere incluse aggiungendo altre due equazioni e due celle aggiuntive (fantasma) u0 e uN+1 tale che:

u1-uN=0u2-u02ΔX-uN+1-uN-12ΔX=0

Secondo la Sezione 2.11 LeVeque, questo ti dà una precisione del 2 ° ordine peruX

Finalmente il tuo sistema di equazioni sarà simile a:

[0100...0-10-1010...10-100000io-ΔtΔX2UN0000000][u0n+1u1n+1u2n+1uNn+1uN+1n+1]=[00u1nu2nuNn]

Il che ti dà N + 2 equazioni e N + 2 incognite.

Puoi anche sbarazzarti del primo delle equazioni e delle celle fantasma e arrivare a un sistema di N equazioni e N incognite.


Non capisco l'affermazione: "aggiungi due celle aggiuntive u-1 e uN" perché uN è già un punto ]0,1[. Ho in menteXK=KN+1 così che XN=NN+1.
bela83,

È solo una questione di indicizzazione. Inizi conN celle (o punti) da u0 per uN-1 e aggiungi due celle u-1 e uN. Se hai cellule che provengono dau1 per uN quindi devi aggiungere celle su u0 e uN+1
ilciavo,

OK allora non capisco le altre due equazioni! Il primo dovrebbe essere (con la notazione dalla domanda):u0=uN+1giusto ? Ma non capisco la seconda: perché non scegliere un'approssimazione della differenza centrata? Alla fine, ciò rendeN+1sconosciuti, se il primo e l'ultimo valore sono uguali. Si prega di confrontare la situazione con (omogeneo) Neumann BC nella domanda.
bela83,

Ho cambiato la notazione. Dipende dall'ordine di approssimazione peruX. Il primo vieneu(0,t)=u(1,t) e il secondo da uX(0,t)=uX(1,t)
ilciavo,

1
u1 = uN aggiunge una restrizione aggiuntiva (equazione u1 − uN = 0) al tuo sistema
ilciavo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.