<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
		<id>https://mat.caminos.upm.es/w/index.php?action=history&amp;feed=atom&amp;title=Ecuaci%C3%B3n_del_calor_RAJ</id>
		<title>Ecuación del calor RAJ - Historial de revisiones</title>
		<link rel="self" type="application/atom+xml" href="https://mat.caminos.upm.es/w/index.php?action=history&amp;feed=atom&amp;title=Ecuaci%C3%B3n_del_calor_RAJ"/>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor_RAJ&amp;action=history"/>
		<updated>2026-04-23T11:36:41Z</updated>
		<subtitle>Historial de revisiones para esta página en el wiki</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor_RAJ&amp;diff=104495&amp;oldid=prev</id>
		<title>Alejandro.mates: Página creada con «{{ TrabajoED | Ecuación del calor. Grupo LÁJ| EDP|2025-26 | Luis García Suárez  Álvaro Moreno Cisneros  Juan Pérez Guerra...»</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor_RAJ&amp;diff=104495&amp;oldid=prev"/>
				<updated>2026-04-12T11:17:59Z</updated>
		
		<summary type="html">&lt;p&gt;Página creada con «{{ TrabajoED | Ecuación del calor. Grupo LÁJ| &lt;a href=&quot;/wiki/Categor%C3%ADa:EDP&quot; title=&quot;Categoría:EDP&quot;&gt;EDP&lt;/a&gt;|&lt;a href=&quot;/wiki/Categor%C3%ADa:EDP25/26&quot; title=&quot;Categoría:EDP25/26&quot;&gt;2025-26&lt;/a&gt; | Luis García Suárez  Álvaro Moreno Cisneros  Juan Pérez Guerra...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{ TrabajoED | Ecuación del calor. Grupo LÁJ| [[:Categoría:EDP|EDP]]|[[:Categoría:EDP25/26|2025-26]] | Luis García Suárez&lt;br /&gt;
&lt;br /&gt;
Álvaro Moreno Cisneros&lt;br /&gt;
&lt;br /&gt;
Juan Pérez Guerra }}&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Ecuación del calor RAJ.png||800px]]&lt;br /&gt;
[[Medio:Ecuación del calor RAJ.pdf| PDF del póster]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Abajo se puede ver el código que se ha utilizado para conseguir las gráficas. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import pandas as pd&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
#Visualización unidimensional&lt;br /&gt;
&lt;br /&gt;
def nucleo_calor(x, t):&lt;br /&gt;
    return (1.0 / np.sqrt(4 * np.pi * t)) * np.exp(-(x**2) / (4 * t))&lt;br /&gt;
&lt;br /&gt;
def condicion_inicial_escalon(x):&lt;br /&gt;
    return np.where((x &amp;gt;= 0) &amp;amp; (x &amp;lt;= 1), 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
def condicion_inicial_gaussiana(x):&lt;br /&gt;
    return np.exp(-x**2)&lt;br /&gt;
&lt;br /&gt;
def resolver_calor_integral(x_eval, t, u0_func, y_min=-10, y_max=10, dy=0.002):&lt;br /&gt;
    y = np.arange(y_min, y_max, dy)&lt;br /&gt;
    u0_y = u0_func(y)&lt;br /&gt;
&lt;br /&gt;
    u_vals = np.zeros_like(x_eval, dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i, x in enumerate(x_eval):&lt;br /&gt;
        integrando = nucleo_calor(x - y, t) * u0_y&lt;br /&gt;
        u_vals[i] = np.trapezoid(integrando, y)&lt;br /&gt;
&lt;br /&gt;
    return u_vals&lt;br /&gt;
&lt;br /&gt;
x_dominio = np.linspace(-2, 3, 500)&lt;br /&gt;
tiempos = [0.001, 0.01, 0.1, 0.5, 1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
plt.plot(x_dominio, condicion_inicial_escalon(x_dominio), 'k--', label='t = 0 (Dato Inicial)')&lt;br /&gt;
&lt;br /&gt;
for t in tiempos:&lt;br /&gt;
    u_t = resolver_calor_integral(x_dominio, t, condicion_inicial_escalon)&lt;br /&gt;
    plt.plot(x_dominio, u_t, label=f't = {t}')&lt;br /&gt;
&lt;br /&gt;
plt.title(r'Evolución de la Ecuación del Calor por Convolución en $\mathbb{R}$')&lt;br /&gt;
plt.xlabel('Posición x')&lt;br /&gt;
plt.ylabel('Temperatura u(x,t)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, alpha=0.3)&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
x_vals = np.linspace(-2, 3, 100)&lt;br /&gt;
t_vals = np.linspace(0.001, 2, 100)&lt;br /&gt;
&lt;br /&gt;
X_mesh, T_mesh = np.meshgrid(x_vals, t_vals)&lt;br /&gt;
&lt;br /&gt;
y_int = np.linspace(0, 1, 300)&lt;br /&gt;
&lt;br /&gt;
diffs = X_mesh[:, :, np.newaxis] - y_int[np.newaxis, np.newaxis, :]&lt;br /&gt;
kernel_vals = nucleo_calor(diffs, T_mesh[:, :, np.newaxis])&lt;br /&gt;
u0_y = condicion_inicial_escalon(y_int)[np.newaxis, np.newaxis, :]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U_solution = np.trapezoid(kernel_vals * u0_y, x=y_int, axis=2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fig = plt.figure(figsize=(9, 7))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
surf = ax.plot_surface(X_mesh, T_mesh, U_solution, cmap='viridis',&lt;br /&gt;
                       edgecolor='none', alpha=0.9, antialiased=True)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ax.set_title(r'Evolución Espacio-Temporal de la Ecuación del Calor por Convolución en $\mathbb{R}$')&lt;br /&gt;
ax.set_xlabel('Posición x')&lt;br /&gt;
ax.set_ylabel('Tiempo t')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t)')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fig.colorbar(surf, ax=ax, shrink=0.5, aspect=10, label='Temperatura')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ax.view_init(elev=30, azim=-120)&lt;br /&gt;
&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Velocidad Infinita de Propagación&lt;br /&gt;
&lt;br /&gt;
x_lejos = np.linspace(1.5, 10, 300)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
for t in tiempos:&lt;br /&gt;
    u_t_lejos = resolver_calor_integral(x_lejos, t, condicion_inicial_escalon)&lt;br /&gt;
    plt.plot(x_lejos, u_t_lejos + 1e-300, label=f't = {t}')&lt;br /&gt;
&lt;br /&gt;
plt.yscale('log')&lt;br /&gt;
plt.title('Velocidad Infinita de Propagación')&lt;br /&gt;
plt.xlabel('Posición x')&lt;br /&gt;
plt.ylabel('Temperatura u(x,t) - Escala Logarítmica')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, ls=&amp;quot;--&amp;quot;, alpha=0.5)&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
puntos_obs = [-1.0, -0.1, 0.5, 1.1, 2.0]&lt;br /&gt;
tabla_datos = {'Posición (x)': puntos_obs, 'u(x, t=0)': [0.0, 0.0, 1.0, 0.0, 0.0]}&lt;br /&gt;
&lt;br /&gt;
for t in tiempos:&lt;br /&gt;
    valores = resolver_calor_integral(np.array(puntos_obs), t, condicion_inicial_escalon)&lt;br /&gt;
    tabla_datos[f't={t}'] = valores&lt;br /&gt;
&lt;br /&gt;
df = pd.DataFrame(tabla_datos)&lt;br /&gt;
print(&amp;quot;\n--- Tabla de Propagación ---&amp;quot;)&lt;br /&gt;
print(df.to_string(index=False))&lt;br /&gt;
df.to_csv('tabla_propagacion.csv', index=False)&lt;br /&gt;
&lt;br /&gt;
#Comparación del decaimiento&lt;br /&gt;
&lt;br /&gt;
def max_R_t(t):&lt;br /&gt;
    y = np.linspace(-5, 6, 2000)&lt;br /&gt;
    integrando = nucleo_calor(0.5 - y, t) * condicion_inicial_escalon(y)&lt;br /&gt;
    return np.trapezoid(integrando, y)&lt;br /&gt;
&lt;br /&gt;
def max_acotado_t(t, L=5.0, X_centro=0.5, terms=50):&lt;br /&gt;
    val = 0&lt;br /&gt;
    for n in range(1, terms + 1):&lt;br /&gt;
        bn = (2.0 / (n * np.pi)) * (1 - np.cos(n * np.pi * 1.0 / L))&lt;br /&gt;
        val += bn * np.exp(-((n * np.pi / L)**2) * t) * np.sin(n * np.pi * X_centro / L)&lt;br /&gt;
    return val&lt;br /&gt;
&lt;br /&gt;
def norm_L2_R_t(t):&lt;br /&gt;
    x_vals = np.linspace(-15, 15, 1000)&lt;br /&gt;
    y_vals = np.linspace(-1, 2, 400)&lt;br /&gt;
&lt;br /&gt;
    X, Y = np.meshgrid(x_vals, y_vals)&lt;br /&gt;
    K = nucleo_calor(X - Y, t)&lt;br /&gt;
    u0 = condicion_inicial_escalon(Y)&lt;br /&gt;
&lt;br /&gt;
    u_vals = np.trapezoid(K * u0, x=y_vals, axis=0)&lt;br /&gt;
&lt;br /&gt;
    integral_u2 = np.trapezoid(u_vals**2, x=x_vals)&lt;br /&gt;
    return np.sqrt(integral_u2)&lt;br /&gt;
&lt;br /&gt;
def norm_L2_acotado_t(t, L=5.0, terms=50):&lt;br /&gt;
    norm_cuadrado = 0&lt;br /&gt;
    for n in range(1, terms + 1):&lt;br /&gt;
        bn = (2.0 / (n * np.pi)) * (1 - np.cos(n * np.pi * 1.0 / L))&lt;br /&gt;
        lambda_n = (n * np.pi / L)**2&lt;br /&gt;
        norm_cuadrado += (bn**2) * np.exp(-2 * lambda_n * t)&lt;br /&gt;
    return np.sqrt((L / 2.0) * norm_cuadrado)&lt;br /&gt;
&lt;br /&gt;
tiempos = np.linspace(0.1, 50, 100)&lt;br /&gt;
max_R = [max_R_t(t) for t in tiempos]&lt;br /&gt;
max_acotado = [max_acotado_t(t) for t in tiempos]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(9, 6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(tiempos, max_R, label=r'Dominio $\mathbb{R}$ (Decaimiento $t^{-1/2}$)', color='blue', lw=2)&lt;br /&gt;
plt.plot(tiempos, max_acotado, label=r'Dominio Acotado (Decaimiento $e^{-\lambda_1 t}$)', color='red', lw=2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.yscale('log')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.title('Comparativa de Decaimiento de la Temperatura Máxima')&lt;br /&gt;
plt.xlabel('Tiempo t')&lt;br /&gt;
plt.ylabel('Temperatura Máxima - Escala Logarítmica')&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, ls=&amp;quot;--&amp;quot;, alpha=0.5)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
tiempos = np.linspace(0.1, 50, 100)&lt;br /&gt;
norma_R = [norm_L2_R_t(t) for t in tiempos]&lt;br /&gt;
norma_acotado = [norm_L2_acotado_t(t) for t in tiempos]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(9, 6))&lt;br /&gt;
&lt;br /&gt;
plt.plot(tiempos, norma_R, label=r'Dominio $\mathbb{R}$ (Decaimiento $t^{-1/4}$)', color='blue', lw=2)&lt;br /&gt;
plt.plot(tiempos, norma_acotado, label=r'Dominio Acotado (Decaimiento $e^{-\lambda_1 t}$)', color='red', lw=2)&lt;br /&gt;
&lt;br /&gt;
plt.yscale('log')&lt;br /&gt;
plt.title('Comparativa de Decaimiento en Norma $L^2$')&lt;br /&gt;
plt.xlabel('Tiempo t')&lt;br /&gt;
plt.ylabel('Norma $L^2$ - Escala Logarítmica')&lt;br /&gt;
plt.grid(True, which=&amp;quot;both&amp;quot;, ls=&amp;quot;--&amp;quot;, alpha=0.5)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Visualización del Caso bidimensional&lt;br /&gt;
&lt;br /&gt;
def nucleo_calor_2d(x, y, t):&lt;br /&gt;
    return (1.0 / (4 * np.pi * t)) * np.exp(-(x**2 + y**2) / (4 * t))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def u0_gaussiana_2d(x, y):&lt;br /&gt;
    return np.exp(-(x**2 + y**2))&lt;br /&gt;
&lt;br /&gt;
def u0_escalon_2d(x, y):&lt;br /&gt;
    return np.where((np.abs(x) &amp;lt;= 0.5) &amp;amp; (np.abs(y) &amp;lt;= 0.5), 1.0, 0.0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def resolver_calor_convolucion_2d_trapecio(X, Y, t, u0_func,&lt;br /&gt;
                                           xi_min=-2, xi_max=2,&lt;br /&gt;
                                           eta_min=-2, eta_max=2,&lt;br /&gt;
                                           dxi=0.05, deta=0.05):&lt;br /&gt;
&lt;br /&gt;
    xi = np.arange(xi_min, xi_max, dxi)&lt;br /&gt;
    eta = np.arange(eta_min, eta_max, deta)&lt;br /&gt;
    XI, ETA = np.meshgrid(xi, eta)&lt;br /&gt;
&lt;br /&gt;
    u0_vals = u0_func(XI, ETA)&lt;br /&gt;
&lt;br /&gt;
    Z = np.zeros_like(X)&lt;br /&gt;
&lt;br /&gt;
    for i in range(X.shape[0]):&lt;br /&gt;
        for j in range(X.shape[1]):&lt;br /&gt;
&lt;br /&gt;
            kernel = nucleo_calor_2d(X[i, j] - XI, Y[i, j] - ETA, t)&lt;br /&gt;
            integrando = kernel * u0_vals&lt;br /&gt;
&lt;br /&gt;
            integral_eta = np.trapezoid(integrando, eta, axis=0)&lt;br /&gt;
            integral_total = np.trapezoid(integral_eta, xi)&lt;br /&gt;
&lt;br /&gt;
            Z[i, j] = integral_total&lt;br /&gt;
&lt;br /&gt;
    return Z&lt;br /&gt;
&lt;br /&gt;
x_vals = np.linspace(-1, 1, 100)&lt;br /&gt;
y_vals = np.linspace(-1, 1, 100)&lt;br /&gt;
X, Y = np.meshgrid(x_vals, y_vals)&lt;br /&gt;
&lt;br /&gt;
tiempos = [0.01, 0.1, 1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fig = plt.figure(figsize=(18, 8))&lt;br /&gt;
&lt;br /&gt;
for i, t in enumerate(tiempos):&lt;br /&gt;
&lt;br /&gt;
    L = 5 * np.sqrt(t)&lt;br /&gt;
&lt;br /&gt;
    Z = resolver_calor_convolucion_2d_trapecio(&lt;br /&gt;
        X, Y, t,&lt;br /&gt;
        u0_gaussiana_2d,&lt;br /&gt;
        xi_min=-L, xi_max=L,&lt;br /&gt;
        eta_min=-L, eta_max=L,&lt;br /&gt;
        dxi=0.05, deta=0.05&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    ax = fig.add_subplot(1, 3, i+1, projection='3d')&lt;br /&gt;
&lt;br /&gt;
    surf = ax.plot_surface(X, Y, Z, cmap='inferno', edgecolor='none', alpha=0.9)&lt;br /&gt;
&lt;br /&gt;
    ax.set_title(f'Tiempo t = {t}', fontsize=12)&lt;br /&gt;
    ax.set_xlabel('$x_1$', fontsize=14)&lt;br /&gt;
    ax.set_ylabel('$x_2$', fontsize=14)&lt;br /&gt;
    ax.set_zlabel('$u(x,t)$', fontsize=14)&lt;br /&gt;
&lt;br /&gt;
    ax.tick_params(axis='x', labelsize=12)&lt;br /&gt;
    ax.tick_params(axis='y', labelsize=12)&lt;br /&gt;
    ax.tick_params(axis='z', labelsize=12)&lt;br /&gt;
&lt;br /&gt;
    ax.view_init(elev=25, azim=-45)&lt;br /&gt;
&lt;br /&gt;
plt.suptitle(r'Solución por Convolución de la Ecuación del Calor en $\mathbb{R}^2$', fontsize=20, y=0.98)&lt;br /&gt;
plt.tight_layout(rect=[0, 0.03, 1, 0.95], w_pad=4.0)&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP25/26]]&lt;/div&gt;</summary>
		<author><name>Alejandro.mates</name></author>	</entry>

	</feed>