Diferencia entre revisiones de «Ecuación del calor (Grupo MAMBD))»

De MateWiki
Saltar a: navegación, buscar
(Cambio en las condiciones iniciales)
(Delta de dirac como función de condición inicial)
 
(No se muestran 72 ediciones intermedias de 3 usuarios)
Línea 3: Línea 3:
  
 
=Introducción=
 
=Introducción=
La ecuación del calor es un modelo matemático que describe la difusión térmica en un medio. En una dimensión, se expresa como:
+
En el siguiente trabajo, se busca explorar el comportamiento de la solución a la ecuación del calor para regiones no acotadas, así como la distribución de dicha solución en según que dimensiones.
  
<center><math>u_t-u_{xx}=0.</math></center>
+
El problema del calor viene dado por:
  
donde <math>u(x,t)</math> representa la temperatura en función del tiempo y la posición.
+
<center><math>u_t - \Delta u = 0</math></center>
  
Resolveremos un problema específico utilizando la solución fundamental:
+
Donde <math>u(x, t)</math> representa la temperatura del medio en función del tiempo y de la posición.
  
<center><math>G(x,t)=\frac{1}{4\sqrt{\pi t}}e^{-\frac{x^2}{4t}},</math></center>
+
Como estamos en un medio infinito, tendremos que mirar como una perturbación térmica puntual se difunde con el tiempo. Para ello usamos la solución fundamental:
  
permitiéndonos analizar la propagación del calor en una región no acotada e interpretar los resultados.
+
<center><math>G(x,t)=\frac{1}{(4\pi t)^{n/2}}e^{-\frac{|x|^2}{4t}},</math></center>
  
=Mensaje secreto en la ecuación del calor=
+
=Solución de la ecuación del calor empleando la convolución=
  
Imaginamos que escribimos un mensaje secreto en una barra de metal infinita usando calor (interpretando teóricamente dicha barra como una recta, ya que estamos en dimensión 1). Definimos la temperatura en el instante inicial
+
Planteamos un problema particular para la ecuación del calor en una dimensión, dada por <math>u_t-u_{xx}=0</math>. Definimos la temperatura en el instante inicial
  
 
<center><math>u_0(x)=\left\{\begin{array}{ll}
 
<center><math>u_0(x)=\left\{\begin{array}{ll}
     5, & \text{$x$ está en una de las letras}\\
+
     5, & x\in[-3,-2]\cup[-1,1]\cup[2,3]\\
 
     0, & \text{en otro caso}
 
     0, & \text{en otro caso}
 
\end{array}\right. ,</math></center>
 
\end{array}\right. ,</math></center>
  
es decir, el mensaje inicial está formado por letras dibujadas en el eje <math>x</math> con calor. Con el tiempo, el calor empieza a difundirse según la ecuación <math>u_t-u_{xx}=0</math>. Su solución viene dada por la convolución
+
Con el tiempo, el calor empieza a difundirse según la ecuación dada, cuya solución viene dada por la convolución
  
<center><math>u(x,t)=\int_{-\infty}^{\infty} G(x-y,t)u_0(y) dy=\frac{1}{4\sqrt{\pi t}}\int_{-\infty}^{\infty} u_0(y)e^{-\frac{(x-y)^2}{4t}}.</math></center>
+
<center><math>u(x,t)=\int_{-\infty}^{\infty} G(x-y,t)u_0(y) dy=\frac{1}{\sqrt{4 \pi t}}\int_{-\infty}^{\infty} u_0(y)e^{-\frac{(x-y)^2}{4t}}.</math></center>
  
 
Dibujando la solución para diferentes tiempos, obtenemos lo siguiente:
 
Dibujando la solución para diferentes tiempos, obtenemos lo siguiente:
  
[[Archivo: MesajeCalor.gif|400px|thumb|center| Vídeo de la difusión del mensaje en la barra de metal con <math> t \in [0,1.60] </math>, dimensión 1.]]
+
[[Archivo: difusion_termica_1D.gif|400px|thumb|center| Vídeo de la difusión del mensaje en la barra de metal con <math> t \in [0, 10] </math>, en 1 dimensión.]]
  
Conforme avanza el tiempo, la difusión del calor hace que los bordes de las letras pierdan definición. Al inicio, las regiones calientes se distinguen claramente, pero poco a poco el calor se extiende a las áreas frías, suavizando los contornos. A medida que esta difusión continúa, las letras se vuelven borrosas hasta que el contraste desaparece por completo y el mensaje se vuelve ilegible, ya que la temperatura se ha distribuido de manera uniforme en la barra.
+
Se aprecia como, conforme avanza el tiempo, la solución tiende a cero y pierde su forma (de tres picos) dada por la condición inicial. Al inicio, las regiones calientes se distinguen claramente, pero poco a poco el calor se extiende a las áreas frías, mostrando como el calor comienza a difundirse por el resto del espacio hasta que la temperatura se ha distribuido de manera uniforme.
  
[[Archivo:BarraMetalEC.png|400px|thumb|right|Difusión del mensaje en la barra de metal]]
+
[[Archivo:BarraMetal.png|400px|thumb|right|Difusión del mensaje en la barra de metal]]
  
<syntaxhighlight lang="python">
+
{{matlab|codigo=  
import numpy as np
+
import matplotlib.pyplot as plt
+
  
# Parámetros
+
clc
L = 10.0  # Longitud de la barra
+
clear all
T = 0.1  # Tiempo final
+
close all
nx = 100  # Número de puntos en el espacio
+
nt = 1000 # Número de puntos en el tiempo
+
alpha = 1 # Coeficiente de difusión térmica
+
  
dx = L / (nx - 1)
+
imp = 6;
dt = T / (nt - 1)
+
T=[0.001,0.01,0.1];
r = alpha * dt / dx**2
+
a = [-3, -1, 2];  % Inicio de los segmentos de calor
 +
b = [-2,  1, 3];  % Fin de los segmentos de calor
 +
tf = max(T);
 +
div = 10^-3;
  
# Inicialización
+
X = -10:div:10; 
x = np.linspace(0, L, nx)
+
u = np.zeros(nx)
+
  
# Condición inicial
+
% Función de solución fundamental de la ecuación del calor en 1D
def initial_condition(x):
+
Phi = @(x,t) (1./((4*pi*t).^(1/2)) .* exp(-abs(x).^2./(4*t)));
    # Definir las regiones de las letras
+
    if 2 < x < 3 or 4 < x < 5:
+
        return 5
+
    else:
+
        return 0
+
  
u = np.array([initial_condition(xi) for xi in x])
+
U = zeros(length(X), length(T));  % Matriz para almacenar soluciones en diferentes tiempos
  
# Evolución temporal
+
% Cálculo de la solución usando la integral de convolución
for t in range(nt):
+
for j = 1:length(X)
     un = u.copy()
+
     for i = 1:length(T)
    for i in range(1, nx-1):
+
        integral_sum = 0;
        u[i] = un[i] + r * (un[i+1] - 2*un[i] + un[i-1])
+
        for k = 1:length(a)
 +
            Y = a(k):div:b(k);
 +
            integral_sum = integral_sum + trapz(Y, Phi(X(j)*ones(1,length(Y)) - Y, T(i)*ones(1,length(Y))));
 +
        end
 +
        U(j,i) = 5 * integral_sum;
 +
    end
 +
end
  
    # Visualización en tiempos específicos
+
% Dibujar todas las soluciones en una misma gráfica
     if t in [int(0.001/dt), int(0.01/dt), int(0.1/dt)]:
+
figure
        plt.plot(x, u, label=f't={t*dt:.3f}')
+
hold on
 +
colors = ['r', 'g', 'b'];
 +
 
 +
for i = 1:length(T)
 +
     plot(X, U(:,i), colors(i), 'LineWidth', 1.5, 'DisplayName', "t = " + num2str(T(i)) + " s")
 +
end
 +
 
 +
xlim([-10 10]) 
 +
ylim([0 5.5])  
 +
xlabel('Posición x')
 +
ylabel('Temperatura U(x,t)')
 +
title("Difusión térmica del mensaje en la barra de metal")
 +
legend show
 +
grid on
 +
hold off
 +
 
 +
}}
 +
 
 +
 
 +
{{matlab|codigo= 
 +
t_values = logspace(-3, 1, 50); % Valores de tiempo en escala logarítmica
 +
colors = 'r'; % Color de la curva
 +
 
 +
% Condición inicial: Representación simplificada de un mensaje con calor
 +
u0 = zeros(size(x));
 +
u0(x > -3 & x < -2) = 5; % Letra "segmento 1"
 +
u0(x > -1 & x < 1) = 5;  % Letra "segmento 2"
 +
u0(x > 2 & x < 3) = 5;  % Letra "segmento 3"
 +
 
 +
% Configurar video
 +
video = VideoWriter('difusion_termica.avi');
 +
video.FrameRate = 10;
 +
open(video);
 +
 
 +
% Figura para la animación
 +
figure;
 +
hold on;
 +
xlabel('Posición x');
 +
ylabel('Temperatura u(x, t)');
 +
title('Evolución de la difusión térmica');
 +
grid on;
 +
axis([x_min x_max 0 5]); % Fijar dimensiones de la cuadrícula en X y Y
 +
 
 +
for i = 1:length(t_values)
 +
    t = t_values(i);
 +
    sigma = sqrt(2 * t) / dx; % Relación con la solución analítica
 +
    u_t = imgaussfilt(u0, sigma); % Aproximación de difusión
 +
   
 +
    plot(x, u_t, 'Color', colors, 'LineWidth', 2);
 +
    legend(sprintf('t = %.4f', t));
 +
    axis([x_min x_max 0 5]); % Mantener eje Y fijo en cada iteración
 +
    drawnow;
 +
   
 +
    % Capturar frame para el video
 +
    frame = getframe(gcf);
 +
    writeVideo(video, frame);
 +
    clf;
 +
end
 +
 
 +
close(video);
 +
hold off;
 +
 
 +
}}
 +
 
 +
=Delta de Dirac como función de condición inicial=
 +
Partimos de:
 +
 
 +
<center><math>
 +
\begin{cases}
 +
    u_t - u_{xx} = 0 \\
 +
    u(x,0) = \delta (x)
 +
\end{cases}
 +
</math></center>
 +
 
 +
En este caso, tenemos la solución fundamental de la ecuación del calor en 1D. La pregunta que surge aquí es por qué solo tiene un pico. La respuesta a la pregunta es sencilla: La condición inicial es una delta de dirac que actúa como fuente puntual inicial de calor, por lo que al partir de una función cuyo máximo valor se concentra en un punto la función solución adquiere esta forma.
 +
 
 +
[[Archivo:Sección3imagenGrupoMAMBD.png|400px|thumb|center| Evolución de la solución de la ecuación del calor con fuente puntual.]]
 +
 
 +
<syntaxhighlight lang="python">
 +
import numpy as np
 +
import matplotlib.pyplot as plt
 +
 
 +
def heat_kernel(x, t, alpha=1):
 +
    """Solución fundamental de la ecuación del calor (distribución gaussiana)."""
 +
    return (1 / np.sqrt(4 * np.pi * alpha * t)) * np.exp(-x**2 / (4 * alpha * t))
 +
 
 +
# Discretización del espacio y tiempos
 +
x_values = np.linspace(-5, 5, 100)
 +
t_values = [0.01, 0.1, 0.5, 1, 2] # Diferentes tiempos para visualizar la evolución
 +
 
 +
plt.figure(figsize=(8,6))
 +
for t in t_values:
 +
    u_values = heat_kernel(x_values, t)
 +
    plt.plot(x_values, u_values, label=f't = {t}')
  
 
plt.xlabel('Posición x')
 
plt.xlabel('Posición x')
 
plt.ylabel('Temperatura u(x,t)')
 
plt.ylabel('Temperatura u(x,t)')
plt.title('Difusión térmica del mensaje')
+
plt.title('Evolución de la solución de la ecuación del calor con fuente puntual')
 
plt.legend()
 
plt.legend()
 +
plt.grid()
 
plt.show()
 
plt.show()
 +
 
</syntaxhighlight>
 
</syntaxhighlight>
 
=Cambio en las condiciones iniciales=
 
 
Consideremos ahora la temperatura inicial de la barra como una combinación de dos funciones características en intervalos diferentes. Definimos <math>u_0(x) = 1_{[0,1]} + 1_{[2,3]}</math>. Es decir,
 
 
<center><math>u_0(x)=\left\{\begin{array}{ll}
 
    1, & x\in[0,1]\cup[2,3]\\
 
    0, & \text{en el resto de la barra}
 
\end{array}\right. .</math></center>
 
 
Veamos como la distancia entre los dos picos iniciales afecta a la difusión del calor.
 
  
 
=Regularidad y dimensiones=
 
=Regularidad y dimensiones=
 
Vamos a explorar que ocurre al pasar a dos dimensiones (2D), analizando como la difusión del calor se dispersa más rápido en 2D debido a la propagación en múltiples direcciones.
 
Vamos a explorar que ocurre al pasar a dos dimensiones (2D), analizando como la difusión del calor se dispersa más rápido en 2D debido a la propagación en múltiples direcciones.
  
Actualmente, hemos estado trabajando en 1D, donde la ecuación del calor viene dada por <math>u_t-u_{xx}=0.</math>. En cuanto a la regularidad, sabemos que dicha ecuación tiene un efecto regularizador, es decir, aunque la condición inicial tenga discontinuidades, la solución se vuelve suave para <math>t>0</math>. Por otro lado, la difusión en 1D ocurre a lo largo de una sola dirección (el eje <math>x</math>) y la solución se suaviza rápidamente con el tiempo.
+
En 1D, la ecuación del calor viene dada por <math>u_t-u_{xx}=0</math>. Sabemos que dicha ecuación tiene un efecto regularizador, es decir, aunque la condición inicial tenga discontinuidades, la solución se vuelve suave para <math>t>0</math>. Por otro lado, la difusión en 1D ocurre a lo largo de una sola dirección (el eje <math>x</math>) y la solución se suaviza a una determinada velocidad en el tiempo.
  
 
Veamos que ocurre en 2D. Ahora, nuestra ecuación es <math>u_t-u_{xx}-u_{yy}=0</math>. La temperatura inicial se define ahora como:
 
Veamos que ocurre en 2D. Ahora, nuestra ecuación es <math>u_t-u_{xx}-u_{yy}=0</math>. La temperatura inicial se define ahora como:
 +
  
 
<center><math>u_0(x)=\left\{\begin{array}{ll}
 
<center><math>u_0(x)=\left\{\begin{array}{ll}
     5, & \text{si $(x,y)$ está dentro de una de las letras}\\
+
     5, & (x,y)\in([-3,-2]\cup[-1,1]\cup[2,3])\times([-3,-2]\cup[-1,1]\cup[2,3])\\
 
     0, & \text{en otro caso}
 
     0, & \text{en otro caso}
 
\end{array}\right. ,</math></center>
 
\end{array}\right. ,</math></center>
  
Aquí, el efecto regularizador del que hablábamos sigue presente. En cambio, la rapidez con la que se suaviza la solución puede variar. En dimensiones superiores la difusión ocurre en múltiples direcciones, lo que hará que se suavice más rápido. En general, a mayor dimensión, más rápido se dispersa el calor, ya que hay mas direcciones hacia las que puede propagarse.
 
  
 +
Generalizando a <math>n</math> dimensiones, la ecuación del calor vendrá dada por: <math>u_t - \Delta u = 0</math>, cuya solución fundamental (análoga a la hallada para una dimensión) se distribuye como una gaussiana en varias variables (<math>n</math>):
 +
<center><math>u(x,t) = \frac{1}{(4\pi t)^{n/2}} e^{-\frac{|x|^2}{4 t}}</math></center>
 +
 +
El efecto regularizador de la ecuación sigue presente en cualquier dimensión <math>n</math>. Sin embargo, en dimensiones más altas, esta dispersión es más rápida, ya que <math>(4\pi t)^{n/2}</math> en la solución fundamental crece cuando lo hace <math>n</math>; nos surge entonces la pregunta de cómo podemos comparar el tiempo de dispersión en distintas dimensiones.
 +
 +
En \( n \) dimensiones, el calor decae como \(u(x,t) \sim t^{-n/2}\), lo que reafirma que este se disipa más rápido a medida que aumenta la dimensión del espacio. Si queremos comparar el tiempo característico de disipación \( t_d \) en distintas dimensiones, llegamos a la relación \( t_d(n) \sim \frac{t_d(1)}{n/2} \), que nos dice que el tiempo de disipación en dimensión \( n \) es inversamente proporcional a \( n/2 \).
 +
 +
[[Archivo: Heat_equation_2D.gif|400px|thumb|center| Vídeo de la difusión del mensaje en la barra de metal con <math> t \in [0, 10] </math>, dimensión 2 (2D).]]
 +
 +
Comparemos así la gráfica superior con la hallada para el análisis en dos dimensiones. Podemos apreciar fácilmente como para un mismo periodo de tiempo el calor en cada punto del espacio es menor en esta gráfica que en la anterior pues en 1D, el calor solo se propaga en una dirección, lo que complica la disipación tal y como vemos, pues al aumentar un grado de libertad, para \( t=10 \) el calor en el sistema es casi imperceptible.
 +
 +
{{matlab|codigo=
 +
clc
 +
clear all
 +
close all
 +
 +
a=-4; b=4;                      % Intervalo de definición de la x ([a,b]^2)
 +
div=0.05;                      % División del vector en x
 +
X=a:div:b;                      % Vector de X
 +
[X1,X2]=meshgrid(X,X);          % Creación de la malla en x
 +
 +
% Definir las condiciones iniciales
 +
U0 = zeros(size(X1));
 +
U0((X1 > -3) & (X1 < -2) & (X2 > -1) & (X2 < 1)) = 5; % Letra 1
 +
U0((X1 > -1) & (X1 < 1) & (X2 > -2) & (X2 < 2)) = 5;  % Letra 2
 +
U0((X1 > 2) & (X1 < 3) & (X2 > -1) & (X2 < 1)) = 5;  % Letra 3
 +
 +
% Solución de la ecuación del calor mediante convolución con la solución fundamental
 +
norma2=@(x1,x2)sqrt(x1.^2+x2.^2);  % Función norma
 +
Phi2 = @(x1,x2,t)(1./((4*pi*t)).*exp(-norma2(x1,x2).^2./(4*t))); % Solución fundamental en 2D
 +
 +
% Parámetros de animación
 +
T_max = 10;        % Tiempo máximo de simulación
 +
num_frames = 100;  % Número de cuadros en la animación
 +
T_values = linspace(0.001, T_max, num_frames);
 +
 +
% Crear objeto de video
 +
video_filename = 'heat_equation_2D.mp4';
 +
vid = VideoWriter(video_filename, 'MPEG-4');
 +
vid.FrameRate = 20; % FPS del video
 +
open(vid);
 +
 +
figure;
 +
cmap = hot;
 +
clim = [0, 5]; % Fijar la escala de colores entre 0 y 5
 +
for i=1:length(T_values)
 +
    U = conv2(U0, Phi2(X1,X2,T_values(i)), 'same') * div^2; % Convolución discreta
 +
   
 +
    surf(X1,X2,U)
 +
    shading interp
 +
    colorbar;
 +
    colormap(cmap);
 +
    caxis(clim); % Mantener la escala de colores fija
 +
    xlabel('X')
 +
    ylabel('Y')
 +
    zlabel('Temperatura')
 +
    title("Evolución en 2D para t="+num2str(T_values(i),'%.3f')+' s')
 +
    axis([-4 4 -4 4 0 5]);
 +
    frame = getframe(gcf);
 +
    writeVideo(vid, frame);
 +
end
 +
 +
close(vid);
 +
 +
disp(['Video guardado como: ', video_filename]);
  
FALTA AÑADIR GRÁFICAS DE LA DIFUSIÓN EN 2D VIENDO COMO SE EXTIENDE EN TODAS LAS DIRECCIONES DEL PLANO
+
}}
  
 
[[Categoría:EDP]]
 
[[Categoría:EDP]]
  
 
[[Categoría:EDP24/25]]
 
[[Categoría:EDP24/25]]

Revisión actual del 21:29 19 mar 2025

Trabajo realizado por estudiantes
Título Ecuación del calor. Grupo MAMBD
Asignatura EDP
Curso 2024-25
Autores Matilde Rubio Arranz, Antonio Lozano Fernández, Marcos Gil García, Bárbara Jiménez Pérez y Daniel Marcos Viña
Este artículo ha sido escrito por estudiantes como parte de su evaluación en la asignatura


1 Introducción

En el siguiente trabajo, se busca explorar el comportamiento de la solución a la ecuación del calor para regiones no acotadas, así como la distribución de dicha solución en según que dimensiones.

El problema del calor viene dado por:

[math]u_t - \Delta u = 0[/math]

Donde [math]u(x, t)[/math] representa la temperatura del medio en función del tiempo y de la posición.

Como estamos en un medio infinito, tendremos que mirar como una perturbación térmica puntual se difunde con el tiempo. Para ello usamos la solución fundamental:

[math]G(x,t)=\frac{1}{(4\pi t)^{n/2}}e^{-\frac{|x|^2}{4t}},[/math]

2 Solución de la ecuación del calor empleando la convolución

Planteamos un problema particular para la ecuación del calor en una dimensión, dada por [math]u_t-u_{xx}=0[/math]. Definimos la temperatura en el instante inicial

[math]u_0(x)=\left\{\begin{array}{ll} 5, & x\in[-3,-2]\cup[-1,1]\cup[2,3]\\ 0, & \text{en otro caso} \end{array}\right. ,[/math]

Con el tiempo, el calor empieza a difundirse según la ecuación dada, cuya solución viene dada por la convolución

[math]u(x,t)=\int_{-\infty}^{\infty} G(x-y,t)u_0(y) dy=\frac{1}{\sqrt{4 \pi t}}\int_{-\infty}^{\infty} u_0(y)e^{-\frac{(x-y)^2}{4t}}.[/math]

Dibujando la solución para diferentes tiempos, obtenemos lo siguiente:

Vídeo de la difusión del mensaje en la barra de metal con [math] t \in [0, 10] [/math], en 1 dimensión.

Se aprecia como, conforme avanza el tiempo, la solución tiende a cero y pierde su forma (de tres picos) dada por la condición inicial. Al inicio, las regiones calientes se distinguen claramente, pero poco a poco el calor se extiende a las áreas frías, mostrando como el calor comienza a difundirse por el resto del espacio hasta que la temperatura se ha distribuido de manera uniforme.

Difusión del mensaje en la barra de metal
clc 
clear all 
close all 

imp = 6;
T=[0.001,0.01,0.1];
a = [-3, -1, 2];  % Inicio de los segmentos de calor
b = [-2,  1, 3];  % Fin de los segmentos de calor
tf = max(T); 
div = 10^-3; 

X = -10:div:10;  

% Función de solución fundamental de la ecuación del calor en 1D
Phi = @(x,t) (1./((4*pi*t).^(1/2)) .* exp(-abs(x).^2./(4*t))); 

U = zeros(length(X), length(T));  % Matriz para almacenar soluciones en diferentes tiempos

% Cálculo de la solución usando la integral de convolución
for j = 1:length(X)
    for i = 1:length(T)
        integral_sum = 0;
        for k = 1:length(a) 
            Y = a(k):div:b(k); 
            integral_sum = integral_sum + trapz(Y, Phi(X(j)*ones(1,length(Y)) - Y, T(i)*ones(1,length(Y))));
        end
        U(j,i) = 5 * integral_sum; 
    end
end

% Dibujar todas las soluciones en una misma gráfica
figure
hold on
colors = ['r', 'g', 'b'];

for i = 1:length(T) 
    plot(X, U(:,i), colors(i), 'LineWidth', 1.5, 'DisplayName', "t = " + num2str(T(i)) + " s") 
end

xlim([-10 10])  
ylim([0 5.5]) 
xlabel('Posición x') 
ylabel('Temperatura U(x,t)') 
title("Difusión térmica del mensaje en la barra de metal") 
legend show 
grid on 
hold off


t_values = logspace(-3, 1, 50); % Valores de tiempo en escala logarítmica
colors = 'r'; % Color de la curva

% Condición inicial: Representación simplificada de un mensaje con calor
u0 = zeros(size(x));
u0(x > -3 & x < -2) = 5; % Letra "segmento 1"
u0(x > -1 & x < 1) = 5;  % Letra "segmento 2"
u0(x > 2 & x < 3) = 5;  % Letra "segmento 3"

% Configurar video
video = VideoWriter('difusion_termica.avi');
video.FrameRate = 10;
open(video);

% Figura para la animación
figure;
hold on;
xlabel('Posición x');
ylabel('Temperatura u(x, t)');
title('Evolución de la difusión térmica');
grid on;
axis([x_min x_max 0 5]); % Fijar dimensiones de la cuadrícula en X y Y

for i = 1:length(t_values)
    t = t_values(i);
    sigma = sqrt(2 * t) / dx; % Relación con la solución analítica
    u_t = imgaussfilt(u0, sigma); % Aproximación de difusión
    
    plot(x, u_t, 'Color', colors, 'LineWidth', 2);
    legend(sprintf('t = %.4f', t));
    axis([x_min x_max 0 5]); % Mantener eje Y fijo en cada iteración
    drawnow;
    
    % Capturar frame para el video
    frame = getframe(gcf);
    writeVideo(video, frame);
    clf;
end

close(video);
hold off;


3 Delta de Dirac como función de condición inicial

Partimos de:

[math] \begin{cases} u_t - u_{xx} = 0 \\ u(x,0) = \delta (x) \end{cases} [/math]

En este caso, tenemos la solución fundamental de la ecuación del calor en 1D. La pregunta que surge aquí es por qué solo tiene un pico. La respuesta a la pregunta es sencilla: La condición inicial es una delta de dirac que actúa como fuente puntual inicial de calor, por lo que al partir de una función cuyo máximo valor se concentra en un punto la función solución adquiere esta forma.

Evolución de la solución de la ecuación del calor con fuente puntual.
import numpy as np
import matplotlib.pyplot as plt

def heat_kernel(x, t, alpha=1):
    """Solución fundamental de la ecuación del calor (distribución gaussiana)."""
    return (1 / np.sqrt(4 * np.pi * alpha * t)) * np.exp(-x**2 / (4 * alpha * t))

# Discretización del espacio y tiempos
x_values = np.linspace(-5, 5, 100)
t_values = [0.01, 0.1, 0.5, 1, 2]  # Diferentes tiempos para visualizar la evolución

plt.figure(figsize=(8,6))
for t in t_values:
    u_values = heat_kernel(x_values, t)
    plt.plot(x_values, u_values, label=f't = {t}')

plt.xlabel('Posición x')
plt.ylabel('Temperatura u(x,t)')
plt.title('Evolución de la solución de la ecuación del calor con fuente puntual')
plt.legend()
plt.grid()
plt.show()

4 Regularidad y dimensiones

Vamos a explorar que ocurre al pasar a dos dimensiones (2D), analizando como la difusión del calor se dispersa más rápido en 2D debido a la propagación en múltiples direcciones.

En 1D, la ecuación del calor viene dada por [math]u_t-u_{xx}=0[/math]. Sabemos que dicha ecuación tiene un efecto regularizador, es decir, aunque la condición inicial tenga discontinuidades, la solución se vuelve suave para [math]t\gt0[/math]. Por otro lado, la difusión en 1D ocurre a lo largo de una sola dirección (el eje [math]x[/math]) y la solución se suaviza a una determinada velocidad en el tiempo.

Veamos que ocurre en 2D. Ahora, nuestra ecuación es [math]u_t-u_{xx}-u_{yy}=0[/math]. La temperatura inicial se define ahora como:


[math]u_0(x)=\left\{\begin{array}{ll} 5, & (x,y)\in([-3,-2]\cup[-1,1]\cup[2,3])\times([-3,-2]\cup[-1,1]\cup[2,3])\\ 0, & \text{en otro caso} \end{array}\right. ,[/math]


Generalizando a [math]n[/math] dimensiones, la ecuación del calor vendrá dada por: [math]u_t - \Delta u = 0[/math], cuya solución fundamental (análoga a la hallada para una dimensión) se distribuye como una gaussiana en varias variables ([math]n[/math]):

[math]u(x,t) = \frac{1}{(4\pi t)^{n/2}} e^{-\frac{|x|^2}{4 t}}[/math]

El efecto regularizador de la ecuación sigue presente en cualquier dimensión [math]n[/math]. Sin embargo, en dimensiones más altas, esta dispersión es más rápida, ya que [math](4\pi t)^{n/2}[/math] en la solución fundamental crece cuando lo hace [math]n[/math]; nos surge entonces la pregunta de cómo podemos comparar el tiempo de dispersión en distintas dimensiones.

En \( n \) dimensiones, el calor decae como \(u(x,t) \sim t^{-n/2}\), lo que reafirma que este se disipa más rápido a medida que aumenta la dimensión del espacio. Si queremos comparar el tiempo característico de disipación \( t_d \) en distintas dimensiones, llegamos a la relación \( t_d(n) \sim \frac{t_d(1)}{n/2} \), que nos dice que el tiempo de disipación en dimensión \( n \) es inversamente proporcional a \( n/2 \).

Vídeo de la difusión del mensaje en la barra de metal con [math] t \in [0, 10] [/math], dimensión 2 (2D).

Comparemos así la gráfica superior con la hallada para el análisis en dos dimensiones. Podemos apreciar fácilmente como para un mismo periodo de tiempo el calor en cada punto del espacio es menor en esta gráfica que en la anterior pues en 1D, el calor solo se propaga en una dirección, lo que complica la disipación tal y como vemos, pues al aumentar un grado de libertad, para \( t=10 \) el calor en el sistema es casi imperceptible.

clc 
clear all 
close all 

a=-4; b=4;                      % Intervalo de definición de la x ([a,b]^2) 
div=0.05;                       % División del vector en x 
X=a:div:b;                      % Vector de X 
[X1,X2]=meshgrid(X,X);          % Creación de la malla en x 

% Definir las condiciones iniciales
U0 = zeros(size(X1));
U0((X1 > -3) & (X1 < -2) & (X2 > -1) & (X2 < 1)) = 5; % Letra 1
U0((X1 > -1) & (X1 < 1) & (X2 > -2) & (X2 < 2)) = 5;  % Letra 2
U0((X1 > 2) & (X1 < 3) & (X2 > -1) & (X2 < 1)) = 5;  % Letra 3

% Solución de la ecuación del calor mediante convolución con la solución fundamental
norma2=@(x1,x2)sqrt(x1.^2+x2.^2);  % Función norma 
Phi2 = @(x1,x2,t)(1./((4*pi*t)).*exp(-norma2(x1,x2).^2./(4*t))); % Solución fundamental en 2D

% Parámetros de animación
T_max = 10;        % Tiempo máximo de simulación
num_frames = 100;  % Número de cuadros en la animación
T_values = linspace(0.001, T_max, num_frames);

% Crear objeto de video
video_filename = 'heat_equation_2D.mp4';
vid = VideoWriter(video_filename, 'MPEG-4');
vid.FrameRate = 20; % FPS del video
open(vid);

figure;
cmap = hot;
clim = [0, 5]; % Fijar la escala de colores entre 0 y 5
for i=1:length(T_values)
    U = conv2(U0, Phi2(X1,X2,T_values(i)), 'same') * div^2; % Convolución discreta
    
    surf(X1,X2,U)
    shading interp 
    colorbar;
    colormap(cmap);
    caxis(clim); % Mantener la escala de colores fija
    xlabel('X') 
    ylabel('Y') 
    zlabel('Temperatura') 
    title("Evolución en 2D para t="+num2str(T_values(i),'%.3f')+' s') 
    axis([-4 4 -4 4 0 5]);
    frame = getframe(gcf);
    writeVideo(vid, frame);
end

close(vid);

disp(['Video guardado como: ', video_filename]);