Condición límite periódica para la ecuación de calor en] 0,1 [

13

Consideremos una condición inicial suave y la ecuación de calor en una dimensión:

ttu=XXtu
en el intervalo abierto ]0 0,1[ , y supongamos que queremos resolverlo numéricamente con diferencias finitas.

Yo sé que para mi problema a ser bien planteado, que necesito para dotarlo de las condiciones de contorno en X=0 0 y X=1 . Sé que Dirichlet o Neumann funcionan bien.

Si tengo en el primer caso norte puntos interiores xk=kN+1 parak=1,,N, entonces tengoNincógnitas:uk=u(xk)parak=1,,N, porqueuestá prescrito en los límites.

En el segundo caso, realmente tengo incógnitas de u 0 , , u N + 1 , y sé cómo usar el Neumann BC (homogéneo) para discretizar el laplaciano en el borde, por ejemplo con la unión de dos puntos ficticios x - 1 y x N + 2 y las igualdades:N+2u0,,uN+1x1xN+2

u1u12h=0=uN+2uN2h

Mi pregunta es sobre BC periódica. Tengo la sensación de que podría usar una ecuación, es decir, pero tal vez dos, y luego usaría x u ( 0 ) = x u ( 1 )

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

pero no estoy seguro. Tampoco sé cuántas incógnitas debería tener. ¿Es ?N+1

bela83
fuente
¿Tiene condiciones de frontera de Dirichlet o Neumann? El número de celdas fantasmas depende del orden de aproximación para las condiciones de contorno de Neumann.
ilciavo
@ilciavo, la pregunta es sobre las condiciones de contorno periódicas.
Bill Barth

Respuestas:

8

La mejor manera de hacer esto es (como dijiste) simplemente usar la definición de condiciones de contorno periódicas y configurar tus ecuaciones correctamente desde el principio usando el hecho de que . De hecho, aún más fuertemente, las condiciones de contorno periódicas identifican x = 0 con x = 1 . Por esta razón, solo debe tener uno de estos puntos en su dominio de solución. Un intervalo abierto no tiene sentido cuando se usan condiciones de límite periódicas ya que no hay límite .u(0)=u(1)x=0x=1

Este hecho significa que no debe colocar un punto en ya que es lo mismo que x = 0 . Discretizando con N + 1 puntos, entonces usa el hecho de que, por definición, el punto a la izquierda de x 0 es x N y el punto a la derecha de x N esx=1x=0N+1x0 xNxN x0 .

esquema de una cuadrícula periódica

Su PDE se puede discretizar en el espacio como

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

Esto se puede escribir en forma de matriz como donde A=[ - 2 1 0 0 1 1 - 2 1

tx=1Δx2Ax
A=[21001121000012110012].

Por supuesto, no hay necesidad de crear o almacenar esta matriz. Las diferencias finitas deben calcularse sobre la marcha, teniendo cuidado de manejar el primer y el último punto especialmente según sea necesario.

Como ejemplo simple, el siguiente script de MATLAB resuelve con condiciones de contorno periódicas en el dominio x [ - 1 , 1 ) . Se utiliza la solución fabricada u Ref ( t , x ) = exp ( - t ) cos ( 5 π x ) , lo que significa b ( t ,

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

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

Doug Lipinski
fuente
1
¡Excelente y sencilla solución! en caso de que alguien lo necesite aquí, las implementaciones en Python
ilciavo
Excelente ! No quería ser demasiado específico sobre el método, ya que yo mismo uso la semi-discretización, por ejemplo. Pero para la ecuación, confirma que no hay necesidad de especificar una condición en elX-derivativo? Más precisamente, ¿tal condición conduciría a un problema mal planteado?
bela83
@ bela83 Tiene razón en que no es necesario especificar nada más que la condición inicial. Hacerlo daría como resultado un sistema sobredeterminado. Todo lo que necesita hacer es tener un poco de cuidado cerca de los puntos finales del intervalo para asegurarse de envolver las cosas periódicamente. Hay muchas formas válidas de hacer esto.
Doug Lipinski
-1

De acuerdo con esto , debe imponer condiciones de contorno periódicas como:

tu(0 0,t)=tu(1,t)tuX(0 0,t)=tuX(1,t)

One way of discretising the Heat Equation implicitly using backward Euler is

un+1unΔt=ui+1n+12uin+1+ui+1n+1Δx2

Solving the system of equations

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

Where

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
fuente
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
He cambiado la notación. Depende del orden de aproximación paratuX. El primero viene detu(0 0,t)=tu(1,t) y el segundo de ux(0,t)=ux(1,t)
ilciavo
1
u1=uN adds an additional restriction(equation u1−uN=0) to your system
ilciavo