<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
		<id>https://mat.caminos.upm.es/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Celia+L.Rojo</id>
		<title>MateWiki - Contribuciones del usuario [es]</title>
		<link rel="self" type="application/atom+xml" href="https://mat.caminos.upm.es/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Celia+L.Rojo"/>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/wiki/Especial:Contribuciones/Celia_L.Rojo"/>
		<updated>2026-04-23T08:30:55Z</updated>
		<subtitle>Contribuciones del usuario</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72823</id>
		<title>Ecuación de ondas. Grupo Eau De Parfum(EDP)</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72823"/>
				<updated>2024-05-26T20:26:32Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Solución fundamental del problema en dimensión 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación de Ondas. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
&lt;br /&gt;
=Introducción=&lt;br /&gt;
En este trabajo, representaremos e interpretaremos diferentes soluciones de la ecuación de ondas en una dimensión . Además, interpretaremos el principio de Huygens, estudiando la solución fundamental de la ecuación de ondas en 1, 2 y 3 dimensiones.&lt;br /&gt;
&lt;br /&gt;
=Contexto histórico=&lt;br /&gt;
[[Archivo:alambert_edp.jpg|200px|thumb|right|Jean le Rond D'Alembert]]&lt;br /&gt;
La ecuación de onda es una ecuación diferencial en derivadas parciales lineal de segundo orden, crucial para describir la propagación de diversas ondas, como las ondas sonoras, las ondas de luz y las ondas en el agua. Su relevancia se extiende a múltiples campos, incluyendo la acústica, el electromagnetismo, la mecánica cuántica y la dinámica de fluidos. Históricamente, Jean le Rond d'Alembert fue el primero en estudiar el problema de una cuerda vibrante, como las utilizadas en instrumentos musicales, en 1746.&lt;br /&gt;
&lt;br /&gt;
=Conocimientos previos=&lt;br /&gt;
En esta sección se van a describir algunos conceptos a tener en cuenta durante todo el trabajo.&lt;br /&gt;
&lt;br /&gt;
-Principio de Huygens: Afirma que cada punto en un frente de onda actúa como una fuente de ondas secundarias que se propagan hacia adelante con la misma velocidad que la propia onda. Estas ondas secundarias se combinan para formar un nuevo frente de onda, que es tangente a todas las ondas secundarias. Es decir, cada punto del frente de onda original puede considerarse como un punto de partida para nuevas ondas que se mueven en la misma dirección que la perturbación inicial. Estas ondas secundarias tienen la misma velocidad y frecuencia que la onda original.&lt;br /&gt;
&lt;br /&gt;
Cabe destacar que vamos a utilizar [[Series de Fourier (Grupo Eau De Parfum (EDP))|Series de Furier]]&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas I=&lt;br /&gt;
Estamos considerando una cuerda vibrante que se extiende en el intervalo [0,1], con una densidad &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; y una tensión constante &amp;lt;math&amp;gt;\tau_0&amp;lt;/math&amp;gt;, lo que resulta en una velocidad de propagación &amp;lt;math&amp;gt;c=\frac{\tau_0}{d}=1&amp;lt;/math&amp;gt;. Además suponemos que la cuerda está fija en los extremos y llamamos &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt; a su posición e impulso iniciales respectivamente.&lt;br /&gt;
&lt;br /&gt;
El sistema de ecuaciones que modeliza el comportamiento de los desplazamientos transversales de la cuerda es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = u(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =u_0(x) \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = u_1(x),&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La solución general de la ecuación de ondas empleando separación de variables se puede expresar en términos de la serie de Fourier de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;. La solución tiene la forma&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty} [A_n \cos(n\pi t)+B_n \sin(n \pi t)]sin(n \pi x)  &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde los coeficientes &amp;lt;math&amp;gt;A_n&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;B_n&amp;lt;/math&amp;gt; se determinan a partir de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;.Por lo que la solución completa de a ecuación de ondas para la cuerda vibrante con las condiciones iniciales dadas es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty}[ (2\int_{0}^{1} u_0(x) \sin(n \pi x) dx) \cos(n \pi t) + (\frac{2}{n\pi} \int_{0}^{1} u_0(x) \sin(n \pi x) dx)\sin(n\pi t)] \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Cambiando datos iniciales==&lt;br /&gt;
Para resolver este problema, primero debemos calcular los coeficientes de Fourier &amp;lt;math&amp;gt; A_n &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; B_n &amp;lt;/math&amp;gt; usando los datos iniciales &amp;lt;math&amp;gt; u_0(x)=e^{-100(x-1/2)^2} &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; u_1(x)=0 &amp;lt;/math&amp;gt;. Luego, usaremos estos coeficientes para construir la solución aproximada &amp;lt;math&amp;gt; u(x,t) &amp;lt;/math&amp;gt; tomando los primeros 50 términos de la serie.&lt;br /&gt;
&lt;br /&gt;
Los coeficientes de Fourier son:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_0^1 u_0(x) \sin(n \pi x) \, dx = 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n \pi} \int_0^1 u_1(x) \sin(n \pi x) \, dx = 0 \quad (\text{porque } u_1(x) = 0).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo tanto, la solución se simplifica a:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x,t) = \sum_{n=1}^{50} A_n \cos(n \pi t) \sin(n \pi x)=\sum_{n=1}^{50}[2 \int_0^1 u_0(x) \sin(n \pi x) \, dx cos(n \pi t)] \sin(n \pi x) .&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedemos a representar la solución obteniendo:&lt;br /&gt;
[[Archivo:ejer3a_edp.png|500px|thumb|right|]]&lt;br /&gt;
[[Archivo:ejer3b_edp.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
 &lt;br /&gt;
# Definimos las funciones iniciales u0(x) y u1(x)&lt;br /&gt;
def u0(x):&lt;br /&gt;
    return np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
def u1(x):&lt;br /&gt;
    return np.zeros_like(x)&lt;br /&gt;
 &lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1.0&lt;br /&gt;
c = 1.0  # Velocidad de propagación de las ondas&lt;br /&gt;
N = 100  # Número de puntos para el método del trapecio&lt;br /&gt;
x = np.linspace(0, L, N)&lt;br /&gt;
 &lt;br /&gt;
# Intervalo de tiempo y número de términos de Fourier&lt;br /&gt;
T = 2.0&lt;br /&gt;
n_terms = 50&lt;br /&gt;
 &lt;br /&gt;
# Resolución temporal&lt;br /&gt;
t_steps = 200&lt;br /&gt;
t = np.linspace(0, T, t_steps)&lt;br /&gt;
 &lt;br /&gt;
# Inicialización de u(x,t)&lt;br /&gt;
u_xt = np.zeros((N, t_steps))&lt;br /&gt;
 &lt;br /&gt;
# Calculamos la solución para cada tiempo t&lt;br /&gt;
for j, tj in enumerate(t):&lt;br /&gt;
    u_t = np.zeros_like(x)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        # Calculamos los coeficientes A_n y B_n&lt;br /&gt;
        integrand_f = u0(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        A_n = 2 * np.trapz(integrand_f, x)&lt;br /&gt;
 &lt;br /&gt;
        integrand_g = u1(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        B_n = 2 / (n * np.pi * c) * np.trapz(integrand_g, x)&lt;br /&gt;
 &lt;br /&gt;
        # Suma de términos en la serie de Fourier&lt;br /&gt;
        u_t += (A_n * np.cos(n * np.pi * c * tj) + B_n * np.sin(n * np.pi * c * tj)) * np.sin(n * np.pi * x / L)&lt;br /&gt;
    u_xt[:, j] = u_t&lt;br /&gt;
 &lt;br /&gt;
# Graficamos la solución en diferentes tiempos&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
for j in range(0, t_steps, t_steps // 10):&lt;br /&gt;
    plt.plot(x, u_xt[:, j], label=f't={t[j]:.2f}')&lt;br /&gt;
 &lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('u(x,t)')&lt;br /&gt;
plt.title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
 &lt;br /&gt;
# Comprobamos la periodicidad en el tiempo&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
for i in range(0, N, N // 10):&lt;br /&gt;
    plt.plot(t, u_xt[i, :], label=f'x={x[i]:.2f}')&lt;br /&gt;
 &lt;br /&gt;
plt.xlabel('t')&lt;br /&gt;
plt.ylabel('u(x,t)')&lt;br /&gt;
plt.title('Periodicidad de la solución en el tiempo')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La gráfica muestra la periodicidad en el tiempo de la solución &amp;lt;math&amp;gt;u(x,t) &amp;lt;/math&amp;gt;. La función claramente repite su patrón a medida que &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; varía, lo que confirma que la solución es periódica en el tiempo con un período de 2. Este período corresponde al término más lento &amp;lt;math&amp;gt; n=1 &amp;lt;/math&amp;gt;, ya que &amp;lt;math&amp;gt;\cos(\pi t)&amp;lt;/math&amp;gt; tiene un período de 2.&lt;br /&gt;
&lt;br /&gt;
La periodicidad observada es coherente con la naturaleza periódica de las funciones seno y coseno involucradas en la solución de la ecuación de la cuerda vibrante.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Representándolo en tres dimensiones obtenemos&lt;br /&gt;
[[Archivo:ejer3c_edp.png|350px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation, PillowWriter&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
# Graficamos la solución en 3D&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
 &lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
 &lt;br /&gt;
# Transponemos u_xt para que las dimensiones coincidan con las de X y T&lt;br /&gt;
ax.plot_surface(X, T, u_xt.T, cmap='viridis')&lt;br /&gt;
 &lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('t')&lt;br /&gt;
ax.set_zlabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mostramos a continuación una animación que muestra los desplazamientos trasversales de la cuerda en función del instante de tiempo.&lt;br /&gt;
[[Archivo:Wave_equation.gif|350px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Configuración de la animación&lt;br /&gt;
fig, ax = plt.subplots()&lt;br /&gt;
line, = ax.plot(x, u_xt[:, 0])&lt;br /&gt;
ax.set_xlim(0, L)&lt;br /&gt;
ax.set_ylim(-1.10, 1.10)&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
# Agregar un texto que muestre el instante de tiempo&lt;br /&gt;
time_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)&lt;br /&gt;
 &lt;br /&gt;
def update(frame):&lt;br /&gt;
    line.set_ydata(u_xt[:, frame])&lt;br /&gt;
    time_text.set_text(f't = {t[frame]:.2f}s')&lt;br /&gt;
    return line, time_text&lt;br /&gt;
 &lt;br /&gt;
ani = FuncAnimation(fig, update, frames=t_steps, blit=True)&lt;br /&gt;
 &lt;br /&gt;
# Guardar la animación como GIF&lt;br /&gt;
writer = PillowWriter(fps=20)&lt;br /&gt;
ani.save(&amp;quot;wave_equation.gif&amp;quot;, writer=writer)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Onda en un solo sentido==&lt;br /&gt;
Veamos ahora lo que ocurre cuando estudiamos una onda que viaja en un solo sentido, es decir, &amp;lt;math&amp;gt; u(x, t) = f (x − t)&amp;lt;/math&amp;gt;. Que particularizaremos tomando como datos iniciales &amp;lt;math&amp;gt;u_0(x) = f(x)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u_1(x) = -f'(x)&amp;lt;/math&amp;gt;, con &amp;lt;math&amp;gt;f(x)=e^{-100(x-1/2)^2}&amp;lt;/math&amp;gt;. Por tanto el sistema con el que trabajamos es&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = u(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =e^{-100(x-1/2)^2} \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = 200(x-1/2)e^{-100(x-1/2)^2},&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Su solución viene dada mediante el método de separación de variables en términos de los coeficientes de Fourier:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_0^1 u_0(x) \sin(n \pi x) \, dx = 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n \pi} \int_0^1 u_1(x) \sin(n \pi x) \, dx =\frac{2}{n \pi} \int_0^1 (200(x-1/2)e^{-100(x-1/2)^2})\sin(n \pi x) \, dx&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo que la solución completa de la ecuación de ondas para la cuerda vibrante con las condiciones iniciales dadas es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty}[ ( 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx) \cos(n \pi t) + (\frac{2}{n \pi} \int_0^1 (200(x-1/2)e^{-100(x-1/2)^2})\sin(n \pi x) \, dx)\sin(n\pi t)] \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La representación gráfica de esta solución es:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:wave_equation_dirichlet.gif|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation, PillowWriter&lt;br /&gt;
 &lt;br /&gt;
# Definimos la función f(x)&lt;br /&gt;
def f(x):&lt;br /&gt;
    return np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
# Definimos la derivada de f(x)&lt;br /&gt;
def primef(x):&lt;br /&gt;
    return -200 * (x - 0.5) * np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1.0&lt;br /&gt;
c = 1.0  # Velocidad de propagación de las ondas&lt;br /&gt;
N = 300  # Número de puntos para el método del trapecio&lt;br /&gt;
x = np.linspace(0, L, N)&lt;br /&gt;
 &lt;br /&gt;
# Intervalo de tiempo y número de términos de Fourier&lt;br /&gt;
T = 2.0&lt;br /&gt;
n_terms = 50&lt;br /&gt;
 &lt;br /&gt;
# Resolución temporal&lt;br /&gt;
t_steps = 600&lt;br /&gt;
t = np.linspace(0, T, t_steps)&lt;br /&gt;
 &lt;br /&gt;
# Inicialización de u(x,t)&lt;br /&gt;
u_xt = np.zeros((N, t_steps))&lt;br /&gt;
 &lt;br /&gt;
# Calculamos la solución para cada tiempo t&lt;br /&gt;
for j, tj in enumerate(t):&lt;br /&gt;
    u_t = np.zeros_like(x)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        # Calculamos los coeficientes A_n y B_n&lt;br /&gt;
        integrand_f = f(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        A_n = 2 * np.trapz(integrand_f, x)&lt;br /&gt;
 &lt;br /&gt;
        integrand_g = primef(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        B_n = 2 / (n * np.pi * c) * np.trapz(integrand_g, x)&lt;br /&gt;
 &lt;br /&gt;
        # Suma de términos en la serie de Fourier&lt;br /&gt;
        u_t += (A_n * np.cos(n * np.pi * c * tj) + B_n * np.sin(n * np.pi * c * tj)) * np.sin(n * np.pi * x / L)&lt;br /&gt;
   &lt;br /&gt;
    u_xt[:, j] = u_t&lt;br /&gt;
 &lt;br /&gt;
# Configuración de la animación&lt;br /&gt;
fig, ax = plt.subplots()&lt;br /&gt;
line, = ax.plot(x, u_xt[:, 0])&lt;br /&gt;
ax.set_xlim(0, L)&lt;br /&gt;
ax.set_ylim(-1.10, 1.10)&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
# Agregar un texto que muestre el instante de tiempo&lt;br /&gt;
time_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)&lt;br /&gt;
 &lt;br /&gt;
def update(frame):&lt;br /&gt;
    line.set_ydata(u_xt[:, frame])&lt;br /&gt;
    time_text.set_text(f't = {t[frame]:.2f}s')&lt;br /&gt;
    return line, time_text&lt;br /&gt;
 &lt;br /&gt;
ani = FuncAnimation(fig, update, frames=t_steps, blit=True)&lt;br /&gt;
 &lt;br /&gt;
# Guardar la animación como GIF&lt;br /&gt;
writer = PillowWriter(fps=20)&lt;br /&gt;
ani.save(&amp;quot;wave_equation_dirichlet.gif&amp;quot;, writer=writer)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Como la onda alcanza los extremos del dominio (en x=0 y x=1), la función de onda u(x,t) está fijada en cero en esos puntos. Esto significa que la onda que llega a la frontera se refleja con amplitud y fase opuestas.&lt;br /&gt;
&lt;br /&gt;
==Cambio en condición frontera==&lt;br /&gt;
Para comprender la diferencia entre las condiciones de frontera Dirichlet y Neumann en la ecuación de ondas, repetiremos el análisis del apartado anterior, esta vez aplicando condiciones de Neumann. En lugar de fijar los valores de la función en los extremos (condiciones de Dirichlet), estableceremos que las derivadas parciales respecto a &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; en los extremos sean cero. Es decir, consideramos las condiciones &amp;lt;math&amp;gt; u_x(0,t)=u_x(1,t)=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
Por tanto nuestro nuevo problema es&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u_x(0, t) = u_x(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =e^{-100(x-1/2)^2} \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = 200(x-1/2)e^{-100(x-1/2)^2}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para resolver esta ecuación utilizando el método de Fourier, se expande la función &amp;lt;math&amp;gt; u(x,t) &amp;lt;/math&amp;gt; en una serie de Fourier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x,t) = \sum_{n=1}^{\infty} \left( A_n \cos(n\pi ct) + B_n \sin(n\pi ct) \right) \cos \left( \frac{n\pi x}{L} \right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; es la longitud de la cuerda y los coeficientes &amp;lt;math&amp;gt; A_n &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; B_n &amp;lt;/math&amp;gt; se calculan mediante integrales utilizando las funciones iniciales &amp;lt;math&amp;gt; f(x) &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; f'(x) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Estas funciones se utilizan para calcular los coeficientes \( A_n \) y \( B_n \), y luego se utilizan en la serie de Fourier para obtener la solución \( u(x,t) \).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_{0}^{L} f(x) \cos \left( \frac{n\pi x}{L} \right) \, dx&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n\pi c} \int_{0}^{L} f'(x) \cos \left( \frac{n\pi x}{L} \right) \, dx&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
La gran diferencia con la solución por serie de Fourier del apartado anterior, radica en la resolución del problema de autovalores para la variable x.&lt;br /&gt;
&lt;br /&gt;
Comenzamos buscando soluciones de la forma &amp;lt;math&amp;gt;U(x, t) = w(t) v(x)&amp;lt;/math&amp;gt; con &amp;lt;math&amp;gt;v(0) = v(L) = 0&amp;lt;/math&amp;gt;. Insertando &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; en la ecuación de onda, encontramos:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
0 = U_{tt} - c^2 U_{xx} = w''(t) v(x) - c^2 w(t) v''(x)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
O, separando las variables,&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{1}{c^2} \frac{w''(t)}{w(t)} = \frac{v''(x)}{v(x)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Es una identidad entre dos funciones, una dependiendo solo de &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; y la otra solo de &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;. Por lo tanto, ambos lados de la igualdad deben ser iguales a la misma constante, digamos &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;. Así, llegamos a la ecuación&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
w''(t) - \lambda c^2 w(t) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
y al problema de los autovalores&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v''(x) - \lambda v(x) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v'(0) = v'(L) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para la solución del problema de los autovalores. Hay tres posibilidades.&lt;br /&gt;
&lt;br /&gt;
# Si &amp;lt;math&amp;gt;\lambda = 0&amp;lt;/math&amp;gt;, entonces &amp;lt;math&amp;gt;v(x) = A + Bx&amp;lt;/math&amp;gt; esto implica &amp;lt;math&amp;gt;A = B = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Si &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt;, entonces &amp;lt;math&amp;gt;v(x) = Ae^{-\sqrt\lambda x} + Be^{\sqrt\lambda x}&amp;lt;/math&amp;gt; y nuevamente implica &amp;lt;math&amp;gt;A = B = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Si &amp;lt;math&amp;gt;\lambda &amp;lt; 0&amp;lt;/math&amp;gt;, entonces &amp;lt;math&amp;gt;v(x) = A \sin(\sqrt\lambda x) + B \cos(\sqrt\lambda x)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
De las condiciones obtenemos:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v'(0) = \sqrt\lambda A = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
por tanto &amp;lt;math&amp;gt;A =0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v'(1) = A\sqrt{\lambda}\cos(\sqrt{\lambda}) - B\sqrt{\lambda}\sin(\sqrt{\lambda}) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
de donde&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
B \text{ arbitrario}, A = 0, \lambda = \frac{m^2\pi^2}{L^2}, n = 1, 2, \ldots&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Por lo tanto, en el caso c) solo encontramos soluciones no triviales, de la forma&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v_m(x) = B_n \cos(\lambda_n x), \quad \lambda_n = \frac{m^2\pi^2}{L^2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Particularizando a nuestros datos:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x,t) = \sum_{n=1}^{\infty} \left( A_n \cos(n\pi t) + B_n \sin(n\pi t) \right) \cos(n\pi x) \quad&lt;br /&gt;
&lt;br /&gt;
A_n = 2 \int_{0}^{1} f(x) \cos(n\pi x) \, dx \quad&lt;br /&gt;
&lt;br /&gt;
B_n = \frac{2}{n\pi} \int_{0}^{1} f'(x) \cos(n\pi x) \, dx&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
[[Archivo:gordingordin1.gif|650px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation, PillowWriter&lt;br /&gt;
 &lt;br /&gt;
# Definimos la función f(x)&lt;br /&gt;
def f(x):&lt;br /&gt;
    return np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
# Definimos la derivada de f(x)&lt;br /&gt;
def primef(x):&lt;br /&gt;
    return -200 * (x - 0.5) * np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1.0&lt;br /&gt;
c = 1.0  # Velocidad de propagación de las ondas&lt;br /&gt;
N = 300  # Número de puntos para el método del trapecio&lt;br /&gt;
x = np.linspace(0, L, N)&lt;br /&gt;
 &lt;br /&gt;
# Intervalo de tiempo y número de términos de Fourier&lt;br /&gt;
T = 2.0&lt;br /&gt;
n_terms = 50&lt;br /&gt;
 &lt;br /&gt;
# Resolución temporal&lt;br /&gt;
t_steps = 300&lt;br /&gt;
t = np.linspace(0, T, t_steps)&lt;br /&gt;
 &lt;br /&gt;
# Inicialización de u(x,t)&lt;br /&gt;
u_xt = np.zeros((N, t_steps))&lt;br /&gt;
 &lt;br /&gt;
# Calculamos la solución para cada tiempo t&lt;br /&gt;
for j, tj in enumerate(t):&lt;br /&gt;
    u_t = np.zeros_like(x)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        # Calculamos los coeficientes A_n y B_n&lt;br /&gt;
        integrand_f = f(x) * np.cos(n * np.pi * x / L)&lt;br /&gt;
        A_n = 2 * np.trapz(integrand_f, x)&lt;br /&gt;
 &lt;br /&gt;
        integrand_g = primef(x) * np.cos(n * np.pi * x / L)&lt;br /&gt;
        B_n = 2 / (n * np.pi * c) * np.trapz(integrand_g, x)&lt;br /&gt;
 &lt;br /&gt;
        # Suma de términos en la serie de Fourier&lt;br /&gt;
        u_t += (A_n * np.cos(n * np.pi * c * tj) + B_n * np.sin(n * np.pi * c * tj)) * np.cos(n * np.pi * x / L)&lt;br /&gt;
   &lt;br /&gt;
    u_xt[:, j] = u_t&lt;br /&gt;
 &lt;br /&gt;
# Configuración de la animación&lt;br /&gt;
fig, ax = plt.subplots()&lt;br /&gt;
line, = ax.plot(x, u_xt[:, 0])&lt;br /&gt;
ax.set_xlim(0, L)&lt;br /&gt;
ax.set_ylim(-0.25, 2)&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda con condiciones de Neumann')&lt;br /&gt;
 &lt;br /&gt;
# Agregar un texto que muestre el instante de tiempo&lt;br /&gt;
time_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)&lt;br /&gt;
 &lt;br /&gt;
def update(frame):&lt;br /&gt;
    line.set_ydata(u_xt[:, frame])&lt;br /&gt;
    time_text.set_text(f't = {t[frame]:.2f}s')&lt;br /&gt;
    return line, time_text&lt;br /&gt;
 &lt;br /&gt;
ani = FuncAnimation(fig, update, frames=t_steps, blit=True)&lt;br /&gt;
 &lt;br /&gt;
# Guardar la animación como GIF&lt;br /&gt;
writer = PillowWriter(fps=20)&lt;br /&gt;
ani.save(&amp;quot;wave_equation_neumann.gif&amp;quot;, writer=writer)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas II=&lt;br /&gt;
En esta sección, abordaremos la resolución de la ecuación de ondas en dimensiones 1, 2 y 3, una tarea que nos permitirá explorar la solución fundamental y, a su vez, comprender el principio de Huygens.&lt;br /&gt;
&lt;br /&gt;
==Soluciones fundamentales para diferentes dimensiones==&lt;br /&gt;
Comenzamos estudiando la solución fundamental, que surge como respuesta a un impulso inicial localizado en \( x = 0 \). Formalmente, se define mediante límites y funciones características. El objetivo es observar y graficar las soluciones fundamentales en su forma radial para cada dimensión, lo que nos ayudará a comprender mejor la naturaleza de las ondas en diferentes entornos dimensionales.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 1===&lt;br /&gt;
La solución fundamental en dimensión 1, \( K_1(x, t) \), se define como:&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_1(x, t) = \frac{1}{2c} \left[ H(x + ct) - H(x - ct) \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde \( H(s) \) es la función de Heaviside, dada por:&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H(s) = \begin{cases}&lt;br /&gt;
0, &amp;amp; \text{si } s &amp;lt; 0 \\&lt;br /&gt;
1, &amp;amp; \text{si } s \geq 0&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dicha función, \( K_1(x, t) \), se compone de dos funciones de Heaviside desplazadas horizontalmente a lo largo del eje \( x \) en \( ct \) y \( -ct \) y luego divididas por \( 2c \). Esto significa que en el intervalo \( (-\infty, -ct) \), \( K_1(x, t) \) es 0, luego aumenta a 1 en el intervalo \( (-ct, ct) \), y finalmente vuelve a 0 en el intervalo \( (ct, \infty) \). La constante \( c \) controla la velocidad de propagación de la onda, que hemos exigido \(1\). Graficamos la función para tener una primera idea intuitiva de la solución fundamental:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli1.png|650px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
 def heaviside(x):&lt;br /&gt;
    return np.where(x &amp;gt;= 0, 1, 0)&lt;br /&gt;
 def fundamental_solution_1D(x, t, c):&lt;br /&gt;
    return (1 / (2 * c)) * (heaviside(x + c * t) - heaviside(x - c * t))&lt;br /&gt;
 # Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = [0.5, 1.0, 1.5]  # Valores de tiempo que queremos graficar&lt;br /&gt;
x_range = np.linspace(-5, 5, 100)&lt;br /&gt;
 # Graficamos las soluciones fundamentales en 1D, 2D y 3D para los diferentes valores de tiempo&lt;br /&gt;
fig, axes = plt.subplots(1, len(t_values), figsize=(15, 5))&lt;br /&gt;
 for i, t in enumerate(t_values):&lt;br /&gt;
    # Solución en 1D&lt;br /&gt;
    axes[i].plot(x_range, fundamental_solution_1D(x_range, t, c))&lt;br /&gt;
    axes[i].set_title(f'Solución Fundamental en 1D (t={t})')&lt;br /&gt;
    axes[i].set_xlabel('x')&lt;br /&gt;
    axes[i].set_ylabel('K(x, t)') &lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Visualmente, la gráfica de \( K_1(x, t) \) parece una función escalón, donde hay un cambio abrupto en el valor de la función en \( x = \pm ct \). Esto refleja la propagación de una onda con velocidad \( c \) a lo largo del eje \( x \).  Además, debido a que su valor depende únicamente de la distancia radial desde el origen, es decir, de la magnitud de \( x \), podemos decir que se trata de una función radial y, por tanto, graficarla de esta forma. En la expresión de \( K_1(x, t) \), la variable \( x \) aparece únicamente como \( x \pm ct \), lo que permite su reescritura como \( K_1(r, t) \), donde \( r = |x| \) es la distancia radial.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:fundamental_solution_1D.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation&lt;br /&gt;
def heaviside(x):&lt;br /&gt;
    return np.where(x &amp;gt;= 0, 1, 0)&lt;br /&gt;
def fundamental_solution_1D_radial(r, t, c):&lt;br /&gt;
    return (1 / (2 * c)) * (np.heaviside(r + c * t, 0) - np.heaviside(r - c * t, 0))&lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = np.arange(0, 5, 0.01)  # Valores de tiempo en incrementos de 0.01&lt;br /&gt;
r_values = np.linspace(0, 5, 500)&lt;br /&gt;
# Creamos una función para actualizar el gráfico en cada cuadro de la animación&lt;br /&gt;
def update(frame):&lt;br /&gt;
    plt.cla()  # Limpiamos el gráfico actual&lt;br /&gt;
    plt.plot(r_values, fundamental_solution_1D_radial(r_values, t_values[frame], c),color = 'blue')&lt;br /&gt;
    plt.title(f'Solución Fundamental en 1D - t={t_values[frame]}')&lt;br /&gt;
    plt.xlabel('r')&lt;br /&gt;
    plt.ylabel('K(r, t)')&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
# Creamos la animación&lt;br /&gt;
fig = plt.figure(figsize=(8, 6))&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(t_values), interval=50)&lt;br /&gt;
# Guardamos la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_1D.gif', writer='pillow', fps=30)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Al graficar \( K_1(r, t) \) como función de \( r \) para diferentes valores de \( t \), se observa que la forma de la curva es la misma independientemente de la dirección específica en la que nos movamos desde el origen, lo que confirma su carácter radial.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 2===&lt;br /&gt;
La solución fundamental en dimensión 2, \( K_2(x, t) \), se define como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_2(x, t) = \frac{1}{2\pi c \sqrt{c^2 t^2 - |x|^2}} \chi_{B(0,ct)}(x),&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
donde \(\chi_B(0,ct)(x)\) es la función característica de la bola de centro \(\ 0 \) y radio \(\ c \cdot t \). Esta función describe cómo una perturbación inicial, localizada en el centro de una bola de radio \( ct \), se propaga a lo largo del plano. La función característica \( \chi_{B(0, ct)}(x) \) asegura que la perturbación solo se propague dentro de esta bola. La presencia del término \( \frac{1}{c^2 t^2 - |x|^2} \) indica cómo la amplitud de la onda varía con la distancia desde el centro de la bola y el tiempo. Mostraremos gráficamente esta función para tener una primera idea intuitiva. Se mostrará un video que varía en función del tiempo:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli2.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import imageio&lt;br /&gt;
from io import BytesIO&lt;br /&gt;
def chi_B(r, ct):&lt;br /&gt;
    return np.where(r &amp;lt;= ct, 1, 0)&lt;br /&gt;
def fundamental_solution_2D(x, y, t, c, epsilon=0.01):&lt;br /&gt;
    r = np.sqrt(x ** 2 + y ** 2)&lt;br /&gt;
    discriminant = c ** 2 * t ** 2 - r ** 2&lt;br /&gt;
    solution = 1 / (epsilon + 2 * np.pi * c * np.sqrt(discriminant)) * chi_B(r, c * t)&lt;br /&gt;
    return np.where(discriminant &amp;gt; 0, np.minimum(solution, 1), 0)&lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
epsilon = 0.01&lt;br /&gt;
t_values = np.linspace(0.1, 5, 50)  # Valores de tiempo a animar&lt;br /&gt;
x = np.linspace(-5, 5, 1000)&lt;br /&gt;
y = np.linspace(-5, 5, 1000)&lt;br /&gt;
# Generamos los frames y los guardamos&lt;br /&gt;
frames = []&lt;br /&gt;
for t in t_values:&lt;br /&gt;
    fig, ax = plt.subplots(figsize=(8, 8))&lt;br /&gt;
    X, Y = np.meshgrid(x, y)&lt;br /&gt;
    Z = fundamental_solution_2D(X, Y, t, c, epsilon)&lt;br /&gt;
    ax.contourf(X, Y, Z, cmap='viridis') #Greys?&lt;br /&gt;
    ax.set_title(f'Solución Fundamental en 2D para t={t}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
    ax.grid(True)&lt;br /&gt;
    # Convertir la figura a una imagen numérica&lt;br /&gt;
    buf = BytesIO()&lt;br /&gt;
    fig.savefig(buf, format='png')&lt;br /&gt;
    buf.seek(0)&lt;br /&gt;
    frames.append(imageio.imread(buf))&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
# Guardamos los frames como un gif&lt;br /&gt;
imageio.mimsave('fundamental_solution_cartesiana_2D_2D.gif', frames, fps=10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Podemos notar que la ''circunferencia amarilla'' no es uniforme, sino que muestra irregularidades. Esto se debe a que la solución fundamental presenta discontinuidades cuando \(\left| x \right| \rightarrow t\). Para visualizar esto mejor, en lugar de mostrar solo el contorno de la solución, vamos a representarla en tres dimensiones:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli7.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import imageio&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
def chi_B(r, ct):&lt;br /&gt;
    return np.where(r &amp;lt;= ct, 1, 0) &lt;br /&gt;
def fundamental_solution_2D(x, y, t_values, c, epsilon=0.01):&lt;br /&gt;
    solutions = []&lt;br /&gt;
    for t in t_values:&lt;br /&gt;
        r = np.sqrt(x ** 2 + y ** 2)&lt;br /&gt;
        discriminant = c ** 2 * t ** 2 - r ** 2&lt;br /&gt;
        solution = 1 / (epsilon + 2 * np.pi * c * np.sqrt(discriminant)) * chi_B(r, c * t)&lt;br /&gt;
        solutions.append(np.where(discriminant &amp;gt; 0, np.minimum(solution, 1), 0))&lt;br /&gt;
    return solutions&lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
epsilon = 0.01&lt;br /&gt;
t_values = np.linspace(0.1, 5, 50)  # Valores de tiempo a animar&lt;br /&gt;
x = np.linspace(-5, 5, 1000)&lt;br /&gt;
y = np.linspace(-5, 5, 1000)&lt;br /&gt;
X, Y = np.meshgrid(x, y)&lt;br /&gt;
# Generamos las soluciones para cada valor de tiempo&lt;br /&gt;
solutions = fundamental_solution_2D(X, Y, t_values, c, epsilon)&lt;br /&gt;
# Creamos los frames&lt;br /&gt;
frames = []&lt;br /&gt;
for t, solution in zip(t_values, solutions):&lt;br /&gt;
    fig = plt.figure(figsize=(10, 8))&lt;br /&gt;
    ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
    ax.plot_surface(X, Y, solution, cmap='viridis')&lt;br /&gt;
    ax.set_title(f'Solución Fundamental en 2D para t={t:.2f}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
    ax.set_zlabel('K(x, y, t)')&lt;br /&gt;
    ax.set_zlim(0, 1)&lt;br /&gt;
    plt.tight_layout()&lt;br /&gt;
    fig.canvas.draw()  # Dibujamos la figura para actualizarla&lt;br /&gt;
    frame = np.array(fig.canvas.renderer._renderer)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
    frames.append(frame)&lt;br /&gt;
# Guardamos el GIF&lt;br /&gt;
imageio.mimsave('fundamental_solution_cartesiana_2D_3D.gif', frames, fps=10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es importante señalar que la discontinuidad no aparece de la misma manera en todos los ángulos, lo que podría sugerir que no es radial. Sin embargo, esta aparente discrepancia se debe a que estamos utilizando un mallado rectangular en lugar de uno polar en el código. A pesar de esto, podemos concluir que la función es claramente radial, lo que nos permite representar una sección transversal de la misma. En otras palabras, podemos visualizarla en función de la variable radial:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli3.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation&lt;br /&gt;
 &lt;br /&gt;
def chi_B(r, ct):&lt;br /&gt;
    return np.where(r &amp;lt;= ct, 1, 0)&lt;br /&gt;
 &lt;br /&gt;
def fundamental_solution_2D_radial(r, t, c, epsilon=0.01):&lt;br /&gt;
    discriminant = c ** 2 * t ** 2 - r ** 2&lt;br /&gt;
    solution = 1 / (epsilon + 2 * np.pi * c * np.sqrt(discriminant))* chi_B(r, c * t)&lt;br /&gt;
    return np.where(discriminant &amp;gt; 0, np.minimum(solution, 1), 0)&lt;br /&gt;
 &lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = np.arange(0, 5, 0.01)  # Valores de tiempo en incrementos de 0.01&lt;br /&gt;
r_values = np.linspace(0, 5, 500)&lt;br /&gt;
 &lt;br /&gt;
# Creamos una función para actualizar el gráfico en cada cuadro de la animación&lt;br /&gt;
def update(frame):&lt;br /&gt;
    plt.cla()  # Limpiamos el gráfico actual&lt;br /&gt;
    plt.plot(r_values, fundamental_solution_2D_radial(r_values, t_values[frame], c), color='blue')&lt;br /&gt;
    plt.ylim(0, 1.01)  # Ajustamos el eje y en el rango de 0 a 1&lt;br /&gt;
    plt.title(f'Solución Fundamental en 2D - t={t_values[frame]}')&lt;br /&gt;
    plt.xlabel('r')&lt;br /&gt;
    plt.ylabel('K(r, t)')&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
 &lt;br /&gt;
# Creamos la animación&lt;br /&gt;
fig = plt.figure(figsize=(8, 6))&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(t_values), interval=50)&lt;br /&gt;
 &lt;br /&gt;
# Guardamos la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_2D.gif', writer='pillow', fps=30)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observamos la presencia de una asíntota en \( K_2(x, t) \). Esta asíntota refleja cómo la amplitud de la onda se acerca a cero cuando el denominador se aproxima a cero. Sin embargo, a medida que el tiempo avanza y el radio \( |x| \) aumenta, la amplitud de la onda disminuye. Esta disminución en la amplitud se interpreta como una disminución en la intensidad o &amp;quot;altura&amp;quot; de la onda (del agua, por ejemplo) a medida que se propaga a través del espacio en dos dimensiones.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 3===&lt;br /&gt;
La solución fundamental en dimensión 3, \( K_3(x, t) \), se define como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_3(x, t) = \frac{\delta(|x| - ct)}{4\pi c|x|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde \( \delta(|x| - ct) \) representa la función delta de Dirac. Esta función modela cómo una perturbación inicial, localizada en un radio \( ct \) del origen, se propaga en el espacio tridimensional. La presencia de la función delta de Dirac garantiza que la perturbación solo se propague en un radio \( ct \) del origen. Comenzamos, como en los dos apartados anteriores, graficando la función. En este caso, no se puede representar en un mismo video cómo varía en función de \( x,y,z \) y \(t\) de manera clara. De modo que se ha optado por representar en un primer lugar un video de la relación entre  \( x,y,z \) fijando \( t=1 \):&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli4.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation &lt;br /&gt;
def dirac_approximation(s, k):&lt;br /&gt;
    return np.sqrt(k / (np.pi)) * np.exp(-k * s ** 2) &lt;br /&gt;
def fundamental_solution_3D(x, y, z, t, c, k=1000):&lt;br /&gt;
    r = np.sqrt(x ** 2 + y ** 2 + z ** 2)&lt;br /&gt;
    return dirac_approximation(r - c * t, k) / (4 * np.pi * c * r)&lt;br /&gt;
# Parámetros&lt;br /&gt;
t = 1.0&lt;br /&gt;
c = 1.0&lt;br /&gt;
k = 1000&lt;br /&gt;
x = np.linspace(-5, 5, 500)&lt;br /&gt;
y = np.linspace(-5, 5, 500)&lt;br /&gt;
X, Y = np.meshgrid(x, y)&lt;br /&gt;
# Valores de z&lt;br /&gt;
z_values = np.linspace(-1, 1, 50)&lt;br /&gt;
# Crear figura y ejes&lt;br /&gt;
fig, ax = plt.subplots(figsize=(8, 8)) &lt;br /&gt;
def update(frame):&lt;br /&gt;
    z = z_values[frame]&lt;br /&gt;
    ax.clear()&lt;br /&gt;
    Z = fundamental_solution_3D(X, Y, z, t, c, k)&lt;br /&gt;
    cset = ax.contourf(X, Y, Z, cmap='viridis')&lt;br /&gt;
    ax.set_title(f'z = {z:.2f}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(z_values), interval=100) &lt;br /&gt;
# Guardar la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_3D_corte_z.gif', writer='pillow', fps=10)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observamos que se trata de una sección de esfera hueca,  debido a la presencia de la función delta de Dirac en el numerador. ¿Qué pasa si fijamos \(z\) y variamos \(t\)?&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli5.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation &lt;br /&gt;
def dirac_approximation(s, k):&lt;br /&gt;
    return np.sqrt(k / (np.pi)) * np.exp(-k * s ** 2)&lt;br /&gt;
def fundamental_solution_3D(x, y, z, t, c, k=1000):&lt;br /&gt;
    r = np.sqrt(x ** 2 + y ** 2 + z ** 2)&lt;br /&gt;
    return dirac_approximation(r - c * t, k) / (4 * np.pi * c * r)&lt;br /&gt;
# Parámetros&lt;br /&gt;
z = 0&lt;br /&gt;
c = 1.0&lt;br /&gt;
k = 1000&lt;br /&gt;
x = np.linspace(-5, 5, 500)&lt;br /&gt;
y = np.linspace(-5, 5, 500)&lt;br /&gt;
X, Y = np.meshgrid(x, y) &lt;br /&gt;
# Valores de z&lt;br /&gt;
t_values = np.linspace(0, 5, 50) &lt;br /&gt;
# Crear figura y ejes&lt;br /&gt;
fig, ax = plt.subplots(figsize=(8, 8)) &lt;br /&gt;
def update(frame):&lt;br /&gt;
    t = t_values[frame]&lt;br /&gt;
    ax.clear()&lt;br /&gt;
    Z = fundamental_solution_3D(X, Y, z, t, c, k)&lt;br /&gt;
    cset = ax.contourf(X, Y, Z, cmap='viridis')&lt;br /&gt;
    ax.set_title(f't = {t:.2f}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(z_values), interval=100) &lt;br /&gt;
# Guardar la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_3D_dif_t.gif', writer='pillow', fps=10)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Obtenemos también una circunferencia que se va expandiendo con el tiempo. Uniendo ambas ideas podemos ver que en dimensión 3, la solución fundamental es una esfera hueca que con el tiempo va aumentando de radio y disminuyendo la intensidad del primer impulso.&lt;br /&gt;
&lt;br /&gt;
Claramente es una función que depende únicamente del radio, así pues, de manera análoga, la representamos en su variable radial.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli6.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation&lt;br /&gt;
 &lt;br /&gt;
def dirac_approximation(s, k):&lt;br /&gt;
    return (k / np.pi) ** 0.5 * np.exp(-k * s ** 2)&lt;br /&gt;
 &lt;br /&gt;
def fundamental_solution_3D_radial(r, t, c, k=1000):&lt;br /&gt;
    return dirac_approximation(r - c * t, k) / (4 * np.pi * c * r)&lt;br /&gt;
 &lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = np.arange(0, 5, 0.01)  # Valores de tiempo en incrementos de 0.01&lt;br /&gt;
r_values = np.linspace(0, 5, 500)&lt;br /&gt;
 &lt;br /&gt;
# Creamos una función para actualizar el gráfico en cada cuadro de la animación&lt;br /&gt;
def update(frame):&lt;br /&gt;
    plt.cla()  # Limpiamos el gráfico actual&lt;br /&gt;
    plt.plot(r_values, fundamental_solution_3D_radial(r_values, t_values[frame], c), color= 'blue')&lt;br /&gt;
    plt.ylim(0, 5)  # Ajustamos el eje y en el rango de 0 a 1&lt;br /&gt;
    plt.title(f'Solución Fundamental en 3D - t={t_values[frame]}')&lt;br /&gt;
    plt.xlabel('r')&lt;br /&gt;
    plt.ylabel('K(r, t)')&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
 &lt;br /&gt;
# Creamos la animación&lt;br /&gt;
fig = plt.figure(figsize=(8, 6))&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(t_values), interval=50)&lt;br /&gt;
 &lt;br /&gt;
# Guardamos la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_3D.gif', writer='pillow', fps=30)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este video puede intuir que un impulso solo es percibido por el individuo en el momento en que la esfera ''lo alcanza'', y con una intensidad que va disminuyendo. Esto es fundamental en la comprensión de la propagación de ondas, conocido como el principio de Huygens.&lt;br /&gt;
&lt;br /&gt;
== Solución fundamental del problema en dimensión 2==&lt;br /&gt;
En esta sección nos centraremos en resolver el siguiente problema de la ecuación de ondas en dos dimensiones:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;u_{tt} - c^2 \Delta u  = 0, &amp;amp; \quad x \in \mathbb{R}^2, \quad t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, \quad u_t(x,0) = h(x) = \chi_{B(0,\frac{1}{2})(x)}, &amp;amp; \quad x \in \mathbb{R}^2,&lt;br /&gt;
\end{align}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La solución se obtendrá mediante una convolución entre la solución fundamental, explicada en la sección anterior, y \(u_t(x,0)\). Es decir, la solución se calcula de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
 u(x,t) = \int_{\mathbb{R}^2} K_2(x-y, t) h(y) \, dy.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dado que hemos demostrado previamente que \(K_2(x, t)\) es radial, es evidente que \(K_2(x-y, t)\) también lo es. Además, consideremos \(h(x)=\chi_{B(0,\frac{1}{2})}(x)\), la función característica de una bola centrada en \(0\). Esta función también es radial. Por lo tanto, podemos simplificar nuestros cálculos mediante un cambio a coordenadas polares.&lt;br /&gt;
&lt;br /&gt;
Para resolver la integral de la función \( u(x,t) \) en coordenadas polares, primero necesitamos reformular la integral en estos términos, donde &amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{array}{ll}&lt;br /&gt;
x = (r_x \cos \theta_x, r_x \sin \theta_x) \\&lt;br /&gt;
y = (r_y \cos \theta_y, r_y \sin \theta_y)&lt;br /&gt;
\end{array}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
La integral se transforma usando el jacobiano de la transformación polar \( r \, dr \, d\theta \):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(r_x, \theta_x, t) = \int_0^{2\pi} \int_0^{\infty} K_2(r_x, r_y, \theta_x, \theta_y, t) h(r_y \cos \theta_y, r_y \sin \theta_y) r_y \, dr \, d\theta&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podemos simplificar nuestros cálculos y calcular la integral para una sección transversal, es decir, fijando un ángulo. Esto se debe a que para cualquier ángulo diferente, la representación obtenida seguirá teniendo la misma forma.  Podemos exigir, por ejemplo \( \theta_x = 0\) y representar \(x=(r_x ,0)\). De modo, que mi nueva integral a calcular será la siguiente, tomando la velocidad de propagación \(c=1\):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(r_x, t) = \int_0^{2\pi} \int_0^{\infty} \frac{r_y}{2\pi \sqrt{t^2 - r^2}} \cdot \chi_{B(0,t)}(r) \cdot \chi_{B(0,\frac{1}{2})}(r_y)\, dr_y \, d\theta_y, \, \text{donde} \, r = \sqrt{r_x^2 + r_y^2 - 2r_x r_y \cos(\theta_y)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Podemos simplificar nuevamente la integral, pues observamos que el integrando está ponderado por una función característica dependiente de la variable de integración, la cual está definida en todo \(\mathbb{R}^+\). La ventaja de tener una función con soporte compacto implica que se puede reducir el extremo de integración a un intervalo compacto, en este caso \(r_y = 0\) hasta \(\frac{1}{2}\). Por lo tanto, obtenemos la integral equivalente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(r_x, t) = \int_0^{2\pi} \int_0^{\frac{1}{2}} \frac{r_y}{2\pi \sqrt{t^2 - r_x^2 - r_y^2 + 2r_x r_y \cos(\theta_y)}} \cdot \chi_{B(0,t)} (\sqrt{r_x^2 + r_y^2 - 2r_x r_y \cos(\theta_y)} ) \, dr_y \, d\theta_y&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
A continuación mostramos la solución obtenida para diferentes tiempos \(t\)&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP23/24]]&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72822</id>
		<title>Ecuación de ondas. Grupo Eau De Parfum(EDP)</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72822"/>
				<updated>2024-05-26T20:25:20Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Ecuación de ondas II */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación de Ondas. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
&lt;br /&gt;
=Introducción=&lt;br /&gt;
En este trabajo, representaremos e interpretaremos diferentes soluciones de la ecuación de ondas en una dimensión . Además, interpretaremos el principio de Huygens, estudiando la solución fundamental de la ecuación de ondas en 1, 2 y 3 dimensiones.&lt;br /&gt;
&lt;br /&gt;
=Contexto histórico=&lt;br /&gt;
[[Archivo:alambert_edp.jpg|200px|thumb|right|Jean le Rond D'Alembert]]&lt;br /&gt;
La ecuación de onda es una ecuación diferencial en derivadas parciales lineal de segundo orden, crucial para describir la propagación de diversas ondas, como las ondas sonoras, las ondas de luz y las ondas en el agua. Su relevancia se extiende a múltiples campos, incluyendo la acústica, el electromagnetismo, la mecánica cuántica y la dinámica de fluidos. Históricamente, Jean le Rond d'Alembert fue el primero en estudiar el problema de una cuerda vibrante, como las utilizadas en instrumentos musicales, en 1746.&lt;br /&gt;
&lt;br /&gt;
=Conocimientos previos=&lt;br /&gt;
En esta sección se van a describir algunos conceptos a tener en cuenta durante todo el trabajo.&lt;br /&gt;
&lt;br /&gt;
-Principio de Huygens: Afirma que cada punto en un frente de onda actúa como una fuente de ondas secundarias que se propagan hacia adelante con la misma velocidad que la propia onda. Estas ondas secundarias se combinan para formar un nuevo frente de onda, que es tangente a todas las ondas secundarias. Es decir, cada punto del frente de onda original puede considerarse como un punto de partida para nuevas ondas que se mueven en la misma dirección que la perturbación inicial. Estas ondas secundarias tienen la misma velocidad y frecuencia que la onda original.&lt;br /&gt;
&lt;br /&gt;
Cabe destacar que vamos a utilizar [[Series de Fourier (Grupo Eau De Parfum (EDP))|Series de Furier]]&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas I=&lt;br /&gt;
Estamos considerando una cuerda vibrante que se extiende en el intervalo [0,1], con una densidad &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; y una tensión constante &amp;lt;math&amp;gt;\tau_0&amp;lt;/math&amp;gt;, lo que resulta en una velocidad de propagación &amp;lt;math&amp;gt;c=\frac{\tau_0}{d}=1&amp;lt;/math&amp;gt;. Además suponemos que la cuerda está fija en los extremos y llamamos &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt; a su posición e impulso iniciales respectivamente.&lt;br /&gt;
&lt;br /&gt;
El sistema de ecuaciones que modeliza el comportamiento de los desplazamientos transversales de la cuerda es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = u(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =u_0(x) \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = u_1(x),&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La solución general de la ecuación de ondas empleando separación de variables se puede expresar en términos de la serie de Fourier de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;. La solución tiene la forma&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty} [A_n \cos(n\pi t)+B_n \sin(n \pi t)]sin(n \pi x)  &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde los coeficientes &amp;lt;math&amp;gt;A_n&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;B_n&amp;lt;/math&amp;gt; se determinan a partir de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;.Por lo que la solución completa de a ecuación de ondas para la cuerda vibrante con las condiciones iniciales dadas es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty}[ (2\int_{0}^{1} u_0(x) \sin(n \pi x) dx) \cos(n \pi t) + (\frac{2}{n\pi} \int_{0}^{1} u_0(x) \sin(n \pi x) dx)\sin(n\pi t)] \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Cambiando datos iniciales==&lt;br /&gt;
Para resolver este problema, primero debemos calcular los coeficientes de Fourier &amp;lt;math&amp;gt; A_n &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; B_n &amp;lt;/math&amp;gt; usando los datos iniciales &amp;lt;math&amp;gt; u_0(x)=e^{-100(x-1/2)^2} &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; u_1(x)=0 &amp;lt;/math&amp;gt;. Luego, usaremos estos coeficientes para construir la solución aproximada &amp;lt;math&amp;gt; u(x,t) &amp;lt;/math&amp;gt; tomando los primeros 50 términos de la serie.&lt;br /&gt;
&lt;br /&gt;
Los coeficientes de Fourier son:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_0^1 u_0(x) \sin(n \pi x) \, dx = 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n \pi} \int_0^1 u_1(x) \sin(n \pi x) \, dx = 0 \quad (\text{porque } u_1(x) = 0).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo tanto, la solución se simplifica a:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x,t) = \sum_{n=1}^{50} A_n \cos(n \pi t) \sin(n \pi x)=\sum_{n=1}^{50}[2 \int_0^1 u_0(x) \sin(n \pi x) \, dx cos(n \pi t)] \sin(n \pi x) .&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedemos a representar la solución obteniendo:&lt;br /&gt;
[[Archivo:ejer3a_edp.png|500px|thumb|right|]]&lt;br /&gt;
[[Archivo:ejer3b_edp.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
 &lt;br /&gt;
# Definimos las funciones iniciales u0(x) y u1(x)&lt;br /&gt;
def u0(x):&lt;br /&gt;
    return np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
def u1(x):&lt;br /&gt;
    return np.zeros_like(x)&lt;br /&gt;
 &lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1.0&lt;br /&gt;
c = 1.0  # Velocidad de propagación de las ondas&lt;br /&gt;
N = 100  # Número de puntos para el método del trapecio&lt;br /&gt;
x = np.linspace(0, L, N)&lt;br /&gt;
 &lt;br /&gt;
# Intervalo de tiempo y número de términos de Fourier&lt;br /&gt;
T = 2.0&lt;br /&gt;
n_terms = 50&lt;br /&gt;
 &lt;br /&gt;
# Resolución temporal&lt;br /&gt;
t_steps = 200&lt;br /&gt;
t = np.linspace(0, T, t_steps)&lt;br /&gt;
 &lt;br /&gt;
# Inicialización de u(x,t)&lt;br /&gt;
u_xt = np.zeros((N, t_steps))&lt;br /&gt;
 &lt;br /&gt;
# Calculamos la solución para cada tiempo t&lt;br /&gt;
for j, tj in enumerate(t):&lt;br /&gt;
    u_t = np.zeros_like(x)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        # Calculamos los coeficientes A_n y B_n&lt;br /&gt;
        integrand_f = u0(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        A_n = 2 * np.trapz(integrand_f, x)&lt;br /&gt;
 &lt;br /&gt;
        integrand_g = u1(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        B_n = 2 / (n * np.pi * c) * np.trapz(integrand_g, x)&lt;br /&gt;
 &lt;br /&gt;
        # Suma de términos en la serie de Fourier&lt;br /&gt;
        u_t += (A_n * np.cos(n * np.pi * c * tj) + B_n * np.sin(n * np.pi * c * tj)) * np.sin(n * np.pi * x / L)&lt;br /&gt;
    u_xt[:, j] = u_t&lt;br /&gt;
 &lt;br /&gt;
# Graficamos la solución en diferentes tiempos&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
for j in range(0, t_steps, t_steps // 10):&lt;br /&gt;
    plt.plot(x, u_xt[:, j], label=f't={t[j]:.2f}')&lt;br /&gt;
 &lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('u(x,t)')&lt;br /&gt;
plt.title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
 &lt;br /&gt;
# Comprobamos la periodicidad en el tiempo&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
for i in range(0, N, N // 10):&lt;br /&gt;
    plt.plot(t, u_xt[i, :], label=f'x={x[i]:.2f}')&lt;br /&gt;
 &lt;br /&gt;
plt.xlabel('t')&lt;br /&gt;
plt.ylabel('u(x,t)')&lt;br /&gt;
plt.title('Periodicidad de la solución en el tiempo')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La gráfica muestra la periodicidad en el tiempo de la solución &amp;lt;math&amp;gt;u(x,t) &amp;lt;/math&amp;gt;. La función claramente repite su patrón a medida que &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; varía, lo que confirma que la solución es periódica en el tiempo con un período de 2. Este período corresponde al término más lento &amp;lt;math&amp;gt; n=1 &amp;lt;/math&amp;gt;, ya que &amp;lt;math&amp;gt;\cos(\pi t)&amp;lt;/math&amp;gt; tiene un período de 2.&lt;br /&gt;
&lt;br /&gt;
La periodicidad observada es coherente con la naturaleza periódica de las funciones seno y coseno involucradas en la solución de la ecuación de la cuerda vibrante.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Representándolo en tres dimensiones obtenemos&lt;br /&gt;
[[Archivo:ejer3c_edp.png|350px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation, PillowWriter&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
# Graficamos la solución en 3D&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
 &lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
 &lt;br /&gt;
# Transponemos u_xt para que las dimensiones coincidan con las de X y T&lt;br /&gt;
ax.plot_surface(X, T, u_xt.T, cmap='viridis')&lt;br /&gt;
 &lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('t')&lt;br /&gt;
ax.set_zlabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mostramos a continuación una animación que muestra los desplazamientos trasversales de la cuerda en función del instante de tiempo.&lt;br /&gt;
[[Archivo:Wave_equation.gif|350px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Configuración de la animación&lt;br /&gt;
fig, ax = plt.subplots()&lt;br /&gt;
line, = ax.plot(x, u_xt[:, 0])&lt;br /&gt;
ax.set_xlim(0, L)&lt;br /&gt;
ax.set_ylim(-1.10, 1.10)&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
# Agregar un texto que muestre el instante de tiempo&lt;br /&gt;
time_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)&lt;br /&gt;
 &lt;br /&gt;
def update(frame):&lt;br /&gt;
    line.set_ydata(u_xt[:, frame])&lt;br /&gt;
    time_text.set_text(f't = {t[frame]:.2f}s')&lt;br /&gt;
    return line, time_text&lt;br /&gt;
 &lt;br /&gt;
ani = FuncAnimation(fig, update, frames=t_steps, blit=True)&lt;br /&gt;
 &lt;br /&gt;
# Guardar la animación como GIF&lt;br /&gt;
writer = PillowWriter(fps=20)&lt;br /&gt;
ani.save(&amp;quot;wave_equation.gif&amp;quot;, writer=writer)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Onda en un solo sentido==&lt;br /&gt;
Veamos ahora lo que ocurre cuando estudiamos una onda que viaja en un solo sentido, es decir, &amp;lt;math&amp;gt; u(x, t) = f (x − t)&amp;lt;/math&amp;gt;. Que particularizaremos tomando como datos iniciales &amp;lt;math&amp;gt;u_0(x) = f(x)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u_1(x) = -f'(x)&amp;lt;/math&amp;gt;, con &amp;lt;math&amp;gt;f(x)=e^{-100(x-1/2)^2}&amp;lt;/math&amp;gt;. Por tanto el sistema con el que trabajamos es&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = u(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =e^{-100(x-1/2)^2} \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = 200(x-1/2)e^{-100(x-1/2)^2},&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Su solución viene dada mediante el método de separación de variables en términos de los coeficientes de Fourier:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_0^1 u_0(x) \sin(n \pi x) \, dx = 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n \pi} \int_0^1 u_1(x) \sin(n \pi x) \, dx =\frac{2}{n \pi} \int_0^1 (200(x-1/2)e^{-100(x-1/2)^2})\sin(n \pi x) \, dx&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo que la solución completa de la ecuación de ondas para la cuerda vibrante con las condiciones iniciales dadas es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty}[ ( 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx) \cos(n \pi t) + (\frac{2}{n \pi} \int_0^1 (200(x-1/2)e^{-100(x-1/2)^2})\sin(n \pi x) \, dx)\sin(n\pi t)] \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La representación gráfica de esta solución es:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:wave_equation_dirichlet.gif|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation, PillowWriter&lt;br /&gt;
 &lt;br /&gt;
# Definimos la función f(x)&lt;br /&gt;
def f(x):&lt;br /&gt;
    return np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
# Definimos la derivada de f(x)&lt;br /&gt;
def primef(x):&lt;br /&gt;
    return -200 * (x - 0.5) * np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1.0&lt;br /&gt;
c = 1.0  # Velocidad de propagación de las ondas&lt;br /&gt;
N = 300  # Número de puntos para el método del trapecio&lt;br /&gt;
x = np.linspace(0, L, N)&lt;br /&gt;
 &lt;br /&gt;
# Intervalo de tiempo y número de términos de Fourier&lt;br /&gt;
T = 2.0&lt;br /&gt;
n_terms = 50&lt;br /&gt;
 &lt;br /&gt;
# Resolución temporal&lt;br /&gt;
t_steps = 600&lt;br /&gt;
t = np.linspace(0, T, t_steps)&lt;br /&gt;
 &lt;br /&gt;
# Inicialización de u(x,t)&lt;br /&gt;
u_xt = np.zeros((N, t_steps))&lt;br /&gt;
 &lt;br /&gt;
# Calculamos la solución para cada tiempo t&lt;br /&gt;
for j, tj in enumerate(t):&lt;br /&gt;
    u_t = np.zeros_like(x)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        # Calculamos los coeficientes A_n y B_n&lt;br /&gt;
        integrand_f = f(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        A_n = 2 * np.trapz(integrand_f, x)&lt;br /&gt;
 &lt;br /&gt;
        integrand_g = primef(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        B_n = 2 / (n * np.pi * c) * np.trapz(integrand_g, x)&lt;br /&gt;
 &lt;br /&gt;
        # Suma de términos en la serie de Fourier&lt;br /&gt;
        u_t += (A_n * np.cos(n * np.pi * c * tj) + B_n * np.sin(n * np.pi * c * tj)) * np.sin(n * np.pi * x / L)&lt;br /&gt;
   &lt;br /&gt;
    u_xt[:, j] = u_t&lt;br /&gt;
 &lt;br /&gt;
# Configuración de la animación&lt;br /&gt;
fig, ax = plt.subplots()&lt;br /&gt;
line, = ax.plot(x, u_xt[:, 0])&lt;br /&gt;
ax.set_xlim(0, L)&lt;br /&gt;
ax.set_ylim(-1.10, 1.10)&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
# Agregar un texto que muestre el instante de tiempo&lt;br /&gt;
time_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)&lt;br /&gt;
 &lt;br /&gt;
def update(frame):&lt;br /&gt;
    line.set_ydata(u_xt[:, frame])&lt;br /&gt;
    time_text.set_text(f't = {t[frame]:.2f}s')&lt;br /&gt;
    return line, time_text&lt;br /&gt;
 &lt;br /&gt;
ani = FuncAnimation(fig, update, frames=t_steps, blit=True)&lt;br /&gt;
 &lt;br /&gt;
# Guardar la animación como GIF&lt;br /&gt;
writer = PillowWriter(fps=20)&lt;br /&gt;
ani.save(&amp;quot;wave_equation_dirichlet.gif&amp;quot;, writer=writer)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Como la onda alcanza los extremos del dominio (en x=0 y x=1), la función de onda u(x,t) está fijada en cero en esos puntos. Esto significa que la onda que llega a la frontera se refleja con amplitud y fase opuestas.&lt;br /&gt;
&lt;br /&gt;
==Cambio en condición frontera==&lt;br /&gt;
Para comprender la diferencia entre las condiciones de frontera Dirichlet y Neumann en la ecuación de ondas, repetiremos el análisis del apartado anterior, esta vez aplicando condiciones de Neumann. En lugar de fijar los valores de la función en los extremos (condiciones de Dirichlet), estableceremos que las derivadas parciales respecto a &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; en los extremos sean cero. Es decir, consideramos las condiciones &amp;lt;math&amp;gt; u_x(0,t)=u_x(1,t)=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
Por tanto nuestro nuevo problema es&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u_x(0, t) = u_x(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =e^{-100(x-1/2)^2} \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = 200(x-1/2)e^{-100(x-1/2)^2}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para resolver esta ecuación utilizando el método de Fourier, se expande la función &amp;lt;math&amp;gt; u(x,t) &amp;lt;/math&amp;gt; en una serie de Fourier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x,t) = \sum_{n=1}^{\infty} \left( A_n \cos(n\pi ct) + B_n \sin(n\pi ct) \right) \cos \left( \frac{n\pi x}{L} \right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; es la longitud de la cuerda y los coeficientes &amp;lt;math&amp;gt; A_n &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; B_n &amp;lt;/math&amp;gt; se calculan mediante integrales utilizando las funciones iniciales &amp;lt;math&amp;gt; f(x) &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; f'(x) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Estas funciones se utilizan para calcular los coeficientes \( A_n \) y \( B_n \), y luego se utilizan en la serie de Fourier para obtener la solución \( u(x,t) \).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_{0}^{L} f(x) \cos \left( \frac{n\pi x}{L} \right) \, dx&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n\pi c} \int_{0}^{L} f'(x) \cos \left( \frac{n\pi x}{L} \right) \, dx&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
La gran diferencia con la solución por serie de Fourier del apartado anterior, radica en la resolución del problema de autovalores para la variable x.&lt;br /&gt;
&lt;br /&gt;
Comenzamos buscando soluciones de la forma &amp;lt;math&amp;gt;U(x, t) = w(t) v(x)&amp;lt;/math&amp;gt; con &amp;lt;math&amp;gt;v(0) = v(L) = 0&amp;lt;/math&amp;gt;. Insertando &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; en la ecuación de onda, encontramos:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
0 = U_{tt} - c^2 U_{xx} = w''(t) v(x) - c^2 w(t) v''(x)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
O, separando las variables,&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{1}{c^2} \frac{w''(t)}{w(t)} = \frac{v''(x)}{v(x)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Es una identidad entre dos funciones, una dependiendo solo de &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; y la otra solo de &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;. Por lo tanto, ambos lados de la igualdad deben ser iguales a la misma constante, digamos &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;. Así, llegamos a la ecuación&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
w''(t) - \lambda c^2 w(t) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
y al problema de los autovalores&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v''(x) - \lambda v(x) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v'(0) = v'(L) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para la solución del problema de los autovalores. Hay tres posibilidades.&lt;br /&gt;
&lt;br /&gt;
# Si &amp;lt;math&amp;gt;\lambda = 0&amp;lt;/math&amp;gt;, entonces &amp;lt;math&amp;gt;v(x) = A + Bx&amp;lt;/math&amp;gt; esto implica &amp;lt;math&amp;gt;A = B = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Si &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt;, entonces &amp;lt;math&amp;gt;v(x) = Ae^{-\sqrt\lambda x} + Be^{\sqrt\lambda x}&amp;lt;/math&amp;gt; y nuevamente implica &amp;lt;math&amp;gt;A = B = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Si &amp;lt;math&amp;gt;\lambda &amp;lt; 0&amp;lt;/math&amp;gt;, entonces &amp;lt;math&amp;gt;v(x) = A \sin(\sqrt\lambda x) + B \cos(\sqrt\lambda x)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
De las condiciones obtenemos:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v'(0) = \sqrt\lambda A = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
por tanto &amp;lt;math&amp;gt;A =0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v'(1) = A\sqrt{\lambda}\cos(\sqrt{\lambda}) - B\sqrt{\lambda}\sin(\sqrt{\lambda}) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
de donde&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
B \text{ arbitrario}, A = 0, \lambda = \frac{m^2\pi^2}{L^2}, n = 1, 2, \ldots&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Por lo tanto, en el caso c) solo encontramos soluciones no triviales, de la forma&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v_m(x) = B_n \cos(\lambda_n x), \quad \lambda_n = \frac{m^2\pi^2}{L^2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Particularizando a nuestros datos:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x,t) = \sum_{n=1}^{\infty} \left( A_n \cos(n\pi t) + B_n \sin(n\pi t) \right) \cos(n\pi x) \quad&lt;br /&gt;
&lt;br /&gt;
A_n = 2 \int_{0}^{1} f(x) \cos(n\pi x) \, dx \quad&lt;br /&gt;
&lt;br /&gt;
B_n = \frac{2}{n\pi} \int_{0}^{1} f'(x) \cos(n\pi x) \, dx&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
[[Archivo:gordingordin1.gif|650px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation, PillowWriter&lt;br /&gt;
 &lt;br /&gt;
# Definimos la función f(x)&lt;br /&gt;
def f(x):&lt;br /&gt;
    return np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
# Definimos la derivada de f(x)&lt;br /&gt;
def primef(x):&lt;br /&gt;
    return -200 * (x - 0.5) * np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1.0&lt;br /&gt;
c = 1.0  # Velocidad de propagación de las ondas&lt;br /&gt;
N = 300  # Número de puntos para el método del trapecio&lt;br /&gt;
x = np.linspace(0, L, N)&lt;br /&gt;
 &lt;br /&gt;
# Intervalo de tiempo y número de términos de Fourier&lt;br /&gt;
T = 2.0&lt;br /&gt;
n_terms = 50&lt;br /&gt;
 &lt;br /&gt;
# Resolución temporal&lt;br /&gt;
t_steps = 300&lt;br /&gt;
t = np.linspace(0, T, t_steps)&lt;br /&gt;
 &lt;br /&gt;
# Inicialización de u(x,t)&lt;br /&gt;
u_xt = np.zeros((N, t_steps))&lt;br /&gt;
 &lt;br /&gt;
# Calculamos la solución para cada tiempo t&lt;br /&gt;
for j, tj in enumerate(t):&lt;br /&gt;
    u_t = np.zeros_like(x)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        # Calculamos los coeficientes A_n y B_n&lt;br /&gt;
        integrand_f = f(x) * np.cos(n * np.pi * x / L)&lt;br /&gt;
        A_n = 2 * np.trapz(integrand_f, x)&lt;br /&gt;
 &lt;br /&gt;
        integrand_g = primef(x) * np.cos(n * np.pi * x / L)&lt;br /&gt;
        B_n = 2 / (n * np.pi * c) * np.trapz(integrand_g, x)&lt;br /&gt;
 &lt;br /&gt;
        # Suma de términos en la serie de Fourier&lt;br /&gt;
        u_t += (A_n * np.cos(n * np.pi * c * tj) + B_n * np.sin(n * np.pi * c * tj)) * np.cos(n * np.pi * x / L)&lt;br /&gt;
   &lt;br /&gt;
    u_xt[:, j] = u_t&lt;br /&gt;
 &lt;br /&gt;
# Configuración de la animación&lt;br /&gt;
fig, ax = plt.subplots()&lt;br /&gt;
line, = ax.plot(x, u_xt[:, 0])&lt;br /&gt;
ax.set_xlim(0, L)&lt;br /&gt;
ax.set_ylim(-0.25, 2)&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda con condiciones de Neumann')&lt;br /&gt;
 &lt;br /&gt;
# Agregar un texto que muestre el instante de tiempo&lt;br /&gt;
time_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)&lt;br /&gt;
 &lt;br /&gt;
def update(frame):&lt;br /&gt;
    line.set_ydata(u_xt[:, frame])&lt;br /&gt;
    time_text.set_text(f't = {t[frame]:.2f}s')&lt;br /&gt;
    return line, time_text&lt;br /&gt;
 &lt;br /&gt;
ani = FuncAnimation(fig, update, frames=t_steps, blit=True)&lt;br /&gt;
 &lt;br /&gt;
# Guardar la animación como GIF&lt;br /&gt;
writer = PillowWriter(fps=20)&lt;br /&gt;
ani.save(&amp;quot;wave_equation_neumann.gif&amp;quot;, writer=writer)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas II=&lt;br /&gt;
En esta sección, abordaremos la resolución de la ecuación de ondas en dimensiones 1, 2 y 3, una tarea que nos permitirá explorar la solución fundamental y, a su vez, comprender el principio de Huygens.&lt;br /&gt;
&lt;br /&gt;
==Soluciones fundamentales para diferentes dimensiones==&lt;br /&gt;
Comenzamos estudiando la solución fundamental, que surge como respuesta a un impulso inicial localizado en \( x = 0 \). Formalmente, se define mediante límites y funciones características. El objetivo es observar y graficar las soluciones fundamentales en su forma radial para cada dimensión, lo que nos ayudará a comprender mejor la naturaleza de las ondas en diferentes entornos dimensionales.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 1===&lt;br /&gt;
La solución fundamental en dimensión 1, \( K_1(x, t) \), se define como:&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_1(x, t) = \frac{1}{2c} \left[ H(x + ct) - H(x - ct) \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde \( H(s) \) es la función de Heaviside, dada por:&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H(s) = \begin{cases}&lt;br /&gt;
0, &amp;amp; \text{si } s &amp;lt; 0 \\&lt;br /&gt;
1, &amp;amp; \text{si } s \geq 0&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dicha función, \( K_1(x, t) \), se compone de dos funciones de Heaviside desplazadas horizontalmente a lo largo del eje \( x \) en \( ct \) y \( -ct \) y luego divididas por \( 2c \). Esto significa que en el intervalo \( (-\infty, -ct) \), \( K_1(x, t) \) es 0, luego aumenta a 1 en el intervalo \( (-ct, ct) \), y finalmente vuelve a 0 en el intervalo \( (ct, \infty) \). La constante \( c \) controla la velocidad de propagación de la onda, que hemos exigido \(1\). Graficamos la función para tener una primera idea intuitiva de la solución fundamental:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli1.png|650px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
 def heaviside(x):&lt;br /&gt;
    return np.where(x &amp;gt;= 0, 1, 0)&lt;br /&gt;
 def fundamental_solution_1D(x, t, c):&lt;br /&gt;
    return (1 / (2 * c)) * (heaviside(x + c * t) - heaviside(x - c * t))&lt;br /&gt;
 # Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = [0.5, 1.0, 1.5]  # Valores de tiempo que queremos graficar&lt;br /&gt;
x_range = np.linspace(-5, 5, 100)&lt;br /&gt;
 # Graficamos las soluciones fundamentales en 1D, 2D y 3D para los diferentes valores de tiempo&lt;br /&gt;
fig, axes = plt.subplots(1, len(t_values), figsize=(15, 5))&lt;br /&gt;
 for i, t in enumerate(t_values):&lt;br /&gt;
    # Solución en 1D&lt;br /&gt;
    axes[i].plot(x_range, fundamental_solution_1D(x_range, t, c))&lt;br /&gt;
    axes[i].set_title(f'Solución Fundamental en 1D (t={t})')&lt;br /&gt;
    axes[i].set_xlabel('x')&lt;br /&gt;
    axes[i].set_ylabel('K(x, t)') &lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Visualmente, la gráfica de \( K_1(x, t) \) parece una función escalón, donde hay un cambio abrupto en el valor de la función en \( x = \pm ct \). Esto refleja la propagación de una onda con velocidad \( c \) a lo largo del eje \( x \).  Además, debido a que su valor depende únicamente de la distancia radial desde el origen, es decir, de la magnitud de \( x \), podemos decir que se trata de una función radial y, por tanto, graficarla de esta forma. En la expresión de \( K_1(x, t) \), la variable \( x \) aparece únicamente como \( x \pm ct \), lo que permite su reescritura como \( K_1(r, t) \), donde \( r = |x| \) es la distancia radial.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:fundamental_solution_1D.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation&lt;br /&gt;
def heaviside(x):&lt;br /&gt;
    return np.where(x &amp;gt;= 0, 1, 0)&lt;br /&gt;
def fundamental_solution_1D_radial(r, t, c):&lt;br /&gt;
    return (1 / (2 * c)) * (np.heaviside(r + c * t, 0) - np.heaviside(r - c * t, 0))&lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = np.arange(0, 5, 0.01)  # Valores de tiempo en incrementos de 0.01&lt;br /&gt;
r_values = np.linspace(0, 5, 500)&lt;br /&gt;
# Creamos una función para actualizar el gráfico en cada cuadro de la animación&lt;br /&gt;
def update(frame):&lt;br /&gt;
    plt.cla()  # Limpiamos el gráfico actual&lt;br /&gt;
    plt.plot(r_values, fundamental_solution_1D_radial(r_values, t_values[frame], c),color = 'blue')&lt;br /&gt;
    plt.title(f'Solución Fundamental en 1D - t={t_values[frame]}')&lt;br /&gt;
    plt.xlabel('r')&lt;br /&gt;
    plt.ylabel('K(r, t)')&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
# Creamos la animación&lt;br /&gt;
fig = plt.figure(figsize=(8, 6))&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(t_values), interval=50)&lt;br /&gt;
# Guardamos la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_1D.gif', writer='pillow', fps=30)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Al graficar \( K_1(r, t) \) como función de \( r \) para diferentes valores de \( t \), se observa que la forma de la curva es la misma independientemente de la dirección específica en la que nos movamos desde el origen, lo que confirma su carácter radial.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 2===&lt;br /&gt;
La solución fundamental en dimensión 2, \( K_2(x, t) \), se define como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_2(x, t) = \frac{1}{2\pi c \sqrt{c^2 t^2 - |x|^2}} \chi_{B(0,ct)}(x),&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
donde \(\chi_B(0,ct)(x)\) es la función característica de la bola de centro \(\ 0 \) y radio \(\ c \cdot t \). Esta función describe cómo una perturbación inicial, localizada en el centro de una bola de radio \( ct \), se propaga a lo largo del plano. La función característica \( \chi_{B(0, ct)}(x) \) asegura que la perturbación solo se propague dentro de esta bola. La presencia del término \( \frac{1}{c^2 t^2 - |x|^2} \) indica cómo la amplitud de la onda varía con la distancia desde el centro de la bola y el tiempo. Mostraremos gráficamente esta función para tener una primera idea intuitiva. Se mostrará un video que varía en función del tiempo:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli2.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import imageio&lt;br /&gt;
from io import BytesIO&lt;br /&gt;
def chi_B(r, ct):&lt;br /&gt;
    return np.where(r &amp;lt;= ct, 1, 0)&lt;br /&gt;
def fundamental_solution_2D(x, y, t, c, epsilon=0.01):&lt;br /&gt;
    r = np.sqrt(x ** 2 + y ** 2)&lt;br /&gt;
    discriminant = c ** 2 * t ** 2 - r ** 2&lt;br /&gt;
    solution = 1 / (epsilon + 2 * np.pi * c * np.sqrt(discriminant)) * chi_B(r, c * t)&lt;br /&gt;
    return np.where(discriminant &amp;gt; 0, np.minimum(solution, 1), 0)&lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
epsilon = 0.01&lt;br /&gt;
t_values = np.linspace(0.1, 5, 50)  # Valores de tiempo a animar&lt;br /&gt;
x = np.linspace(-5, 5, 1000)&lt;br /&gt;
y = np.linspace(-5, 5, 1000)&lt;br /&gt;
# Generamos los frames y los guardamos&lt;br /&gt;
frames = []&lt;br /&gt;
for t in t_values:&lt;br /&gt;
    fig, ax = plt.subplots(figsize=(8, 8))&lt;br /&gt;
    X, Y = np.meshgrid(x, y)&lt;br /&gt;
    Z = fundamental_solution_2D(X, Y, t, c, epsilon)&lt;br /&gt;
    ax.contourf(X, Y, Z, cmap='viridis') #Greys?&lt;br /&gt;
    ax.set_title(f'Solución Fundamental en 2D para t={t}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
    ax.grid(True)&lt;br /&gt;
    # Convertir la figura a una imagen numérica&lt;br /&gt;
    buf = BytesIO()&lt;br /&gt;
    fig.savefig(buf, format='png')&lt;br /&gt;
    buf.seek(0)&lt;br /&gt;
    frames.append(imageio.imread(buf))&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
# Guardamos los frames como un gif&lt;br /&gt;
imageio.mimsave('fundamental_solution_cartesiana_2D_2D.gif', frames, fps=10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Podemos notar que la ''circunferencia amarilla'' no es uniforme, sino que muestra irregularidades. Esto se debe a que la solución fundamental presenta discontinuidades cuando \(\left| x \right| \rightarrow t\). Para visualizar esto mejor, en lugar de mostrar solo el contorno de la solución, vamos a representarla en tres dimensiones:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli7.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import imageio&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
def chi_B(r, ct):&lt;br /&gt;
    return np.where(r &amp;lt;= ct, 1, 0) &lt;br /&gt;
def fundamental_solution_2D(x, y, t_values, c, epsilon=0.01):&lt;br /&gt;
    solutions = []&lt;br /&gt;
    for t in t_values:&lt;br /&gt;
        r = np.sqrt(x ** 2 + y ** 2)&lt;br /&gt;
        discriminant = c ** 2 * t ** 2 - r ** 2&lt;br /&gt;
        solution = 1 / (epsilon + 2 * np.pi * c * np.sqrt(discriminant)) * chi_B(r, c * t)&lt;br /&gt;
        solutions.append(np.where(discriminant &amp;gt; 0, np.minimum(solution, 1), 0))&lt;br /&gt;
    return solutions&lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
epsilon = 0.01&lt;br /&gt;
t_values = np.linspace(0.1, 5, 50)  # Valores de tiempo a animar&lt;br /&gt;
x = np.linspace(-5, 5, 1000)&lt;br /&gt;
y = np.linspace(-5, 5, 1000)&lt;br /&gt;
X, Y = np.meshgrid(x, y)&lt;br /&gt;
# Generamos las soluciones para cada valor de tiempo&lt;br /&gt;
solutions = fundamental_solution_2D(X, Y, t_values, c, epsilon)&lt;br /&gt;
# Creamos los frames&lt;br /&gt;
frames = []&lt;br /&gt;
for t, solution in zip(t_values, solutions):&lt;br /&gt;
    fig = plt.figure(figsize=(10, 8))&lt;br /&gt;
    ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
    ax.plot_surface(X, Y, solution, cmap='viridis')&lt;br /&gt;
    ax.set_title(f'Solución Fundamental en 2D para t={t:.2f}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
    ax.set_zlabel('K(x, y, t)')&lt;br /&gt;
    ax.set_zlim(0, 1)&lt;br /&gt;
    plt.tight_layout()&lt;br /&gt;
    fig.canvas.draw()  # Dibujamos la figura para actualizarla&lt;br /&gt;
    frame = np.array(fig.canvas.renderer._renderer)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
    frames.append(frame)&lt;br /&gt;
# Guardamos el GIF&lt;br /&gt;
imageio.mimsave('fundamental_solution_cartesiana_2D_3D.gif', frames, fps=10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es importante señalar que la discontinuidad no aparece de la misma manera en todos los ángulos, lo que podría sugerir que no es radial. Sin embargo, esta aparente discrepancia se debe a que estamos utilizando un mallado rectangular en lugar de uno polar en el código. A pesar de esto, podemos concluir que la función es claramente radial, lo que nos permite representar una sección transversal de la misma. En otras palabras, podemos visualizarla en función de la variable radial:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli3.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation&lt;br /&gt;
 &lt;br /&gt;
def chi_B(r, ct):&lt;br /&gt;
    return np.where(r &amp;lt;= ct, 1, 0)&lt;br /&gt;
 &lt;br /&gt;
def fundamental_solution_2D_radial(r, t, c, epsilon=0.01):&lt;br /&gt;
    discriminant = c ** 2 * t ** 2 - r ** 2&lt;br /&gt;
    solution = 1 / (epsilon + 2 * np.pi * c * np.sqrt(discriminant))* chi_B(r, c * t)&lt;br /&gt;
    return np.where(discriminant &amp;gt; 0, np.minimum(solution, 1), 0)&lt;br /&gt;
 &lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = np.arange(0, 5, 0.01)  # Valores de tiempo en incrementos de 0.01&lt;br /&gt;
r_values = np.linspace(0, 5, 500)&lt;br /&gt;
 &lt;br /&gt;
# Creamos una función para actualizar el gráfico en cada cuadro de la animación&lt;br /&gt;
def update(frame):&lt;br /&gt;
    plt.cla()  # Limpiamos el gráfico actual&lt;br /&gt;
    plt.plot(r_values, fundamental_solution_2D_radial(r_values, t_values[frame], c), color='blue')&lt;br /&gt;
    plt.ylim(0, 1.01)  # Ajustamos el eje y en el rango de 0 a 1&lt;br /&gt;
    plt.title(f'Solución Fundamental en 2D - t={t_values[frame]}')&lt;br /&gt;
    plt.xlabel('r')&lt;br /&gt;
    plt.ylabel('K(r, t)')&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
 &lt;br /&gt;
# Creamos la animación&lt;br /&gt;
fig = plt.figure(figsize=(8, 6))&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(t_values), interval=50)&lt;br /&gt;
 &lt;br /&gt;
# Guardamos la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_2D.gif', writer='pillow', fps=30)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observamos la presencia de una asíntota en \( K_2(x, t) \). Esta asíntota refleja cómo la amplitud de la onda se acerca a cero cuando el denominador se aproxima a cero. Sin embargo, a medida que el tiempo avanza y el radio \( |x| \) aumenta, la amplitud de la onda disminuye. Esta disminución en la amplitud se interpreta como una disminución en la intensidad o &amp;quot;altura&amp;quot; de la onda (del agua, por ejemplo) a medida que se propaga a través del espacio en dos dimensiones.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 3===&lt;br /&gt;
La solución fundamental en dimensión 3, \( K_3(x, t) \), se define como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_3(x, t) = \frac{\delta(|x| - ct)}{4\pi c|x|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde \( \delta(|x| - ct) \) representa la función delta de Dirac. Esta función modela cómo una perturbación inicial, localizada en un radio \( ct \) del origen, se propaga en el espacio tridimensional. La presencia de la función delta de Dirac garantiza que la perturbación solo se propague en un radio \( ct \) del origen. Comenzamos, como en los dos apartados anteriores, graficando la función. En este caso, no se puede representar en un mismo video cómo varía en función de \( x,y,z \) y \(t\) de manera clara. De modo que se ha optado por representar en un primer lugar un video de la relación entre  \( x,y,z \) fijando \( t=1 \):&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli4.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation &lt;br /&gt;
def dirac_approximation(s, k):&lt;br /&gt;
    return np.sqrt(k / (np.pi)) * np.exp(-k * s ** 2) &lt;br /&gt;
def fundamental_solution_3D(x, y, z, t, c, k=1000):&lt;br /&gt;
    r = np.sqrt(x ** 2 + y ** 2 + z ** 2)&lt;br /&gt;
    return dirac_approximation(r - c * t, k) / (4 * np.pi * c * r)&lt;br /&gt;
# Parámetros&lt;br /&gt;
t = 1.0&lt;br /&gt;
c = 1.0&lt;br /&gt;
k = 1000&lt;br /&gt;
x = np.linspace(-5, 5, 500)&lt;br /&gt;
y = np.linspace(-5, 5, 500)&lt;br /&gt;
X, Y = np.meshgrid(x, y)&lt;br /&gt;
# Valores de z&lt;br /&gt;
z_values = np.linspace(-1, 1, 50)&lt;br /&gt;
# Crear figura y ejes&lt;br /&gt;
fig, ax = plt.subplots(figsize=(8, 8)) &lt;br /&gt;
def update(frame):&lt;br /&gt;
    z = z_values[frame]&lt;br /&gt;
    ax.clear()&lt;br /&gt;
    Z = fundamental_solution_3D(X, Y, z, t, c, k)&lt;br /&gt;
    cset = ax.contourf(X, Y, Z, cmap='viridis')&lt;br /&gt;
    ax.set_title(f'z = {z:.2f}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(z_values), interval=100) &lt;br /&gt;
# Guardar la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_3D_corte_z.gif', writer='pillow', fps=10)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observamos que se trata de una sección de esfera hueca,  debido a la presencia de la función delta de Dirac en el numerador. ¿Qué pasa si fijamos \(z\) y variamos \(t\)?&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli5.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation &lt;br /&gt;
def dirac_approximation(s, k):&lt;br /&gt;
    return np.sqrt(k / (np.pi)) * np.exp(-k * s ** 2)&lt;br /&gt;
def fundamental_solution_3D(x, y, z, t, c, k=1000):&lt;br /&gt;
    r = np.sqrt(x ** 2 + y ** 2 + z ** 2)&lt;br /&gt;
    return dirac_approximation(r - c * t, k) / (4 * np.pi * c * r)&lt;br /&gt;
# Parámetros&lt;br /&gt;
z = 0&lt;br /&gt;
c = 1.0&lt;br /&gt;
k = 1000&lt;br /&gt;
x = np.linspace(-5, 5, 500)&lt;br /&gt;
y = np.linspace(-5, 5, 500)&lt;br /&gt;
X, Y = np.meshgrid(x, y) &lt;br /&gt;
# Valores de z&lt;br /&gt;
t_values = np.linspace(0, 5, 50) &lt;br /&gt;
# Crear figura y ejes&lt;br /&gt;
fig, ax = plt.subplots(figsize=(8, 8)) &lt;br /&gt;
def update(frame):&lt;br /&gt;
    t = t_values[frame]&lt;br /&gt;
    ax.clear()&lt;br /&gt;
    Z = fundamental_solution_3D(X, Y, z, t, c, k)&lt;br /&gt;
    cset = ax.contourf(X, Y, Z, cmap='viridis')&lt;br /&gt;
    ax.set_title(f't = {t:.2f}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(z_values), interval=100) &lt;br /&gt;
# Guardar la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_3D_dif_t.gif', writer='pillow', fps=10)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Obtenemos también una circunferencia que se va expandiendo con el tiempo. Uniendo ambas ideas podemos ver que en dimensión 3, la solución fundamental es una esfera hueca que con el tiempo va aumentando de radio y disminuyendo la intensidad del primer impulso.&lt;br /&gt;
&lt;br /&gt;
Claramente es una función que depende únicamente del radio, así pues, de manera análoga, la representamos en su variable radial.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli6.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation&lt;br /&gt;
 &lt;br /&gt;
def dirac_approximation(s, k):&lt;br /&gt;
    return (k / np.pi) ** 0.5 * np.exp(-k * s ** 2)&lt;br /&gt;
 &lt;br /&gt;
def fundamental_solution_3D_radial(r, t, c, k=1000):&lt;br /&gt;
    return dirac_approximation(r - c * t, k) / (4 * np.pi * c * r)&lt;br /&gt;
 &lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = np.arange(0, 5, 0.01)  # Valores de tiempo en incrementos de 0.01&lt;br /&gt;
r_values = np.linspace(0, 5, 500)&lt;br /&gt;
 &lt;br /&gt;
# Creamos una función para actualizar el gráfico en cada cuadro de la animación&lt;br /&gt;
def update(frame):&lt;br /&gt;
    plt.cla()  # Limpiamos el gráfico actual&lt;br /&gt;
    plt.plot(r_values, fundamental_solution_3D_radial(r_values, t_values[frame], c), color= 'blue')&lt;br /&gt;
    plt.ylim(0, 5)  # Ajustamos el eje y en el rango de 0 a 1&lt;br /&gt;
    plt.title(f'Solución Fundamental en 3D - t={t_values[frame]}')&lt;br /&gt;
    plt.xlabel('r')&lt;br /&gt;
    plt.ylabel('K(r, t)')&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
 &lt;br /&gt;
# Creamos la animación&lt;br /&gt;
fig = plt.figure(figsize=(8, 6))&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(t_values), interval=50)&lt;br /&gt;
 &lt;br /&gt;
# Guardamos la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_3D.gif', writer='pillow', fps=30)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este video puede intuir que un impulso solo es percibido por el individuo en el momento en que la esfera ''lo alcanza'', y con una intensidad que va disminuyendo. Esto es fundamental en la comprensión de la propagación de ondas, conocido como el principio de Huygens.&lt;br /&gt;
&lt;br /&gt;
== Solución fundamental del problema en dimensión 2==&lt;br /&gt;
En esta sección nos centraremos en resolver el siguiente problema de la ecuación de ondas en dos dimensiones:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;u_{tt} - c^2 \Delta u  = 0, &amp;amp; \quad x \in \mathbb{R}^2, \quad t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, \quad u_t(x,0) = h(x) = \chi_{B(0,\frac{1}{2})(x)}, &amp;amp; \quad x \in \mathbb{R}^2,&lt;br /&gt;
\end{align}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La solución se obtendrá mediante una convolución entre la solución fundamental, explicada en la sección anterior, y \(u_t(x,0)\). Es decir, la solución se calcula de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
 u(x,t) = \int_{\mathbb{R}^2} K_2(x-y, t) h(y) \, dy.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dado que hemos demostrado previamente que \(K_2(x, t)\) es radial, es evidente que \(K_2(x-y, t)\) también lo es. Además, consideremos \(h(x)=\chi_{B(0,\frac{1}{2})}(x)\), la función característica de una bola centrada en \(0\). Esta función también es radial. Por lo tanto, podemos simplificar nuestros cálculos mediante un cambio a coordenadas polares.&lt;br /&gt;
&lt;br /&gt;
Para resolver la integral de la función \( u(x,t) \) en coordenadas polares, primero necesitamos reformular la integral en estos términos, donde &amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{array}{ll}&lt;br /&gt;
x = (r_x \cos \theta_x, r_x \sin \theta_x) \\&lt;br /&gt;
y = (r_y \cos \theta_y, r_y \sin \theta_y)&lt;br /&gt;
\end{array}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
La integral se transforma usando el jacobiano de la transformación polar \( r \, dr \, d\theta \):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(r_x, \theta_x, t) = \int_0^{2\pi} \int_0^{\infty} K_2(r_x, r_y, \theta_x, \theta_y, t) h(r_y \cos \theta_y, r_y \sin \theta_y) r_y \, dr \, d\theta&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podemos simplificar nuestros cálculos y calcular la integral para una sección transversal, es decir, fijando un ángulo. Esto se debe a que para cualquier ángulo diferente, la representación obtenida seguirá teniendo la misma forma.  Podemos exigir, por ejemplo \( \theta_x = 0\) y representar \(x=(r_x ,0)\). De modo, que mi nueva integral a calcular será la siguiente, tomando la velocidad de propagación \(c=1\):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(r_x, t) = \int_0^{2\pi} \int_0^{\infty} \frac{r_y}{2\pi \sqrt{t^2 - r^2}} \cdot \chi_{B(0,t)}(r) \cdot \chi_{B(0,\frac{1}{2})}(r_y)\, dr_y \, d\theta_y, \, \text{donde} \, r = \sqrt{r_x^2 + r_y^2 - 2r_x r_y \cos(\theta_y)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Podemos simplificar nuevamente la integral, pues observamos que el integrando está ponderado por una función característica dependiente de la variable de integración, la cual está definida en todo \(\mathbb{R}^+\). La ventaja de tener una función con soporte compacto implica que se puede reducir el extremo de integración a un intervalo compacto, en este caso \(r_y = 0\) hasta \(\frac{1}{2}\). Por lo tanto, obtenemos la integral equivalente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(r_x, t) = \int_0^{2\pi} \int_0^{\frac{1}{2}} \frac{r_y}{2\pi \sqrt{t^2 - r_x^2 - r_y^2 + 2r_x r_y \cos(\theta_y)}} \cdot \chi_{B(0,t)} (\sqrt{t^2 - r_x^2 - r_y^2 + 2r_x r_y \cos(\theta_y)} ) \, dr_y \, d\theta_y&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
A continuación mostramos la solución obtenida para diferentes tiempos \(t\)&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP23/24]]&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72811</id>
		<title>Ecuación de ondas. Grupo Eau De Parfum(EDP)</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72811"/>
				<updated>2024-05-26T18:37:02Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Solución fundamental en dimensión 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación de Ondas. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
&lt;br /&gt;
=Introducción=&lt;br /&gt;
En este trabajo, representaremos e interpretaremos diferentes soluciones de la ecuación de ondas en una dimensión . Además, interpretaremos el principio de Huygens, estudiando la solución fundamental de la ecuación de ondas en 1, 2 y 3 dimensiones.&lt;br /&gt;
&lt;br /&gt;
=Contexto histórico=&lt;br /&gt;
[[Archivo:alambert_edp.jpg|200px|thumb|right|Jean le Rond D'Alembert]]&lt;br /&gt;
La ecuación de onda es una ecuación diferencial en derivadas parciales lineal de segundo orden, crucial para describir la propagación de diversas ondas, como las ondas sonoras, las ondas de luz y las ondas en el agua. Su relevancia se extiende a múltiples campos, incluyendo la acústica, el electromagnetismo, la mecánica cuántica y la dinámica de fluidos. Históricamente, Jean le Rond d'Alembert fue el primero en estudiar el problema de una cuerda vibrante, como las utilizadas en instrumentos musicales, en 1746.&lt;br /&gt;
&lt;br /&gt;
=Conocimientos previos=&lt;br /&gt;
En esta sección se van a describir algunos conceptos a tener en cuenta durante todo el trabajo.&lt;br /&gt;
&lt;br /&gt;
-Principio de Huygens: Afirma que cada punto en un frente de onda actúa como una fuente de ondas secundarias que se propagan hacia adelante con la misma velocidad que la propia onda. Estas ondas secundarias se combinan para formar un nuevo frente de onda, que es tangente a todas las ondas secundarias. Es decir, cada punto del frente de onda original puede considerarse como un punto de partida para nuevas ondas que se mueven en la misma dirección que la perturbación inicial. Estas ondas secundarias tienen la misma velocidad y frecuencia que la onda original.&lt;br /&gt;
&lt;br /&gt;
Cabe destacar que vamos a utilizar [[Series de Fourier (Grupo Eau De Parfum (EDP))|Series de Furier]]&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas I=&lt;br /&gt;
Estamos considerando una cuerda vibrante que se extiende en el intervalo [0,1], con una densidad &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; y una tensión constante &amp;lt;math&amp;gt;\tau_0&amp;lt;/math&amp;gt;, lo que resulta en una velocidad de propagación &amp;lt;math&amp;gt;c=\frac{\tau_0}{d}=1&amp;lt;/math&amp;gt;. Además suponemos que la cuerda está fija en los extremos y llamamos &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt; a su posición e impulso iniciales respectivamente.&lt;br /&gt;
&lt;br /&gt;
El sistema de ecuaciones que modeliza el comportamiento de los desplazamientos transversales de la cuerda es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = u(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =u_0(x) \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = u_1(x),&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La solución general de la ecuación de ondas empleando separación de variables se puede expresar en términos de la serie de Fourier de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;. La solución tiene la forma&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty} [A_n \cos(n\pi t)+B_n \sin(n \pi t)]sin(n \pi x)  &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde los coeficientes &amp;lt;math&amp;gt;A_n&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;B_n&amp;lt;/math&amp;gt; se determinan a partir de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;.Por lo que la solución completa de a ecuación de ondas para la cuerda vibrante con las condiciones iniciales dadas es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty}[ (2\int_{0}^{1} u_0(x) \sin(n \pi x) dx) \cos(n \pi t) + (\frac{2}{n\pi} \int_{0}^{1} u_0(x) \sin(n \pi x) dx)\sin(n\pi t)] \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Cambiando datos iniciales==&lt;br /&gt;
Para resolver este problema, primero debemos calcular los coeficientes de Fourier &amp;lt;math&amp;gt; A_n &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; B_n &amp;lt;/math&amp;gt; usando los datos iniciales &amp;lt;math&amp;gt; u_0(x)=e^{-100(x-1/2)^2} &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; u_1(x)=0 &amp;lt;/math&amp;gt;. Luego, usaremos estos coeficientes para construir la solución aproximada &amp;lt;math&amp;gt; u(x,t) &amp;lt;/math&amp;gt; tomando los primeros 50 términos de la serie.&lt;br /&gt;
&lt;br /&gt;
Los coeficientes de Fourier son:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_0^1 u_0(x) \sin(n \pi x) \, dx = 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n \pi} \int_0^1 u_1(x) \sin(n \pi x) \, dx = 0 \quad (\text{porque } u_1(x) = 0).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo tanto, la solución se simplifica a:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x,t) = \sum_{n=1}^{50} A_n \cos(n \pi t) \sin(n \pi x)=\sum_{n=1}^{50}[2 \int_0^1 u_0(x) \sin(n \pi x) \, dx cos(n \pi t)] \sin(n \pi x) .&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedemos a representar la solución obteniendo:&lt;br /&gt;
[[Archivo:ejer3a_edp.png|500px|thumb|right|]]&lt;br /&gt;
[[Archivo:ejer3b_edp.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
 &lt;br /&gt;
# Definimos las funciones iniciales u0(x) y u1(x)&lt;br /&gt;
def u0(x):&lt;br /&gt;
    return np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
def u1(x):&lt;br /&gt;
    return np.zeros_like(x)&lt;br /&gt;
 &lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1.0&lt;br /&gt;
c = 1.0  # Velocidad de propagación de las ondas&lt;br /&gt;
N = 100  # Número de puntos para el método del trapecio&lt;br /&gt;
x = np.linspace(0, L, N)&lt;br /&gt;
 &lt;br /&gt;
# Intervalo de tiempo y número de términos de Fourier&lt;br /&gt;
T = 2.0&lt;br /&gt;
n_terms = 50&lt;br /&gt;
 &lt;br /&gt;
# Resolución temporal&lt;br /&gt;
t_steps = 200&lt;br /&gt;
t = np.linspace(0, T, t_steps)&lt;br /&gt;
 &lt;br /&gt;
# Inicialización de u(x,t)&lt;br /&gt;
u_xt = np.zeros((N, t_steps))&lt;br /&gt;
 &lt;br /&gt;
# Calculamos la solución para cada tiempo t&lt;br /&gt;
for j, tj in enumerate(t):&lt;br /&gt;
    u_t = np.zeros_like(x)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        # Calculamos los coeficientes A_n y B_n&lt;br /&gt;
        integrand_f = u0(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        A_n = 2 * np.trapz(integrand_f, x)&lt;br /&gt;
 &lt;br /&gt;
        integrand_g = u1(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        B_n = 2 / (n * np.pi * c) * np.trapz(integrand_g, x)&lt;br /&gt;
 &lt;br /&gt;
        # Suma de términos en la serie de Fourier&lt;br /&gt;
        u_t += (A_n * np.cos(n * np.pi * c * tj) + B_n * np.sin(n * np.pi * c * tj)) * np.sin(n * np.pi * x / L)&lt;br /&gt;
    u_xt[:, j] = u_t&lt;br /&gt;
 &lt;br /&gt;
# Graficamos la solución en diferentes tiempos&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
for j in range(0, t_steps, t_steps // 10):&lt;br /&gt;
    plt.plot(x, u_xt[:, j], label=f't={t[j]:.2f}')&lt;br /&gt;
 &lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('u(x,t)')&lt;br /&gt;
plt.title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
 &lt;br /&gt;
# Comprobamos la periodicidad en el tiempo&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
for i in range(0, N, N // 10):&lt;br /&gt;
    plt.plot(t, u_xt[i, :], label=f'x={x[i]:.2f}')&lt;br /&gt;
 &lt;br /&gt;
plt.xlabel('t')&lt;br /&gt;
plt.ylabel('u(x,t)')&lt;br /&gt;
plt.title('Periodicidad de la solución en el tiempo')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La gráfica muestra la periodicidad en el tiempo de la solución &amp;lt;math&amp;gt;u(x,t) &amp;lt;/math&amp;gt;. La función claramente repite su patrón a medida que &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; varía, lo que confirma que la solución es periódica en el tiempo con un período de 2. Este período corresponde al término más lento &amp;lt;math&amp;gt; n=1 &amp;lt;/math&amp;gt;, ya que &amp;lt;math&amp;gt;\cos(\pi t)&amp;lt;/math&amp;gt; tiene un período de 2.&lt;br /&gt;
&lt;br /&gt;
La periodicidad observada es coherente con la naturaleza periódica de las funciones seno y coseno involucradas en la solución de la ecuación de la cuerda vibrante.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Representándolo en tres dimensiones obtenemos&lt;br /&gt;
[[Archivo:ejer3c_edp.png|350px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation, PillowWriter&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
# Graficamos la solución en 3D&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
 &lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
 &lt;br /&gt;
# Transponemos u_xt para que las dimensiones coincidan con las de X y T&lt;br /&gt;
ax.plot_surface(X, T, u_xt.T, cmap='viridis')&lt;br /&gt;
 &lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('t')&lt;br /&gt;
ax.set_zlabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mostramos a continuación una animación que muestra los desplazamientos trasversales de la cuerda en función del instante de tiempo.&lt;br /&gt;
[[Archivo:Wave_equation.gif|350px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Configuración de la animación&lt;br /&gt;
fig, ax = plt.subplots()&lt;br /&gt;
line, = ax.plot(x, u_xt[:, 0])&lt;br /&gt;
ax.set_xlim(0, L)&lt;br /&gt;
ax.set_ylim(-1.10, 1.10)&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
# Agregar un texto que muestre el instante de tiempo&lt;br /&gt;
time_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)&lt;br /&gt;
 &lt;br /&gt;
def update(frame):&lt;br /&gt;
    line.set_ydata(u_xt[:, frame])&lt;br /&gt;
    time_text.set_text(f't = {t[frame]:.2f}s')&lt;br /&gt;
    return line, time_text&lt;br /&gt;
 &lt;br /&gt;
ani = FuncAnimation(fig, update, frames=t_steps, blit=True)&lt;br /&gt;
 &lt;br /&gt;
# Guardar la animación como GIF&lt;br /&gt;
writer = PillowWriter(fps=20)&lt;br /&gt;
ani.save(&amp;quot;wave_equation.gif&amp;quot;, writer=writer)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Onda en un solo sentido==&lt;br /&gt;
Veamos ahora lo que ocurre cuando estudiamos una onda que viaja en un solo sentido, es decir, &amp;lt;math&amp;gt; u(x, t) = f (x − t)&amp;lt;/math&amp;gt;. Que particularizaremos tomando como datos iniciales &amp;lt;math&amp;gt;u_0(x) = f(x)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u_1(x) = -f'(x)&amp;lt;/math&amp;gt;, con &amp;lt;math&amp;gt;f(x)=e^{-100(x-1/2)^2}&amp;lt;/math&amp;gt;. Por tanto el sistema con el que trabajamos es&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = u(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =e^{-100(x-1/2)^2} \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = 200(x-1/2)e^{-100(x-1/2)^2},&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Su solución viene dada mediante el método de separación de variables en términos de los coeficientes de Fourier:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_0^1 u_0(x) \sin(n \pi x) \, dx = 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n \pi} \int_0^1 u_1(x) \sin(n \pi x) \, dx =\frac{2}{n \pi} \int_0^1 (200(x-1/2)e^{-100(x-1/2)^2})\sin(n \pi x) \, dx&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo que la solución completa de la ecuación de ondas para la cuerda vibrante con las condiciones iniciales dadas es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty}[ ( 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx) \cos(n \pi t) + (\frac{2}{n \pi} \int_0^1 (200(x-1/2)e^{-100(x-1/2)^2})\sin(n \pi x) \, dx)\sin(n\pi t)] \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La representación gráfica de esta solución es:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:wave_equation_dirichlet.gif|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation, PillowWriter&lt;br /&gt;
 &lt;br /&gt;
# Definimos la función f(x)&lt;br /&gt;
def f(x):&lt;br /&gt;
    return np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
# Definimos la derivada de f(x)&lt;br /&gt;
def primef(x):&lt;br /&gt;
    return -200 * (x - 0.5) * np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1.0&lt;br /&gt;
c = 1.0  # Velocidad de propagación de las ondas&lt;br /&gt;
N = 300  # Número de puntos para el método del trapecio&lt;br /&gt;
x = np.linspace(0, L, N)&lt;br /&gt;
 &lt;br /&gt;
# Intervalo de tiempo y número de términos de Fourier&lt;br /&gt;
T = 2.0&lt;br /&gt;
n_terms = 50&lt;br /&gt;
 &lt;br /&gt;
# Resolución temporal&lt;br /&gt;
t_steps = 600&lt;br /&gt;
t = np.linspace(0, T, t_steps)&lt;br /&gt;
 &lt;br /&gt;
# Inicialización de u(x,t)&lt;br /&gt;
u_xt = np.zeros((N, t_steps))&lt;br /&gt;
 &lt;br /&gt;
# Calculamos la solución para cada tiempo t&lt;br /&gt;
for j, tj in enumerate(t):&lt;br /&gt;
    u_t = np.zeros_like(x)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        # Calculamos los coeficientes A_n y B_n&lt;br /&gt;
        integrand_f = f(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        A_n = 2 * np.trapz(integrand_f, x)&lt;br /&gt;
 &lt;br /&gt;
        integrand_g = primef(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        B_n = 2 / (n * np.pi * c) * np.trapz(integrand_g, x)&lt;br /&gt;
 &lt;br /&gt;
        # Suma de términos en la serie de Fourier&lt;br /&gt;
        u_t += (A_n * np.cos(n * np.pi * c * tj) + B_n * np.sin(n * np.pi * c * tj)) * np.sin(n * np.pi * x / L)&lt;br /&gt;
   &lt;br /&gt;
    u_xt[:, j] = u_t&lt;br /&gt;
 &lt;br /&gt;
# Configuración de la animación&lt;br /&gt;
fig, ax = plt.subplots()&lt;br /&gt;
line, = ax.plot(x, u_xt[:, 0])&lt;br /&gt;
ax.set_xlim(0, L)&lt;br /&gt;
ax.set_ylim(-1.10, 1.10)&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
# Agregar un texto que muestre el instante de tiempo&lt;br /&gt;
time_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)&lt;br /&gt;
 &lt;br /&gt;
def update(frame):&lt;br /&gt;
    line.set_ydata(u_xt[:, frame])&lt;br /&gt;
    time_text.set_text(f't = {t[frame]:.2f}s')&lt;br /&gt;
    return line, time_text&lt;br /&gt;
 &lt;br /&gt;
ani = FuncAnimation(fig, update, frames=t_steps, blit=True)&lt;br /&gt;
 &lt;br /&gt;
# Guardar la animación como GIF&lt;br /&gt;
writer = PillowWriter(fps=20)&lt;br /&gt;
ani.save(&amp;quot;wave_equation_dirichlet.gif&amp;quot;, writer=writer)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Como la onda alcanza los extremos del dominio (en x=0 y x=1), la función de onda u(x,t) está fijada en cero en esos puntos. Esto significa que la onda que llega a la frontera se refleja con amplitud y fase opuestas.&lt;br /&gt;
&lt;br /&gt;
==Cambio en condición frontera==&lt;br /&gt;
Para comprender la diferencia entre las condiciones de frontera Dirichlet y Neumann en la ecuación de ondas, repetiremos el análisis del apartado anterior, esta vez aplicando condiciones de Neumann. En lugar de fijar los valores de la función en los extremos (condiciones de Dirichlet), estableceremos que las derivadas parciales respecto a &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; en los extremos sean cero. Es decir, consideramos las condiciones &amp;lt;math&amp;gt; u_x(0,t)=u_x(1,t)=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
Por tanto nuestro nuevo problema es&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u_x(0, t) = u_x(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =e^{-100(x-1/2)^2} \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = 200(x-1/2)e^{-100(x-1/2)^2}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para resolver esta ecuación utilizando el método de Fourier, se expande la función &amp;lt;math&amp;gt; u(x,t) &amp;lt;/math&amp;gt; en una serie de Fourier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x,t) = \sum_{n=1}^{\infty} \left( A_n \cos(n\pi ct) + B_n \sin(n\pi ct) \right) \cos \left( \frac{n\pi x}{L} \right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; es la longitud de la cuerda y los coeficientes &amp;lt;math&amp;gt; A_n &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; B_n &amp;lt;/math&amp;gt; se calculan mediante integrales utilizando las funciones iniciales &amp;lt;math&amp;gt; f(x) &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; f'(x) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Estas funciones se utilizan para calcular los coeficientes \( A_n \) y \( B_n \), y luego se utilizan en la serie de Fourier para obtener la solución \( u(x,t) \).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_{0}^{L} f(x) \cos \left( \frac{n\pi x}{L} \right) \, dx&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n\pi c} \int_{0}^{L} f'(x) \cos \left( \frac{n\pi x}{L} \right) \, dx&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
La gran diferencia con la solución por serie de Fourier del apartado anterior, radica en la resolución del problema de autovalores para la variable x.&lt;br /&gt;
&lt;br /&gt;
Comenzamos buscando soluciones de la forma &amp;lt;math&amp;gt;U(x, t) = w(t) v(x)&amp;lt;/math&amp;gt; con &amp;lt;math&amp;gt;v(0) = v(L) = 0&amp;lt;/math&amp;gt;. Insertando &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; en la ecuación de onda, encontramos:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
0 = U_{tt} - c^2 U_{xx} = w''(t) v(x) - c^2 w(t) v''(x)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
O, separando las variables,&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{1}{c^2} \frac{w''(t)}{w(t)} = \frac{v''(x)}{v(x)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Es una identidad entre dos funciones, una dependiendo solo de &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; y la otra solo de &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;. Por lo tanto, ambos lados de la igualdad deben ser iguales a la misma constante, digamos &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;. Así, llegamos a la ecuación&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
w''(t) - \lambda c^2 w(t) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
y al problema de los autovalores&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v''(x) - \lambda v(x) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v'(0) = v'(L) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para la solución del problema de los autovalores. Hay tres posibilidades.&lt;br /&gt;
&lt;br /&gt;
# Si &amp;lt;math&amp;gt;\lambda = 0&amp;lt;/math&amp;gt;, entonces &amp;lt;math&amp;gt;v(x) = A + Bx&amp;lt;/math&amp;gt; esto implica &amp;lt;math&amp;gt;A = B = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Si &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt;, entonces &amp;lt;math&amp;gt;v(x) = Ae^{-\sqrt\lambda x} + Be^{\sqrt\lambda x}&amp;lt;/math&amp;gt; y nuevamente implica &amp;lt;math&amp;gt;A = B = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Si &amp;lt;math&amp;gt;\lambda &amp;lt; 0&amp;lt;/math&amp;gt;, entonces &amp;lt;math&amp;gt;v(x) = A \sin(\sqrt\lambda x) + B \cos(\sqrt\lambda x)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
De las condiciones obtenemos:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v'(0) = \sqrt\lambda A = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
por tanto &amp;lt;math&amp;gt;A =0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v'(1) = A\sqrt{\lambda}\cos(\sqrt{\lambda}) - B\sqrt{\lambda}\sin(\sqrt{\lambda}) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
de donde&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
B \text{ arbitrario}, A = 0, \lambda = \frac{m^2\pi^2}{L^2}, n = 1, 2, \ldots&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Por lo tanto, en el caso c) solo encontramos soluciones no triviales, de la forma&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v_m(x) = B_n \cos(\lambda_n x), \quad \lambda_n = \frac{m^2\pi^2}{L^2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Particularizando a nuestros datos:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x,t) = \sum_{n=1}^{\infty} \left( A_n \cos(n\pi t) + B_n \sin(n\pi t) \right) \cos(n\pi x) \quad&lt;br /&gt;
&lt;br /&gt;
A_n = 2 \int_{0}^{1} f(x) \cos(n\pi x) \, dx \quad&lt;br /&gt;
&lt;br /&gt;
B_n = \frac{2}{n\pi} \int_{0}^{1} f'(x) \cos(n\pi x) \, dx&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
[[Archivo:gordingordin1.gif|650px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation, PillowWriter&lt;br /&gt;
 &lt;br /&gt;
# Definimos la función f(x)&lt;br /&gt;
def f(x):&lt;br /&gt;
    return np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
# Definimos la derivada de f(x)&lt;br /&gt;
def primef(x):&lt;br /&gt;
    return -200 * (x - 0.5) * np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1.0&lt;br /&gt;
c = 1.0  # Velocidad de propagación de las ondas&lt;br /&gt;
N = 300  # Número de puntos para el método del trapecio&lt;br /&gt;
x = np.linspace(0, L, N)&lt;br /&gt;
 &lt;br /&gt;
# Intervalo de tiempo y número de términos de Fourier&lt;br /&gt;
T = 2.0&lt;br /&gt;
n_terms = 50&lt;br /&gt;
 &lt;br /&gt;
# Resolución temporal&lt;br /&gt;
t_steps = 300&lt;br /&gt;
t = np.linspace(0, T, t_steps)&lt;br /&gt;
 &lt;br /&gt;
# Inicialización de u(x,t)&lt;br /&gt;
u_xt = np.zeros((N, t_steps))&lt;br /&gt;
 &lt;br /&gt;
# Calculamos la solución para cada tiempo t&lt;br /&gt;
for j, tj in enumerate(t):&lt;br /&gt;
    u_t = np.zeros_like(x)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        # Calculamos los coeficientes A_n y B_n&lt;br /&gt;
        integrand_f = f(x) * np.cos(n * np.pi * x / L)&lt;br /&gt;
        A_n = 2 * np.trapz(integrand_f, x)&lt;br /&gt;
 &lt;br /&gt;
        integrand_g = primef(x) * np.cos(n * np.pi * x / L)&lt;br /&gt;
        B_n = 2 / (n * np.pi * c) * np.trapz(integrand_g, x)&lt;br /&gt;
 &lt;br /&gt;
        # Suma de términos en la serie de Fourier&lt;br /&gt;
        u_t += (A_n * np.cos(n * np.pi * c * tj) + B_n * np.sin(n * np.pi * c * tj)) * np.cos(n * np.pi * x / L)&lt;br /&gt;
   &lt;br /&gt;
    u_xt[:, j] = u_t&lt;br /&gt;
 &lt;br /&gt;
# Configuración de la animación&lt;br /&gt;
fig, ax = plt.subplots()&lt;br /&gt;
line, = ax.plot(x, u_xt[:, 0])&lt;br /&gt;
ax.set_xlim(0, L)&lt;br /&gt;
ax.set_ylim(-0.25, 2)&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda con condiciones de Neumann')&lt;br /&gt;
 &lt;br /&gt;
# Agregar un texto que muestre el instante de tiempo&lt;br /&gt;
time_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)&lt;br /&gt;
 &lt;br /&gt;
def update(frame):&lt;br /&gt;
    line.set_ydata(u_xt[:, frame])&lt;br /&gt;
    time_text.set_text(f't = {t[frame]:.2f}s')&lt;br /&gt;
    return line, time_text&lt;br /&gt;
 &lt;br /&gt;
ani = FuncAnimation(fig, update, frames=t_steps, blit=True)&lt;br /&gt;
 &lt;br /&gt;
# Guardar la animación como GIF&lt;br /&gt;
writer = PillowWriter(fps=20)&lt;br /&gt;
ani.save(&amp;quot;wave_equation_neumann.gif&amp;quot;, writer=writer)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas II=&lt;br /&gt;
En esta sección, abordaremos la resolución de la ecuación de ondas en dimensiones 1, 2 y 3, una tarea que nos permitirá explorar la solución fundamental y, a su vez, comprender el principio de Huygens.&lt;br /&gt;
&lt;br /&gt;
==Soluciones fundamentales para diferentes dimensiones==&lt;br /&gt;
Comenzamos estudiando la solución fundamental, que surge como respuesta a un impulso inicial localizado en \( x = 0 \). Formalmente, se define mediante límites y funciones características. El objetivo es observar y graficar las soluciones fundamentales en su forma radial para cada dimensión, lo que nos ayudará a comprender mejor la naturaleza de las ondas en diferentes entornos dimensionales.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 1===&lt;br /&gt;
La solución fundamental en dimensión 1, \( K_1(x, t) \), se define como:&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_1(x, t) = \frac{1}{2c} \left[ H(x + ct) - H(x - ct) \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde \( H(s) \) es la función de Heaviside, dada por:&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H(s) = \begin{cases}&lt;br /&gt;
0, &amp;amp; \text{si } s &amp;lt; 0 \\&lt;br /&gt;
1, &amp;amp; \text{si } s \geq 0&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dicha función, \( K_1(x, t) \), se compone de dos funciones de Heaviside desplazadas horizontalmente a lo largo del eje \( x \) en \( ct \) y \( -ct \) y luego divididas por \( 2c \). Esto significa que en el intervalo \( (-\infty, -ct) \), \( K_1(x, t) \) es 0, luego aumenta a 1 en el intervalo \( (-ct, ct) \), y finalmente vuelve a 0 en el intervalo \( (ct, \infty) \). La constante \( c \) controla la velocidad de propagación de la onda, que hemos exigido \(1\). Graficamos la función para tener una primera idea intuitiva de la solución fundamental:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli1.png|650px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
 def heaviside(x):&lt;br /&gt;
    return np.where(x &amp;gt;= 0, 1, 0)&lt;br /&gt;
 def fundamental_solution_1D(x, t, c):&lt;br /&gt;
    return (1 / (2 * c)) * (heaviside(x + c * t) - heaviside(x - c * t))&lt;br /&gt;
 # Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = [0.5, 1.0, 1.5]  # Valores de tiempo que queremos graficar&lt;br /&gt;
x_range = np.linspace(-5, 5, 100)&lt;br /&gt;
 # Graficamos las soluciones fundamentales en 1D, 2D y 3D para los diferentes valores de tiempo&lt;br /&gt;
fig, axes = plt.subplots(1, len(t_values), figsize=(15, 5))&lt;br /&gt;
 for i, t in enumerate(t_values):&lt;br /&gt;
    # Solución en 1D&lt;br /&gt;
    axes[i].plot(x_range, fundamental_solution_1D(x_range, t, c))&lt;br /&gt;
    axes[i].set_title(f'Solución Fundamental en 1D (t={t})')&lt;br /&gt;
    axes[i].set_xlabel('x')&lt;br /&gt;
    axes[i].set_ylabel('K(x, t)') &lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Visualmente, la gráfica de \( K_1(x, t) \) parece una función escalón, donde hay un cambio abrupto en el valor de la función en \( x = \pm ct \). Esto refleja la propagación de una onda con velocidad \( c \) a lo largo del eje \( x \).  Además, debido a que su valor depende únicamente de la distancia radial desde el origen, es decir, de la magnitud de \( x \), podemos decir que se trata de una función radial y, por tanto, graficarla de esta forma. En la expresión de \( K_1(x, t) \), la variable \( x \) aparece únicamente como \( x \pm ct \), lo que permite su reescritura como \( K_1(r, t) \), donde \( r = |x| \) es la distancia radial.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:fundamental_solution_1D.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation&lt;br /&gt;
def heaviside(x):&lt;br /&gt;
    return np.where(x &amp;gt;= 0, 1, 0)&lt;br /&gt;
def fundamental_solution_1D_radial(r, t, c):&lt;br /&gt;
    return (1 / (2 * c)) * (np.heaviside(r + c * t, 0) - np.heaviside(r - c * t, 0))&lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = np.arange(0, 5, 0.01)  # Valores de tiempo en incrementos de 0.01&lt;br /&gt;
r_values = np.linspace(0, 5, 500)&lt;br /&gt;
# Creamos una función para actualizar el gráfico en cada cuadro de la animación&lt;br /&gt;
def update(frame):&lt;br /&gt;
    plt.cla()  # Limpiamos el gráfico actual&lt;br /&gt;
    plt.plot(r_values, fundamental_solution_1D_radial(r_values, t_values[frame], c),color = 'blue')&lt;br /&gt;
    plt.title(f'Solución Fundamental en 1D - t={t_values[frame]}')&lt;br /&gt;
    plt.xlabel('r')&lt;br /&gt;
    plt.ylabel('K(r, t)')&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
# Creamos la animación&lt;br /&gt;
fig = plt.figure(figsize=(8, 6))&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(t_values), interval=50)&lt;br /&gt;
# Guardamos la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_1D.gif', writer='pillow', fps=30)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Al graficar \( K_1(r, t) \) como función de \( r \) para diferentes valores de \( t \), se observa que la forma de la curva es la misma independientemente de la dirección específica en la que nos movamos desde el origen, lo que confirma su carácter radial.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 2===&lt;br /&gt;
La solución fundamental en dimensión 2, \( K_2(x, t) \), se define como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_2(x, t) = \frac{1}{2\pi c \sqrt{c^2 t^2 - |x|^2}} \chi_{B(0,ct)}(x),&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
donde \(\chi_B(0,ct)(x)\) es la función característica de la bola de centro \(\ 0 \) y radio \(\ c \cdot t \). Esta función describe cómo una perturbación inicial, localizada en el centro de una bola de radio \( ct \), se propaga a lo largo del plano. La función característica \( \chi_{B(0, ct)}(x) \) asegura que la perturbación solo se propague dentro de esta bola. La presencia del término \( \frac{1}{c^2 t^2 - |x|^2} \) indica cómo la amplitud de la onda varía con la distancia desde el centro de la bola y el tiempo. Mostraremos gráficamente esta función para tener una primera idea intuitiva. Se mostrará un video que varía en función del tiempo:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli2.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import imageio&lt;br /&gt;
from io import BytesIO&lt;br /&gt;
def chi_B(r, ct):&lt;br /&gt;
    return np.where(r &amp;lt;= ct, 1, 0)&lt;br /&gt;
def fundamental_solution_2D(x, y, t, c, epsilon=0.01):&lt;br /&gt;
    r = np.sqrt(x ** 2 + y ** 2)&lt;br /&gt;
    discriminant = c ** 2 * t ** 2 - r ** 2&lt;br /&gt;
    solution = 1 / (epsilon + 2 * np.pi * c * np.sqrt(discriminant)) * chi_B(r, c * t)&lt;br /&gt;
    return np.where(discriminant &amp;gt; 0, np.minimum(solution, 1), 0)&lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
epsilon = 0.01&lt;br /&gt;
t_values = np.linspace(0.1, 5, 50)  # Valores de tiempo a animar&lt;br /&gt;
x = np.linspace(-5, 5, 1000)&lt;br /&gt;
y = np.linspace(-5, 5, 1000)&lt;br /&gt;
# Generamos los frames y los guardamos&lt;br /&gt;
frames = []&lt;br /&gt;
for t in t_values:&lt;br /&gt;
    fig, ax = plt.subplots(figsize=(8, 8))&lt;br /&gt;
    X, Y = np.meshgrid(x, y)&lt;br /&gt;
    Z = fundamental_solution_2D(X, Y, t, c, epsilon)&lt;br /&gt;
    ax.contourf(X, Y, Z, cmap='viridis') #Greys?&lt;br /&gt;
    ax.set_title(f'Solución Fundamental en 2D para t={t}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
    ax.grid(True)&lt;br /&gt;
    # Convertir la figura a una imagen numérica&lt;br /&gt;
    buf = BytesIO()&lt;br /&gt;
    fig.savefig(buf, format='png')&lt;br /&gt;
    buf.seek(0)&lt;br /&gt;
    frames.append(imageio.imread(buf))&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
# Guardamos los frames como un gif&lt;br /&gt;
imageio.mimsave('fundamental_solution_cartesiana_2D_2D.gif', frames, fps=10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Podemos notar que la ''circunferencia amarilla'' no es uniforme, sino que muestra irregularidades. Esto se debe a que la solución fundamental presenta discontinuidades cuando \(\left| x \right| \rightarrow t\). Para visualizar esto mejor, en lugar de mostrar solo el contorno de la solución, vamos a representarla en tres dimensiones:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli7.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import imageio&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
def chi_B(r, ct):&lt;br /&gt;
    return np.where(r &amp;lt;= ct, 1, 0) &lt;br /&gt;
def fundamental_solution_2D(x, y, t_values, c, epsilon=0.01):&lt;br /&gt;
    solutions = []&lt;br /&gt;
    for t in t_values:&lt;br /&gt;
        r = np.sqrt(x ** 2 + y ** 2)&lt;br /&gt;
        discriminant = c ** 2 * t ** 2 - r ** 2&lt;br /&gt;
        solution = 1 / (epsilon + 2 * np.pi * c * np.sqrt(discriminant)) * chi_B(r, c * t)&lt;br /&gt;
        solutions.append(np.where(discriminant &amp;gt; 0, np.minimum(solution, 1), 0))&lt;br /&gt;
    return solutions&lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
epsilon = 0.01&lt;br /&gt;
t_values = np.linspace(0.1, 5, 50)  # Valores de tiempo a animar&lt;br /&gt;
x = np.linspace(-5, 5, 1000)&lt;br /&gt;
y = np.linspace(-5, 5, 1000)&lt;br /&gt;
X, Y = np.meshgrid(x, y)&lt;br /&gt;
# Generamos las soluciones para cada valor de tiempo&lt;br /&gt;
solutions = fundamental_solution_2D(X, Y, t_values, c, epsilon)&lt;br /&gt;
# Creamos los frames&lt;br /&gt;
frames = []&lt;br /&gt;
for t, solution in zip(t_values, solutions):&lt;br /&gt;
    fig = plt.figure(figsize=(10, 8))&lt;br /&gt;
    ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
    ax.plot_surface(X, Y, solution, cmap='viridis')&lt;br /&gt;
    ax.set_title(f'Solución Fundamental en 2D para t={t:.2f}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
    ax.set_zlabel('K(x, y, t)')&lt;br /&gt;
    ax.set_zlim(0, 1)&lt;br /&gt;
    plt.tight_layout()&lt;br /&gt;
    fig.canvas.draw()  # Dibujamos la figura para actualizarla&lt;br /&gt;
    frame = np.array(fig.canvas.renderer._renderer)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
    frames.append(frame)&lt;br /&gt;
# Guardamos el GIF&lt;br /&gt;
imageio.mimsave('fundamental_solution_cartesiana_2D_3D.gif', frames, fps=10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es importante señalar que la discontinuidad no aparece de la misma manera en todos los ángulos, lo que podría sugerir que no es radial. Sin embargo, esta aparente discrepancia se debe a que estamos utilizando un mallado rectangular en lugar de uno polar en el código. A pesar de esto, podemos concluir que la función es claramente radial, lo que nos permite representar una sección transversal de la misma. En otras palabras, podemos visualizarla en función de la variable radial:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli3.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation&lt;br /&gt;
 &lt;br /&gt;
def chi_B(r, ct):&lt;br /&gt;
    return np.where(r &amp;lt;= ct, 1, 0)&lt;br /&gt;
 &lt;br /&gt;
def fundamental_solution_2D_radial(r, t, c, epsilon=0.01):&lt;br /&gt;
    discriminant = c ** 2 * t ** 2 - r ** 2&lt;br /&gt;
    solution = 1 / (epsilon + 2 * np.pi * c * np.sqrt(discriminant))* chi_B(r, c * t)&lt;br /&gt;
    return np.where(discriminant &amp;gt; 0, np.minimum(solution, 1), 0)&lt;br /&gt;
 &lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = np.arange(0, 5, 0.01)  # Valores de tiempo en incrementos de 0.01&lt;br /&gt;
r_values = np.linspace(0, 5, 500)&lt;br /&gt;
 &lt;br /&gt;
# Creamos una función para actualizar el gráfico en cada cuadro de la animación&lt;br /&gt;
def update(frame):&lt;br /&gt;
    plt.cla()  # Limpiamos el gráfico actual&lt;br /&gt;
    plt.plot(r_values, fundamental_solution_2D_radial(r_values, t_values[frame], c), color='blue')&lt;br /&gt;
    plt.ylim(0, 1.01)  # Ajustamos el eje y en el rango de 0 a 1&lt;br /&gt;
    plt.title(f'Solución Fundamental en 2D - t={t_values[frame]}')&lt;br /&gt;
    plt.xlabel('r')&lt;br /&gt;
    plt.ylabel('K(r, t)')&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
 &lt;br /&gt;
# Creamos la animación&lt;br /&gt;
fig = plt.figure(figsize=(8, 6))&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(t_values), interval=50)&lt;br /&gt;
 &lt;br /&gt;
# Guardamos la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_2D.gif', writer='pillow', fps=30)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observamos la presencia de una asíntota en \( K_2(x, t) \). Esta asíntota refleja cómo la amplitud de la onda se acerca a cero cuando el denominador se aproxima a cero. Sin embargo, a medida que el tiempo avanza y el radio \( |x| \) aumenta, la amplitud de la onda disminuye. Esta disminución en la amplitud se interpreta como una disminución en la intensidad o &amp;quot;altura&amp;quot; de la onda (del agua, por ejemplo) a medida que se propaga a través del espacio en dos dimensiones.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 3===&lt;br /&gt;
La solución fundamental en dimensión 3, \( K_3(x, t) \), se define como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_3(x, t) = \frac{\delta(|x| - ct)}{4\pi c|x|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde \( \delta(|x| - ct) \) representa la función delta de Dirac. Esta función modela cómo una perturbación inicial, localizada en un radio \( ct \) del origen, se propaga en el espacio tridimensional. La presencia de la función delta de Dirac garantiza que la perturbación solo se propague en un radio \( ct \) del origen. Comenzamos, como en los dos apartados anteriores, graficando la función. En este caso, no se puede representar en un mismo video cómo varía en función de \( x,y,z \) y \(t\) de manera clara. De modo que se ha optado por representar en un primer lugar un video de la relación entre  \( x,y,z \) fijando \( t=1 \):&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli4.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation &lt;br /&gt;
def dirac_approximation(s, k):&lt;br /&gt;
    return np.sqrt(k / (np.pi)) * np.exp(-k * s ** 2) &lt;br /&gt;
def fundamental_solution_3D(x, y, z, t, c, k=1000):&lt;br /&gt;
    r = np.sqrt(x ** 2 + y ** 2 + z ** 2)&lt;br /&gt;
    return dirac_approximation(r - c * t, k) / (4 * np.pi * c * r)&lt;br /&gt;
# Parámetros&lt;br /&gt;
t = 1.0&lt;br /&gt;
c = 1.0&lt;br /&gt;
k = 1000&lt;br /&gt;
x = np.linspace(-5, 5, 500)&lt;br /&gt;
y = np.linspace(-5, 5, 500)&lt;br /&gt;
X, Y = np.meshgrid(x, y)&lt;br /&gt;
# Valores de z&lt;br /&gt;
z_values = np.linspace(-1, 1, 50)&lt;br /&gt;
# Crear figura y ejes&lt;br /&gt;
fig, ax = plt.subplots(figsize=(8, 8)) &lt;br /&gt;
def update(frame):&lt;br /&gt;
    z = z_values[frame]&lt;br /&gt;
    ax.clear()&lt;br /&gt;
    Z = fundamental_solution_3D(X, Y, z, t, c, k)&lt;br /&gt;
    cset = ax.contourf(X, Y, Z, cmap='viridis')&lt;br /&gt;
    ax.set_title(f'z = {z:.2f}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(z_values), interval=100) &lt;br /&gt;
# Guardar la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_3D_corte_z.gif', writer='pillow', fps=10)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observamos que se trata de una sección de esfera hueca,  debido a la presencia de la función delta de Dirac en el numerador. ¿Qué pasa si fijamos \(z\) y variamos \(t\)?&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli5.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation &lt;br /&gt;
def dirac_approximation(s, k):&lt;br /&gt;
    return np.sqrt(k / (np.pi)) * np.exp(-k * s ** 2)&lt;br /&gt;
def fundamental_solution_3D(x, y, z, t, c, k=1000):&lt;br /&gt;
    r = np.sqrt(x ** 2 + y ** 2 + z ** 2)&lt;br /&gt;
    return dirac_approximation(r - c * t, k) / (4 * np.pi * c * r)&lt;br /&gt;
# Parámetros&lt;br /&gt;
z = 0&lt;br /&gt;
c = 1.0&lt;br /&gt;
k = 1000&lt;br /&gt;
x = np.linspace(-5, 5, 500)&lt;br /&gt;
y = np.linspace(-5, 5, 500)&lt;br /&gt;
X, Y = np.meshgrid(x, y) &lt;br /&gt;
# Valores de z&lt;br /&gt;
t_values = np.linspace(0, 5, 50) &lt;br /&gt;
# Crear figura y ejes&lt;br /&gt;
fig, ax = plt.subplots(figsize=(8, 8)) &lt;br /&gt;
def update(frame):&lt;br /&gt;
    t = t_values[frame]&lt;br /&gt;
    ax.clear()&lt;br /&gt;
    Z = fundamental_solution_3D(X, Y, z, t, c, k)&lt;br /&gt;
    cset = ax.contourf(X, Y, Z, cmap='viridis')&lt;br /&gt;
    ax.set_title(f't = {t:.2f}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(z_values), interval=100) &lt;br /&gt;
# Guardar la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_3D_dif_t.gif', writer='pillow', fps=10)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Obtenemos también una circunferencia que se va expandiendo con el tiempo. Uniendo ambas ideas podemos ver que en dimensión 3, la solución fundamental es una esfera hueca que con el tiempo va aumentando de radio y disminuyendo la intensidad del primer impulso.&lt;br /&gt;
&lt;br /&gt;
Claramente es una función que depende únicamente del radio, así pues, de manera análoga, la representamos en su variable radial.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli6.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation&lt;br /&gt;
 &lt;br /&gt;
def dirac_approximation(s, k):&lt;br /&gt;
    return (k / np.pi) ** 0.5 * np.exp(-k * s ** 2)&lt;br /&gt;
 &lt;br /&gt;
def fundamental_solution_3D_radial(r, t, c, k=1000):&lt;br /&gt;
    return dirac_approximation(r - c * t, k) / (4 * np.pi * c * r)&lt;br /&gt;
 &lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = np.arange(0, 5, 0.01)  # Valores de tiempo en incrementos de 0.01&lt;br /&gt;
r_values = np.linspace(0, 5, 500)&lt;br /&gt;
 &lt;br /&gt;
# Creamos una función para actualizar el gráfico en cada cuadro de la animación&lt;br /&gt;
def update(frame):&lt;br /&gt;
    plt.cla()  # Limpiamos el gráfico actual&lt;br /&gt;
    plt.plot(r_values, fundamental_solution_3D_radial(r_values, t_values[frame], c), color= 'blue')&lt;br /&gt;
    plt.ylim(0, 5)  # Ajustamos el eje y en el rango de 0 a 1&lt;br /&gt;
    plt.title(f'Solución Fundamental en 3D - t={t_values[frame]}')&lt;br /&gt;
    plt.xlabel('r')&lt;br /&gt;
    plt.ylabel('K(r, t)')&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
 &lt;br /&gt;
# Creamos la animación&lt;br /&gt;
fig = plt.figure(figsize=(8, 6))&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(t_values), interval=50)&lt;br /&gt;
 &lt;br /&gt;
# Guardamos la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_3D.gif', writer='pillow', fps=30)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este video puede intuir que un impulso solo es percibido por el individuo en el momento en que la esfera ''lo alcanza'', y con una intensidad que va disminuyendo. Esto es fundamental en la comprensión de la propagación de ondas, conocido como el principio de Huygens.&lt;br /&gt;
&lt;br /&gt;
== Solución fundamental del problema en dimensión 2==&lt;br /&gt;
En esta sección nos centraremos en resolver el siguiente problema de la ecuación de ondas en dos dimensiones:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;u_{tt} - c^2 \Delta u  = 0, &amp;amp; \quad x \in \mathbb{R}^2, \quad t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, \quad u_t(x,0) = h(x) = \chi_{B(0,\frac{1}{2})(x)}, &amp;amp; \quad x \in \mathbb{R}^2,&lt;br /&gt;
\end{align}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La solución se obtendrá mediante una convolución entre la solución fundamental, explicada en la sección anterior, y \(u_t(x,0)\). Es decir, la solución se calcula de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
 u(x,t) = \int_{\mathbb{R}^2} K_2(x-y, t) h(y) \, dy.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dado que hemos demostrado previamente que \(K_2(x, t)\) es radial, es evidente que \(K_2(x-y, t)\) también lo es. Además, consideremos \(h(x)=\chi_{B(0,\frac{1}{2})}(x)\), la función característica de una bola centrada en \(0\). Esta función también es radial. Por lo tanto, podemos simplificar nuestros cálculos mediante un cambio a coordenadas polares.&lt;br /&gt;
&lt;br /&gt;
Para resolver la integral de la función \( u(x,t) \) en coordenadas polares, primero necesitamos reformular la integral en estos términos, donde &amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{array}{ll}&lt;br /&gt;
x = (r_x \cos \theta_x, r_x \sin \theta_x) \\&lt;br /&gt;
y = (r_y \cos \theta_y, r_y \sin \theta_y)&lt;br /&gt;
\end{array}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
La integral se transforma usando el jacobiano de la transformación polar \( r \, dr \, d\theta \):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(r_x, \theta_x, t) = \int_0^{2\pi} \int_0^{\infty} K_2(r, t) h((r_y \cos \theta_y, r_y \sin \theta_y)) r \, dr \, d\theta, \, \text{donde} \, r = \sqrt{r_x^2 + r_y^2 - 2r_x r_y \cos(\theta_x-\theta_y)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podemos simplificar nuestros cálculos y calcular la integral para una sección transversal, es decir, fijando un ángulo. Esto se debe a que para cualquier ángulo diferente, la representación obtenida seguirá teniendo la misma forma.  Podemos exigir, por ejemplo \( \theta_x = 0\) y representar \(x=(r_x ,0)\). De modo, que mi nueva integral a calcular será la siguiente, tomando la velocidad de propagación \(c=1\):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(r_x, t) = \chi_{B(0,t)}(r_x)\cdot \int_0^{2\pi} \int_0^{\infty} \frac{r}{2\pi \sqrt{t^2 - r^2}} \cdot \chi_{B(0,\frac{1}{2})}(r_y)\, dr_y \, d\theta_y, \, \text{donde} \, r = \sqrt{r_x^2 + r_y^2 - 2r_x r_y \cos(\theta_y)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Podemos simplificar nuevamente la integral, pues observamos que el integrando está ponderado por una función característica dependiente de la variable de integración, la cual está definida en todo \(\mathbb{R}^+\). La ventaja de tener una función con soporte compacto implica que se puede reducir el extremo de integración a un intervalo compacto, en este caso \(r_y = 0\) hasta \(\frac{1}{2}\). Por lo tanto, obtenemos la integral equivalente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(r_x, t) = \chi_{B(0,t)}(r_x)\cdot \int_0^{2\pi} \int_0^{\frac{1}{2}} \frac{\sqrt{r_x^2 + r_y^2 - 2r_x r_y \cos(\theta_y)}}{2\pi \sqrt{t^2 - r_x^2 - r_y^2 + 2r_x r_y \cos(\theta_y)}} \, dr_y \, d\theta_y&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
A continuación mostramos la solución obtenida para diferentes tiempos \(t\)&lt;br /&gt;
[[Categoría:EDP]]&lt;br /&gt;
[[Categoría:EDP23/24]]&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72546</id>
		<title>Ecuación de ondas. Grupo Eau De Parfum(EDP)</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72546"/>
				<updated>2024-05-25T21:32:16Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Solución fundamental del problema en dimensión 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación de Ondas. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
&lt;br /&gt;
=Introducción=&lt;br /&gt;
&lt;br /&gt;
=Contexto histórico=&lt;br /&gt;
[[Archivo:alambert_edp.jpg|200px|thumb|right|Jean le Rond D'Alembert]]&lt;br /&gt;
La ecuación de onda es una ecuación diferencial en derivadas parciales lineal de segundo orden, crucial para describir la propagación de diversas ondas, como las ondas sonoras, las ondas de luz y las ondas en el agua. Su relevancia se extiende a múltiples campos, incluyendo la acústica, el electromagnetismo, la mecánica cuántica y la dinámica de fluidos. Históricamente, Jean le Rond d'Alembert fue el primero en estudiar el problema de una cuerda vibrante, como las utilizadas en instrumentos musicales, en 1746.&lt;br /&gt;
&lt;br /&gt;
=Conocimientos previos=&lt;br /&gt;
En esta sección se van a describir algunos conceptos a tener en cuenta durante todo el trabajo.&lt;br /&gt;
&lt;br /&gt;
-Principio de Huygens: Afirma que cada punto en un frente de onda actúa como una fuente de ondas secundarias que se propagan hacia adelante con la misma velocidad que la propia onda. Estas ondas secundarias se combinan para formar un nuevo frente de onda, que es tangente a todas las ondas secundarias. Es decir, cada punto del frente de onda original puede considerarse como un punto de partida para nuevas ondas que se mueven en la misma dirección que la perturbación inicial. Estas ondas secundarias tienen la misma velocidad y frecuencia que la onda original.&lt;br /&gt;
&lt;br /&gt;
Cabe destacar que vamos a utilizar [[Series de Fourier (Grupo Eau De Parfum (EDP))|Series de Furier]]&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas I=&lt;br /&gt;
Estamos considerando una cuerda vibrante que se extiende en el intervalo [0,1], con una densidad &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; y una tensión constante &amp;lt;math&amp;gt;\tau_0&amp;lt;/math&amp;gt;, lo que resulta en una velocidad de propagación &amp;lt;math&amp;gt;c=\frac{\tau_0}{d}=1&amp;lt;/math&amp;gt;. Además suponemos que la cuerda está fija en los extremos y llamamos &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt; a su posición e impulso iniciales respectivamente.&lt;br /&gt;
&lt;br /&gt;
El sistema de ecuaciones que modeliza el comportamiento de los desplazamientos transversales de la cuerda es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = u(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =u_0(x) \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = u_1(x),&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La solución general de la ecuación de ondas empleando separación de variables se puede expresar en términos de la serie de Fourier de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;. La solución tiene la forma&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty} [A_n \cos(n\pi t)+B_n \sin(n \pi t)]sin(n \pi x)  &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde los coeficientes &amp;lt;math&amp;gt;A_n&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;B_n&amp;lt;/math&amp;gt; se determinan a partir de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;.Por lo que la solución completa de a ecuación de ondas para la cuerda vibrante con las condiciones iniciales dadas es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty}[ (2\int_{0}^{1} u_0(x) \sin(n \pi x) dx) \cos(n \pi t) + (\frac{2}{n\pi} \int_{0}^{1} u_0(x) \sin(n \pi x) dx)\sin(n\pi t)] \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Cambiando datos iniciales==&lt;br /&gt;
Para resolver este problema, primero debemos calcular los coeficientes de Fourier &amp;lt;math&amp;gt; A_n &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; B_n &amp;lt;/math&amp;gt; usando los datos iniciales &amp;lt;math&amp;gt; u_0(x)=e^{-100(x-1/2)^2} &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; u_1(x)=0 &amp;lt;/math&amp;gt;. Luego, usaremos estos coeficientes para construir la solución aproximada &amp;lt;math&amp;gt; u(x,t) &amp;lt;/math&amp;gt; tomando los primeros 50 términos de la serie.&lt;br /&gt;
&lt;br /&gt;
Los coeficientes de Fourier son:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_0^1 u_0(x) \sin(n \pi x) \, dx = 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n \pi} \int_0^1 u_1(x) \sin(n \pi x) \, dx = 0 \quad (\text{porque } u_1(x) = 0).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo tanto, la solución se simplifica a:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x,t) = \sum_{n=1}^{50} A_n \cos(n \pi t) \sin(n \pi x)=\sum_{n=1}^{50}[2 \int_0^1 u_0(x) \sin(n \pi x) \, dx cos(n \pi t)] \sin(n \pi x) .&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedemos a representar la solución obteniendo:&lt;br /&gt;
[[Archivo:ejer3a_edp.png|500px|thumb|right|]]&lt;br /&gt;
[[Archivo:ejer3b_edp.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
 &lt;br /&gt;
# Definimos las funciones iniciales u0(x) y u1(x)&lt;br /&gt;
def u0(x):&lt;br /&gt;
    return np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
def u1(x):&lt;br /&gt;
    return np.zeros_like(x)&lt;br /&gt;
 &lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1.0&lt;br /&gt;
c = 1.0  # Velocidad de propagación de las ondas&lt;br /&gt;
N = 100  # Número de puntos para el método del trapecio&lt;br /&gt;
x = np.linspace(0, L, N)&lt;br /&gt;
 &lt;br /&gt;
# Intervalo de tiempo y número de términos de Fourier&lt;br /&gt;
T = 2.0&lt;br /&gt;
n_terms = 50&lt;br /&gt;
 &lt;br /&gt;
# Resolución temporal&lt;br /&gt;
t_steps = 200&lt;br /&gt;
t = np.linspace(0, T, t_steps)&lt;br /&gt;
 &lt;br /&gt;
# Inicialización de u(x,t)&lt;br /&gt;
u_xt = np.zeros((N, t_steps))&lt;br /&gt;
 &lt;br /&gt;
# Calculamos la solución para cada tiempo t&lt;br /&gt;
for j, tj in enumerate(t):&lt;br /&gt;
    u_t = np.zeros_like(x)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        # Calculamos los coeficientes A_n y B_n&lt;br /&gt;
        integrand_f = u0(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        A_n = 2 * np.trapz(integrand_f, x)&lt;br /&gt;
 &lt;br /&gt;
        integrand_g = u1(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        B_n = 2 / (n * np.pi * c) * np.trapz(integrand_g, x)&lt;br /&gt;
 &lt;br /&gt;
        # Suma de términos en la serie de Fourier&lt;br /&gt;
        u_t += (A_n * np.cos(n * np.pi * c * tj) + B_n * np.sin(n * np.pi * c * tj)) * np.sin(n * np.pi * x / L)&lt;br /&gt;
    u_xt[:, j] = u_t&lt;br /&gt;
 &lt;br /&gt;
# Graficamos la solución en diferentes tiempos&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
for j in range(0, t_steps, t_steps // 10):&lt;br /&gt;
    plt.plot(x, u_xt[:, j], label=f't={t[j]:.2f}')&lt;br /&gt;
 &lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('u(x,t)')&lt;br /&gt;
plt.title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
 &lt;br /&gt;
# Comprobamos la periodicidad en el tiempo&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
for i in range(0, N, N // 10):&lt;br /&gt;
    plt.plot(t, u_xt[i, :], label=f'x={x[i]:.2f}')&lt;br /&gt;
 &lt;br /&gt;
plt.xlabel('t')&lt;br /&gt;
plt.ylabel('u(x,t)')&lt;br /&gt;
plt.title('Periodicidad de la solución en el tiempo')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Representándolo en tres dimensiones obtenemos&lt;br /&gt;
[[Archivo:ejer3c_edp.png|350px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation, PillowWriter&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
# Graficamos la solución en 3D&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
 &lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
 &lt;br /&gt;
# Transponemos u_xt para que las dimensiones coincidan con las de X y T&lt;br /&gt;
ax.plot_surface(X, T, u_xt.T, cmap='viridis')&lt;br /&gt;
 &lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('t')&lt;br /&gt;
ax.set_zlabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Archivo:Wave_equation.gif|350px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Configuración de la animación&lt;br /&gt;
fig, ax = plt.subplots()&lt;br /&gt;
line, = ax.plot(x, u_xt[:, 0])&lt;br /&gt;
ax.set_xlim(0, L)&lt;br /&gt;
ax.set_ylim(-1.10, 1.10)&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
# Agregar un texto que muestre el instante de tiempo&lt;br /&gt;
time_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)&lt;br /&gt;
 &lt;br /&gt;
def update(frame):&lt;br /&gt;
    line.set_ydata(u_xt[:, frame])&lt;br /&gt;
    time_text.set_text(f't = {t[frame]:.2f}s')&lt;br /&gt;
    return line, time_text&lt;br /&gt;
 &lt;br /&gt;
ani = FuncAnimation(fig, update, frames=t_steps, blit=True)&lt;br /&gt;
 &lt;br /&gt;
# Guardar la animación como GIF&lt;br /&gt;
writer = PillowWriter(fps=20)&lt;br /&gt;
ani.save(&amp;quot;wave_equation.gif&amp;quot;, writer=writer)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La gráfica muestra la periodicidad en el tiempo de la solución &amp;lt;math&amp;gt;u(x,t) &amp;lt;/math&amp;gt;. La función claramente repite su patrón a medida que &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; varía, lo que confirma que la solución es periódica en el tiempo con un período de 2. Este período corresponde al término más lento &amp;lt;math&amp;gt; n=1 &amp;lt;/math&amp;gt;, ya que &amp;lt;math&amp;gt;\cos(\pi t)&amp;lt;/math&amp;gt; tiene un período de 2.&lt;br /&gt;
&lt;br /&gt;
La periodicidad observada es coherente con la naturaleza periódica de las funciones seno y coseno involucradas en la solución de la ecuación de la cuerda vibrante.&lt;br /&gt;
&lt;br /&gt;
==Onda en un solo sentido==&lt;br /&gt;
Veamos ahora lo que ocurre cuando estudiamos una onda que viaja en un solo sentido, es decir, &amp;lt;math&amp;gt; u(x, t) = f (x − t)&amp;lt;/math&amp;gt;. Que particularizaremos tomando como datos iniciales &amp;lt;math&amp;gt;u_0(x) = f(x)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u_1(x) = -f'(x)&amp;lt;/math&amp;gt;, con &amp;lt;math&amp;gt;f(x)=e^{-100(x-1/2)^2}&amp;lt;/math&amp;gt;. Por tanto el sistema con el que trabajamos es&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = u(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =e^{-100(x-1/2)^2} \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = 200(x-1/2)e^{-100(x-1/2)^2},&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Su solución viene dada mediante el método de separación de variables en términos de los coeficientes de Fourier:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_0^1 u_0(x) \sin(n \pi x) \, dx = 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n \pi} \int_0^1 u_1(x) \sin(n \pi x) \, dx =\frac{2}{n \pi} \int_0^1 (200(x-1/2)e^{-100(x-1/2)^2})\sin(n \pi x) \, dx&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo que la solución completa de la ecuación de ondas para la cuerda vibrante con las condiciones iniciales dadas es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty}[ ( 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx) \cos(n \pi t) + (\frac{2}{n \pi} \int_0^1 (200(x-1/2)e^{-100(x-1/2)^2})\sin(n \pi x) \, dx)\sin(n\pi t)] \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La representación gráfica de esta solución es:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:wave_equation_dirichlet.gif|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation, PillowWriter&lt;br /&gt;
 &lt;br /&gt;
# Definimos la función f(x)&lt;br /&gt;
def f(x):&lt;br /&gt;
    return np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
# Definimos la derivada de f(x)&lt;br /&gt;
def primef(x):&lt;br /&gt;
    return -200 * (x - 0.5) * np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1.0&lt;br /&gt;
c = 1.0  # Velocidad de propagación de las ondas&lt;br /&gt;
N = 300  # Número de puntos para el método del trapecio&lt;br /&gt;
x = np.linspace(0, L, N)&lt;br /&gt;
 &lt;br /&gt;
# Intervalo de tiempo y número de términos de Fourier&lt;br /&gt;
T = 2.0&lt;br /&gt;
n_terms = 50&lt;br /&gt;
 &lt;br /&gt;
# Resolución temporal&lt;br /&gt;
t_steps = 600&lt;br /&gt;
t = np.linspace(0, T, t_steps)&lt;br /&gt;
 &lt;br /&gt;
# Inicialización de u(x,t)&lt;br /&gt;
u_xt = np.zeros((N, t_steps))&lt;br /&gt;
 &lt;br /&gt;
# Calculamos la solución para cada tiempo t&lt;br /&gt;
for j, tj in enumerate(t):&lt;br /&gt;
    u_t = np.zeros_like(x)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        # Calculamos los coeficientes A_n y B_n&lt;br /&gt;
        integrand_f = f(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        A_n = 2 * np.trapz(integrand_f, x)&lt;br /&gt;
 &lt;br /&gt;
        integrand_g = primef(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        B_n = 2 / (n * np.pi * c) * np.trapz(integrand_g, x)&lt;br /&gt;
 &lt;br /&gt;
        # Suma de términos en la serie de Fourier&lt;br /&gt;
        u_t += (A_n * np.cos(n * np.pi * c * tj) + B_n * np.sin(n * np.pi * c * tj)) * np.sin(n * np.pi * x / L)&lt;br /&gt;
   &lt;br /&gt;
    u_xt[:, j] = u_t&lt;br /&gt;
 &lt;br /&gt;
# Configuración de la animación&lt;br /&gt;
fig, ax = plt.subplots()&lt;br /&gt;
line, = ax.plot(x, u_xt[:, 0])&lt;br /&gt;
ax.set_xlim(0, L)&lt;br /&gt;
ax.set_ylim(-1.10, 1.10)&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
# Agregar un texto que muestre el instante de tiempo&lt;br /&gt;
time_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)&lt;br /&gt;
 &lt;br /&gt;
def update(frame):&lt;br /&gt;
    line.set_ydata(u_xt[:, frame])&lt;br /&gt;
    time_text.set_text(f't = {t[frame]:.2f}s')&lt;br /&gt;
    return line, time_text&lt;br /&gt;
 &lt;br /&gt;
ani = FuncAnimation(fig, update, frames=t_steps, blit=True)&lt;br /&gt;
 &lt;br /&gt;
# Guardar la animación como GIF&lt;br /&gt;
writer = PillowWriter(fps=20)&lt;br /&gt;
ani.save(&amp;quot;wave_equation_dirichlet.gif&amp;quot;, writer=writer)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Cambio en condición frontera==&lt;br /&gt;
Para comprender la diferencia entre las condiciones de frontera Dirichlet y Neumann en la ecuación de ondas, repetiremos el análisis del apartado anterior, esta vez aplicando condiciones de Neumann. En lugar de fijar los valores de la función en los extremos (condiciones de Dirichlet), estableceremos que las derivadas parciales respecto a &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; en los extremos sean cero. Es decir, consideramos las condiciones &amp;lt;math&amp;gt; u_x(0,t)=u_x(1,t)=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
Por tanto nuestro nuevo problema es&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u_x(0, t) = u_x(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =e^{-100(x-1/2)^2} \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = 200(x-1/2)e^{-100(x-1/2)^2}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para resolver esta ecuación utilizando el método de Fourier, se expande la función &amp;lt;math&amp;gt; u(x,t) &amp;lt;/math&amp;gt; en una serie de Fourier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x,t) = \sum_{n=1}^{\infty} \left( A_n \cos(n\pi ct) + B_n \sin(n\pi ct) \right) \cos \left( \frac{n\pi x}{L} \right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; es la longitud de la cuerda y los coeficientes &amp;lt;math&amp;gt; A_n &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; B_n &amp;lt;/math&amp;gt; se calculan mediante integrales utilizando las funciones iniciales &amp;lt;math&amp;gt; f(x) &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; f'(x) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Estas funciones se utilizan para calcular los coeficientes \( A_n \) y \( B_n \), y luego se utilizan en la serie de Fourier para obtener la solución \( u(x,t) \).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_{0}^{L} f(x) \cos \left( \frac{n\pi x}{L} \right) \, dx&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n\pi c} \int_{0}^{L} f'(x) \cos \left( \frac{n\pi x}{L} \right) \, dx&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
La gran diferencia con la solución por serie de Fourier del apartado anterior, radica en la resolución del problema de autovalores para la variable x.&lt;br /&gt;
&lt;br /&gt;
Comenzamos buscando soluciones de la forma &amp;lt;math&amp;gt;U(x, t) = w(t) v(x)&amp;lt;/math&amp;gt; con &amp;lt;math&amp;gt;v(0) = v(L) = 0&amp;lt;/math&amp;gt;. Insertando &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; en la ecuación de onda, encontramos:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
0 = U_{tt} - c^2 U_{xx} = w''(t) v(x) - c^2 w(t) v''(x)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
O, separando las variables,&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{1}{c^2} \frac{w''(t)}{w(t)} = \frac{v''(x)}{v(x)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Es una identidad entre dos funciones, una dependiendo solo de &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; y la otra solo de &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;. Por lo tanto, ambos lados de la igualdad deben ser iguales a la misma constante, digamos &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;. Así, llegamos a la ecuación&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
w''(t) - \lambda c^2 w(t) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
y al problema de los autovalores&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v''(x) - \lambda v(x) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v'(0) = v'(L) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para la solución del problema de los autovalores. Hay tres posibilidades.&lt;br /&gt;
&lt;br /&gt;
# Si &amp;lt;math&amp;gt;\lambda = 0&amp;lt;/math&amp;gt;, entonces &amp;lt;math&amp;gt;v(x) = A + Bx&amp;lt;/math&amp;gt; esto implica &amp;lt;math&amp;gt;A = B = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Si &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt;, entonces &amp;lt;math&amp;gt;v(x) = Ae^{-\sqrt\lambda x} + Be^{\sqrt\lambda x}&amp;lt;/math&amp;gt; y nuevamente implica &amp;lt;math&amp;gt;A = B = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Si &amp;lt;math&amp;gt;\lambda &amp;lt; 0&amp;lt;/math&amp;gt;, entonces &amp;lt;math&amp;gt;v(x) = A \sin(\sqrt\lambda x) + B \cos(\sqrt\lambda x)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
De las condiciones obtenemos:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v'(0) = \sqrt\lambda A = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
por tanto &amp;lt;math&amp;gt;A =0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v'(1) = A\sqrt{\lambda}\cos(\sqrt{\lambda}) - B\sqrt{\lambda}\sin(\sqrt{\lambda}) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
de donde&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
B \text{ arbitrario}, A = 0, \lambda = \frac{m^2\pi^2}{L^2}, n = 1, 2, \ldots&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Por lo tanto, en el caso c) solo encontramos soluciones no triviales, de la forma&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v_m(x) = B_n \cos(\lambda_n x), \quad \lambda_n = \frac{m^2\pi^2}{L^2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Particularizando a nuestros datos:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x,t) = \sum_{n=1}^{\infty} \left( A_n \cos(n\pi t) + B_n \sin(n\pi t) \right) \cos(n\pi x) \quad&lt;br /&gt;
&lt;br /&gt;
A_n = 2 \int_{0}^{1} f(x) \cos(n\pi x) \, dx \quad&lt;br /&gt;
&lt;br /&gt;
B_n = \frac{2}{n\pi} \int_{0}^{1} f'(x) \cos(n\pi x) \, dx&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
[[Archivo:gordingordin1.png|650px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation, PillowWriter&lt;br /&gt;
 &lt;br /&gt;
# Definimos la función f(x)&lt;br /&gt;
def f(x):&lt;br /&gt;
    return np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
# Definimos la derivada de f(x)&lt;br /&gt;
def primef(x):&lt;br /&gt;
    return -200 * (x - 0.5) * np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1.0&lt;br /&gt;
c = 1.0  # Velocidad de propagación de las ondas&lt;br /&gt;
N = 300  # Número de puntos para el método del trapecio&lt;br /&gt;
x = np.linspace(0, L, N)&lt;br /&gt;
 &lt;br /&gt;
# Intervalo de tiempo y número de términos de Fourier&lt;br /&gt;
T = 2.0&lt;br /&gt;
n_terms = 50&lt;br /&gt;
 &lt;br /&gt;
# Resolución temporal&lt;br /&gt;
t_steps = 300&lt;br /&gt;
t = np.linspace(0, T, t_steps)&lt;br /&gt;
 &lt;br /&gt;
# Inicialización de u(x,t)&lt;br /&gt;
u_xt = np.zeros((N, t_steps))&lt;br /&gt;
 &lt;br /&gt;
# Calculamos la solución para cada tiempo t&lt;br /&gt;
for j, tj in enumerate(t):&lt;br /&gt;
    u_t = np.zeros_like(x)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        # Calculamos los coeficientes A_n y B_n&lt;br /&gt;
        integrand_f = f(x) * np.cos(n * np.pi * x / L)&lt;br /&gt;
        A_n = 2 * np.trapz(integrand_f, x)&lt;br /&gt;
 &lt;br /&gt;
        integrand_g = primef(x) * np.cos(n * np.pi * x / L)&lt;br /&gt;
        B_n = 2 / (n * np.pi * c) * np.trapz(integrand_g, x)&lt;br /&gt;
 &lt;br /&gt;
        # Suma de términos en la serie de Fourier&lt;br /&gt;
        u_t += (A_n * np.cos(n * np.pi * c * tj) + B_n * np.sin(n * np.pi * c * tj)) * np.cos(n * np.pi * x / L)&lt;br /&gt;
   &lt;br /&gt;
    u_xt[:, j] = u_t&lt;br /&gt;
 &lt;br /&gt;
# Configuración de la animación&lt;br /&gt;
fig, ax = plt.subplots()&lt;br /&gt;
line, = ax.plot(x, u_xt[:, 0])&lt;br /&gt;
ax.set_xlim(0, L)&lt;br /&gt;
ax.set_ylim(-0.25, 2)&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda con condiciones de Neumann')&lt;br /&gt;
 &lt;br /&gt;
# Agregar un texto que muestre el instante de tiempo&lt;br /&gt;
time_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)&lt;br /&gt;
 &lt;br /&gt;
def update(frame):&lt;br /&gt;
    line.set_ydata(u_xt[:, frame])&lt;br /&gt;
    time_text.set_text(f't = {t[frame]:.2f}s')&lt;br /&gt;
    return line, time_text&lt;br /&gt;
 &lt;br /&gt;
ani = FuncAnimation(fig, update, frames=t_steps, blit=True)&lt;br /&gt;
 &lt;br /&gt;
# Guardar la animación como GIF&lt;br /&gt;
writer = PillowWriter(fps=20)&lt;br /&gt;
ani.save(&amp;quot;wave_equation_neumann.gif&amp;quot;, writer=writer)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas II=&lt;br /&gt;
En esta sección, abordaremos la resolución de la ecuación de ondas en dimensiones 1, 2 y 3, una tarea que nos permitirá explorar la solución fundamental y, a su vez, comprender el principio de Huygens.&lt;br /&gt;
&lt;br /&gt;
==Soluciones fundamentales para diferentes dimensiones==&lt;br /&gt;
Comenzamos estudiando la solución fundamental, que surge como respuesta a un impulso inicial localizado en \( x = 0 \). Formalmente, se define mediante límites y funciones características. El objetivo es observar y graficar las soluciones fundamentales en su forma radial para cada dimensión, lo que nos ayudará a comprender mejor la naturaleza de las ondas en diferentes entornos dimensionales.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 1===&lt;br /&gt;
La solución fundamental en dimensión 1, \( K_1(x, t) \), se define como:&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_1(x, t) = \frac{1}{2c} \left[ H(x + ct) - H(x - ct) \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde \( H(s) \) es la función de Heaviside, dada por:&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H(s) = \begin{cases}&lt;br /&gt;
0, &amp;amp; \text{si } s &amp;lt; 0 \\&lt;br /&gt;
1, &amp;amp; \text{si } s \geq 0&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dicha función, \( K_1(x, t) \), se compone de dos funciones de Heaviside desplazadas horizontalmente a lo largo del eje \( x \) en \( ct \) y \( -ct \) y luego divididas por \( 2c \). Esto significa que en el intervalo \( (-\infty, -ct) \), \( K_1(x, t) \) es 0, luego aumenta a 1 en el intervalo \( (-ct, ct) \), y finalmente vuelve a 0 en el intervalo \( (ct, \infty) \). La constante \( c \) controla la velocidad de propagación de la onda, que hemos exigido \(1\). Graficamos la función para tener una primera idea intuitiva de la solución fundamental:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli1.png|650px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
 def heaviside(x):&lt;br /&gt;
    return np.where(x &amp;gt;= 0, 1, 0)&lt;br /&gt;
 def fundamental_solution_1D(x, t, c):&lt;br /&gt;
    return (1 / (2 * c)) * (heaviside(x + c * t) - heaviside(x - c * t))&lt;br /&gt;
 # Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = [0.5, 1.0, 1.5]  # Valores de tiempo que queremos graficar&lt;br /&gt;
x_range = np.linspace(-5, 5, 100)&lt;br /&gt;
 # Graficamos las soluciones fundamentales en 1D, 2D y 3D para los diferentes valores de tiempo&lt;br /&gt;
fig, axes = plt.subplots(1, len(t_values), figsize=(15, 5))&lt;br /&gt;
 for i, t in enumerate(t_values):&lt;br /&gt;
    # Solución en 1D&lt;br /&gt;
    axes[i].plot(x_range, fundamental_solution_1D(x_range, t, c))&lt;br /&gt;
    axes[i].set_title(f'Solución Fundamental en 1D (t={t})')&lt;br /&gt;
    axes[i].set_xlabel('x')&lt;br /&gt;
    axes[i].set_ylabel('K(x, t)') &lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Visualmente, la gráfica de \( K_1(x, t) \) parece una función escalón, donde hay un cambio abrupto en el valor de la función en \( x = \pm ct \). Esto refleja la propagación de una onda con velocidad \( c \) a lo largo del eje \( x \).  Además, debido a que su valor depende únicamente de la distancia radial desde el origen, es decir, de la magnitud de \( x \), podemos decir que se trata de una función radial y, por tanto, graficarla de esta forma. En la expresión de \( K_1(x, t) \), la variable \( x \) aparece únicamente como \( x \pm ct \), lo que permite su reescritura como \( K_1(r, t) \), donde \( r = |x| \) es la distancia radial.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:fundamental_solution_1D.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation&lt;br /&gt;
def heaviside(x):&lt;br /&gt;
    return np.where(x &amp;gt;= 0, 1, 0)&lt;br /&gt;
def fundamental_solution_1D_radial(r, t, c):&lt;br /&gt;
    return (1 / (2 * c)) * (np.heaviside(r + c * t, 0) - np.heaviside(r - c * t, 0))&lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = np.arange(0, 5, 0.01)  # Valores de tiempo en incrementos de 0.01&lt;br /&gt;
r_values = np.linspace(0, 5, 500)&lt;br /&gt;
# Creamos una función para actualizar el gráfico en cada cuadro de la animación&lt;br /&gt;
def update(frame):&lt;br /&gt;
    plt.cla()  # Limpiamos el gráfico actual&lt;br /&gt;
    plt.plot(r_values, fundamental_solution_1D_radial(r_values, t_values[frame], c),color = 'blue')&lt;br /&gt;
    plt.title(f'Solución Fundamental en 1D - t={t_values[frame]}')&lt;br /&gt;
    plt.xlabel('r')&lt;br /&gt;
    plt.ylabel('K(r, t)')&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
# Creamos la animación&lt;br /&gt;
fig = plt.figure(figsize=(8, 6))&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(t_values), interval=50)&lt;br /&gt;
# Guardamos la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_1D.gif', writer='pillow', fps=30)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Al graficar \( K_1(r, t) \) como función de \( r \) para diferentes valores de \( t \), se observa que la forma de la curva es la misma independientemente de la dirección específica en la que nos movamos desde el origen, lo que confirma su carácter radial.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 2===&lt;br /&gt;
La solución fundamental en dimensión 2, \( K_2(x, t) \), se define como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_2(x, t) = \frac{1}{2\pi c \sqrt{c^2 t^2 - |x|^2}} \chi_{B(0,ct)}(x),&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
donde \(\chi_B(0,ct)(x)\) es la función característica de la bola de centro \(\ 0 \) y radio \(\ c \cdot t \). Esta función describe cómo una perturbación inicial, localizada en el centro de una bola de radio \( ct \), se propaga a lo largo del plano. La función característica \( \chi_{B(0, ct)}(x) \) asegura que la perturbación solo se propague dentro de esta bola. La presencia del término \( \frac{1}{c^2 t^2 - |x|^2} \) indica cómo la amplitud de la onda varía con la distancia desde el centro de la bola y el tiempo. Mostraremos gráficamente esta función para tener una primera idea intuitiva. Se mostrará un video que varía en función del tiempo:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli2.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import imageio&lt;br /&gt;
from io import BytesIO&lt;br /&gt;
def chi_B(r, ct):&lt;br /&gt;
    return np.where(r &amp;lt;= ct, 1, 0)&lt;br /&gt;
def fundamental_solution_2D(x, y, t, c, epsilon=0.01):&lt;br /&gt;
    r = np.sqrt(x ** 2 + y ** 2)&lt;br /&gt;
    discriminant = c ** 2 * t ** 2 - r ** 2&lt;br /&gt;
    solution = 1 / (epsilon + 2 * np.pi * c * np.sqrt(discriminant)) * chi_B(r, c * t)&lt;br /&gt;
    return np.where(discriminant &amp;gt; 0, np.minimum(solution, 1), 0)&lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
epsilon = 0.01&lt;br /&gt;
t_values = np.linspace(0.1, 5, 50)  # Valores de tiempo a animar&lt;br /&gt;
x = np.linspace(-5, 5, 1000)&lt;br /&gt;
y = np.linspace(-5, 5, 1000)&lt;br /&gt;
# Generamos los frames y los guardamos&lt;br /&gt;
frames = []&lt;br /&gt;
for t in t_values:&lt;br /&gt;
    fig, ax = plt.subplots(figsize=(8, 8))&lt;br /&gt;
    X, Y = np.meshgrid(x, y)&lt;br /&gt;
    Z = fundamental_solution_2D(X, Y, t, c, epsilon)&lt;br /&gt;
    ax.contourf(X, Y, Z, cmap='viridis') #Greys?&lt;br /&gt;
    ax.set_title(f'Solución Fundamental en 2D para t={t}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
    ax.grid(True)&lt;br /&gt;
    # Convertir la figura a una imagen numérica&lt;br /&gt;
    buf = BytesIO()&lt;br /&gt;
    fig.savefig(buf, format='png')&lt;br /&gt;
    buf.seek(0)&lt;br /&gt;
    frames.append(imageio.imread(buf))&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
# Guardamos los frames como un gif&lt;br /&gt;
imageio.mimsave('fundamental_solution_cartesiana_2D_2D.gif', frames, fps=10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Podemos notar que la ''circunferencia amarilla'' no es uniforme, sino que muestra irregularidades. Esto se debe a que la solución fundamental presenta discontinuidades cuando \(\left| x \right| \rightarrow t\). Para visualizar esto mejor, en lugar de mostrar solo el contorno de la solución, vamos a representarla en tres dimensiones:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli7.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import imageio&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
def chi_B(r, ct):&lt;br /&gt;
    return np.where(r &amp;lt;= ct, 1, 0) &lt;br /&gt;
def fundamental_solution_2D(x, y, t_values, c, epsilon=0.01):&lt;br /&gt;
    solutions = []&lt;br /&gt;
    for t in t_values:&lt;br /&gt;
        r = np.sqrt(x ** 2 + y ** 2)&lt;br /&gt;
        discriminant = c ** 2 * t ** 2 - r ** 2&lt;br /&gt;
        solution = 1 / (epsilon + 2 * np.pi * c * np.sqrt(discriminant)) * chi_B(r, c * t)&lt;br /&gt;
        solutions.append(np.where(discriminant &amp;gt; 0, np.minimum(solution, 1), 0))&lt;br /&gt;
    return solutions&lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
epsilon = 0.01&lt;br /&gt;
t_values = np.linspace(0.1, 5, 50)  # Valores de tiempo a animar&lt;br /&gt;
x = np.linspace(-5, 5, 1000)&lt;br /&gt;
y = np.linspace(-5, 5, 1000)&lt;br /&gt;
X, Y = np.meshgrid(x, y)&lt;br /&gt;
# Generamos las soluciones para cada valor de tiempo&lt;br /&gt;
solutions = fundamental_solution_2D(X, Y, t_values, c, epsilon)&lt;br /&gt;
# Creamos los frames&lt;br /&gt;
frames = []&lt;br /&gt;
for t, solution in zip(t_values, solutions):&lt;br /&gt;
    fig = plt.figure(figsize=(10, 8))&lt;br /&gt;
    ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
    ax.plot_surface(X, Y, solution, cmap='viridis')&lt;br /&gt;
    ax.set_title(f'Solución Fundamental en 2D para t={t:.2f}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
    ax.set_zlabel('K(x, y, t)')&lt;br /&gt;
    ax.set_zlim(0, 1)&lt;br /&gt;
    plt.tight_layout()&lt;br /&gt;
    fig.canvas.draw()  # Dibujamos la figura para actualizarla&lt;br /&gt;
    frame = np.array(fig.canvas.renderer._renderer)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
    frames.append(frame)&lt;br /&gt;
# Guardamos el GIF&lt;br /&gt;
imageio.mimsave('fundamental_solution_cartesiana_2D_3D.gif', frames, fps=10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es importante señalar que la discontinuidad no aparece de la misma manera en todos los ángulos, lo que podría sugerir que no es radial. Sin embargo, esta aparente discrepancia se debe a que estamos utilizando un mallado rectangular en lugar de uno polar en el código. A pesar de esto, podemos concluir que la función es claramente radial, lo que nos permite representar una sección transversal de la misma. En otras palabras, podemos visualizarla en función de la variable radial:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli3.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation&lt;br /&gt;
 &lt;br /&gt;
def chi_B(r, ct):&lt;br /&gt;
    return np.where(r &amp;lt;= ct, 1, 0)&lt;br /&gt;
 &lt;br /&gt;
def fundamental_solution_2D_radial(r, t, c, epsilon=0.01):&lt;br /&gt;
    discriminant = c ** 2 * t ** 2 - r ** 2&lt;br /&gt;
    solution = 1 / (epsilon + 2 * np.pi * c * np.sqrt(discriminant))* chi_B(r, c * t)&lt;br /&gt;
    return np.where(discriminant &amp;gt; 0, np.minimum(solution, 1), 0)&lt;br /&gt;
 &lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = np.arange(0, 5, 0.01)  # Valores de tiempo en incrementos de 0.01&lt;br /&gt;
r_values = np.linspace(0, 5, 500)&lt;br /&gt;
 &lt;br /&gt;
# Creamos una función para actualizar el gráfico en cada cuadro de la animación&lt;br /&gt;
def update(frame):&lt;br /&gt;
    plt.cla()  # Limpiamos el gráfico actual&lt;br /&gt;
    plt.plot(r_values, fundamental_solution_2D_radial(r_values, t_values[frame], c), color='blue')&lt;br /&gt;
    plt.ylim(0, 1.01)  # Ajustamos el eje y en el rango de 0 a 1&lt;br /&gt;
    plt.title(f'Solución Fundamental en 2D - t={t_values[frame]}')&lt;br /&gt;
    plt.xlabel('r')&lt;br /&gt;
    plt.ylabel('K(r, t)')&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
 &lt;br /&gt;
# Creamos la animación&lt;br /&gt;
fig = plt.figure(figsize=(8, 6))&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(t_values), interval=50)&lt;br /&gt;
 &lt;br /&gt;
# Guardamos la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_2D.gif', writer='pillow', fps=30)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observamos la presencia de una asíntota en \( K_2(x, t) \). Esta asíntota refleja cómo la amplitud de la onda se acerca a cero cuando el denominador se aproxima a cero. Sin embargo, a medida que el tiempo avanza y el radio \( |x| \) aumenta, la amplitud de la onda disminuye. Esta disminución en la amplitud se interpreta como una disminución en la intensidad o &amp;quot;altura&amp;quot; de la onda (del agua, por ejemplo) a medida que se propaga a través del espacio en dos dimensiones.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 3===&lt;br /&gt;
La solución fundamental en dimensión 2, \( K_3(x, t) \), se define como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_3(x, t) = \frac{\delta(|x| - ct)}{4\pi c|x|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde \( \delta(|x| - ct) \) representa la función delta de Dirac. Esta función modela cómo una perturbación inicial, localizada en un radio \( ct \) del origen, se propaga en el espacio tridimensional. La presencia de la función delta de Dirac garantiza que la perturbación solo se propague en un radio \( ct \) del origen. Comenzamos, como en los dos apartados anteriores, graficando la función. En este caso, no se puede representar en un mismo video cómo varía en función de \( x,y,z \) y \(t\) de manera clara. De modo que se ha optado por representar en un primer lugar un video de la relación entre  \( x,y,z \) fijando \( t=1 \):&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli4.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation &lt;br /&gt;
def dirac_approximation(s, k):&lt;br /&gt;
    return np.sqrt(k / (np.pi)) * np.exp(-k * s ** 2) &lt;br /&gt;
def fundamental_solution_3D(x, y, z, t, c, k=1000):&lt;br /&gt;
    r = np.sqrt(x ** 2 + y ** 2 + z ** 2)&lt;br /&gt;
    return dirac_approximation(r - c * t, k) / (4 * np.pi * c * r)&lt;br /&gt;
# Parámetros&lt;br /&gt;
t = 1.0&lt;br /&gt;
c = 1.0&lt;br /&gt;
k = 1000&lt;br /&gt;
x = np.linspace(-5, 5, 500)&lt;br /&gt;
y = np.linspace(-5, 5, 500)&lt;br /&gt;
X, Y = np.meshgrid(x, y)&lt;br /&gt;
# Valores de z&lt;br /&gt;
z_values = np.linspace(-1, 1, 50)&lt;br /&gt;
# Crear figura y ejes&lt;br /&gt;
fig, ax = plt.subplots(figsize=(8, 8)) &lt;br /&gt;
def update(frame):&lt;br /&gt;
    z = z_values[frame]&lt;br /&gt;
    ax.clear()&lt;br /&gt;
    Z = fundamental_solution_3D(X, Y, z, t, c, k)&lt;br /&gt;
    cset = ax.contourf(X, Y, Z, cmap='viridis')&lt;br /&gt;
    ax.set_title(f'z = {z:.2f}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(z_values), interval=100) &lt;br /&gt;
# Guardar la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_3D_corte_z.gif', writer='pillow', fps=10)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observamos que se trata de una sección de esfera hueca,  debido a la presencia de la función delta de Dirac en el numerador. ¿Qué pasa si fijamos \(z\) y variamos \(t\)?&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli5.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation &lt;br /&gt;
def dirac_approximation(s, k):&lt;br /&gt;
    return np.sqrt(k / (np.pi)) * np.exp(-k * s ** 2)&lt;br /&gt;
def fundamental_solution_3D(x, y, z, t, c, k=1000):&lt;br /&gt;
    r = np.sqrt(x ** 2 + y ** 2 + z ** 2)&lt;br /&gt;
    return dirac_approximation(r - c * t, k) / (4 * np.pi * c * r)&lt;br /&gt;
# Parámetros&lt;br /&gt;
z = 0&lt;br /&gt;
c = 1.0&lt;br /&gt;
k = 1000&lt;br /&gt;
x = np.linspace(-5, 5, 500)&lt;br /&gt;
y = np.linspace(-5, 5, 500)&lt;br /&gt;
X, Y = np.meshgrid(x, y) &lt;br /&gt;
# Valores de z&lt;br /&gt;
t_values = np.linspace(0, 5, 50) &lt;br /&gt;
# Crear figura y ejes&lt;br /&gt;
fig, ax = plt.subplots(figsize=(8, 8)) &lt;br /&gt;
def update(frame):&lt;br /&gt;
    t = t_values[frame]&lt;br /&gt;
    ax.clear()&lt;br /&gt;
    Z = fundamental_solution_3D(X, Y, z, t, c, k)&lt;br /&gt;
    cset = ax.contourf(X, Y, Z, cmap='viridis')&lt;br /&gt;
    ax.set_title(f't = {t:.2f}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(z_values), interval=100) &lt;br /&gt;
# Guardar la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_3D_dif_t.gif', writer='pillow', fps=10)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Obtenemos también una circunferencia que se va expandiendo con el tiempo. Uniendo ambas ideas podemos ver que en dimensión 3, la solución fundamental es una esfera hueca que con el tiempo va aumentando de radio y disminuyendo la intensidad del primer impulso.&lt;br /&gt;
&lt;br /&gt;
Claramente es una función que depende únicamente del radio, así pues, de manera análoga, la representamos en su variable radial.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli6.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation&lt;br /&gt;
 &lt;br /&gt;
def dirac_approximation(s, k):&lt;br /&gt;
    return (k / np.pi) ** 0.5 * np.exp(-k * s ** 2)&lt;br /&gt;
 &lt;br /&gt;
def fundamental_solution_3D_radial(r, t, c, k=1000):&lt;br /&gt;
    return dirac_approximation(r - c * t, k) / (4 * np.pi * c * r)&lt;br /&gt;
 &lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = np.arange(0, 5, 0.01)  # Valores de tiempo en incrementos de 0.01&lt;br /&gt;
r_values = np.linspace(0, 5, 500)&lt;br /&gt;
 &lt;br /&gt;
# Creamos una función para actualizar el gráfico en cada cuadro de la animación&lt;br /&gt;
def update(frame):&lt;br /&gt;
    plt.cla()  # Limpiamos el gráfico actual&lt;br /&gt;
    plt.plot(r_values, fundamental_solution_3D_radial(r_values, t_values[frame], c), color= 'blue')&lt;br /&gt;
    plt.ylim(0, 5)  # Ajustamos el eje y en el rango de 0 a 1&lt;br /&gt;
    plt.title(f'Solución Fundamental en 3D - t={t_values[frame]}')&lt;br /&gt;
    plt.xlabel('r')&lt;br /&gt;
    plt.ylabel('K(r, t)')&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
 &lt;br /&gt;
# Creamos la animación&lt;br /&gt;
fig = plt.figure(figsize=(8, 6))&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(t_values), interval=50)&lt;br /&gt;
 &lt;br /&gt;
# Guardamos la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_3D.gif', writer='pillow', fps=30)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este video puede intuir que un impulso solo es percibido por el individuo en el momento en que la esfera ''lo alcanza'', y con una intensidad que va disminuyendo. Esto es fundamental en la comprensión de la propagación de ondas, conocido como el principio de Huygens.&lt;br /&gt;
&lt;br /&gt;
== Solución fundamental del problema en dimensión 2==&lt;br /&gt;
En esta sección nos centraremos en resolver el siguiente problema de la ecuación de ondas en dos dimensiones:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;u_{tt} - c^2 \Delta u  = 0, &amp;amp; \quad x \in \mathbb{R}^2, \quad t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, \quad u_t(x,0) = h(x) = \chi_{B(0,\frac{1}{2})(x)}, &amp;amp; \quad x \in \mathbb{R}^2,&lt;br /&gt;
\end{align}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La solución se obtendrá mediante una convolución entre la solución fundamental, explicada en la sección anterior, y \(u_t(x,0)\). Es decir, la solución se calcula de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
 u(x,t) = \int_{\mathbb{R}^2} K_2(x-y, t) h(y) \, dy.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dado que hemos demostrado previamente que \(K_2(x, t)\) es radial, es evidente que \(K_2(x-y, t)\) también lo es. Además, consideremos \(h(x)=\chi_{B(0,\frac{1}{2})}(x)\), la función característica de una bola centrada en \(0\). Esta función también es radial. Por lo tanto, podemos simplificar nuestros cálculos mediante un cambio a coordenadas polares.&lt;br /&gt;
&lt;br /&gt;
Para resolver la integral de la función \( u(x,t) \) en coordenadas polares, primero necesitamos reformular la integral en estos términos, donde &amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{array}{ll}&lt;br /&gt;
x = (r_x \cos \theta_x, r_x \sin \theta_x) \\&lt;br /&gt;
y = (r_y \cos \theta_y, r_y \sin \theta_y)&lt;br /&gt;
\end{array}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
La integral se transforma usando el jacobiano de la transformación polar \( r \, dr \, d\theta \):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(r_x, \theta_x, t) = \int_0^{2\pi} \int_0^{\infty} K_2(r, t) h((r_y \cos \theta_y, r_y \sin \theta_y)) r \, dr \, d\theta, \, \text{donde} \, r = \sqrt{r_x^2 + r_y^2 - 2r_x r_y \cos(\theta_x-\theta_y)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podemos simplificar nuestros cálculos y calcular la integral para una sección transversal, es decir, fijando un ángulo. Esto se debe a que para cualquier ángulo diferente, la representación obtenida seguirá teniendo la misma forma.  Podemos exigir, por ejemplo \( \theta_x = 0\) y representar \(x=(r_x ,0)\). De modo, que mi nueva integral a calcular será la siguiente, tomando la velocidad de propagación \(c=1\):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(r_x, t) = \chi_{B(0,t)}(r_x)\cdot \int_0^{2\pi} \int_0^{\infty} \frac{r}{2\pi \sqrt{t^2 - r^2}} \cdot \chi_{B(0,\frac{1}{2})}(r_y)\, dr_y \, d\theta_y, \, \text{donde} \, r = \sqrt{r_x^2 + r_y^2 - 2r_x r_y \cos(\theta_y)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Podemos simplificar nuevamente la integral, pues observamos que el integrando está ponderado por una función característica dependiente de la variable de integración, la cual está definida en todo \(\mathbb{R}^+\). La ventaja de tener una función con soporte compacto implica que se puede reducir el extremo de integración a un intervalo compacto, en este caso \(r_y = 0\) hasta \(\frac{1}{2}\). Por lo tanto, obtenemos la integral equivalente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(r_x, t) = \chi_{B(0,t)}(r_x)\cdot \int_0^{2\pi} \int_0^{\frac{1}{2}} \frac{\sqrt{r_x^2 + r_y^2 - 2r_x r_y \cos(\theta_y)}}{2\pi \sqrt{t^2 - r_x^2 - r_y^2 + 2r_x r_y \cos(\theta_y)}} \, dr_y \, d\theta_y&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
A continuación mostramos la solución obtenida para diferentes tiempos \(t\)&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72543</id>
		<title>Ecuación de ondas. Grupo Eau De Parfum(EDP)</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72543"/>
				<updated>2024-05-25T18:26:12Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Solución fundamental del problema en dimensión 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación de Ondas. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
&lt;br /&gt;
=Introducción=&lt;br /&gt;
&lt;br /&gt;
=Contexto histórico=&lt;br /&gt;
[[Archivo:alambert_edp.jpg|200px|thumb|right|Jean le Rond D'Alembert]]&lt;br /&gt;
La ecuación de onda es una ecuación diferencial en derivadas parciales lineal de segundo orden, crucial para describir la propagación de diversas ondas, como las ondas sonoras, las ondas de luz y las ondas en el agua. Su relevancia se extiende a múltiples campos, incluyendo la acústica, el electromagnetismo, la mecánica cuántica y la dinámica de fluidos. Históricamente, Jean le Rond d'Alembert fue el primero en estudiar el problema de una cuerda vibrante, como las utilizadas en instrumentos musicales, en 1746.&lt;br /&gt;
&lt;br /&gt;
=Conocimientos previos=&lt;br /&gt;
En esta sección se van a describir algunos conceptos a tener en cuenta durante todo el trabajo.&lt;br /&gt;
&lt;br /&gt;
-Principio de Huygens: Afirma que cada punto en un frente de onda actúa como una fuente de ondas secundarias que se propagan hacia adelante con la misma velocidad que la propia onda. Estas ondas secundarias se combinan para formar un nuevo frente de onda, que es tangente a todas las ondas secundarias. Es decir, cada punto del frente de onda original puede considerarse como un punto de partida para nuevas ondas que se mueven en la misma dirección que la perturbación inicial. Estas ondas secundarias tienen la misma velocidad y frecuencia que la onda original.&lt;br /&gt;
&lt;br /&gt;
Cabe destacar que vamos a utilizar [[Series de Fourier (Grupo Eau De Parfum (EDP))|Series de Furier]]&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas I=&lt;br /&gt;
Estamos considerando una cuerda vibrante que se extiende en el intervalo [0,1], con una densidad &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; y una tensión constante &amp;lt;math&amp;gt;\tau_0&amp;lt;/math&amp;gt;, lo que resulta en una velocidad de propagación &amp;lt;math&amp;gt;c=\frac{\tau_0}{d}=1&amp;lt;/math&amp;gt;. Además suponemos que la cuerda está fija en los extremos y llamamos &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt; a su posición e impulso iniciales respectivamente.&lt;br /&gt;
&lt;br /&gt;
El sistema de ecuaciones que modeliza el comportamiento de los desplazamientos transversales de la cuerda es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = u(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =u_0(x) \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = u_1(x),&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La solución general de la ecuación de ondas empleando separación de variables se puede expresar en términos de la serie de Fourier de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;. La solución tiene la forma&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty} [A_n \cos(n\pi t)+B_n \sin(n \pi t)]sin(n \pi x)  &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde los coeficientes &amp;lt;math&amp;gt;A_n&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;B_n&amp;lt;/math&amp;gt; se determinan a partir de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;.Por lo que la solución completa de a ecuación de ondas para la cuerda vibrante con las condiciones iniciales dadas es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty}[ (2\int_{0}^{1} u_0(x) \sin(n \pi x) dx) \cos(n \pi t) + (\frac{2}{n\pi} \int_{0}^{1} u_0(x) \sin(n \pi x) dx)\sin(n\pi t)] \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Cambiando datos iniciales==&lt;br /&gt;
Para resolver este problema, primero debemos calcular los coeficientes de Fourier &amp;lt;math&amp;gt; A_n &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; B_n &amp;lt;/math&amp;gt; usando los datos iniciales &amp;lt;math&amp;gt; u_0(x)=e^{-100(x-1/2)^2} &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; u_1(x)=0 &amp;lt;/math&amp;gt;. Luego, usaremos estos coeficientes para construir la solución aproximada &amp;lt;math&amp;gt; u(x,t) &amp;lt;/math&amp;gt; tomando los primeros 50 términos de la serie.&lt;br /&gt;
&lt;br /&gt;
Los coeficientes de Fourier son:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_0^1 u_0(x) \sin(n \pi x) \, dx = 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n \pi} \int_0^1 u_1(x) \sin(n \pi x) \, dx = 0 \quad (\text{porque } u_1(x) = 0).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo tanto, la solución se simplifica a:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x,t) = \sum_{n=1}^{50} A_n \cos(n \pi t) \sin(n \pi x)=\sum_{n=1}^{50}[2 \int_0^1 u_0(x) \sin(n \pi x) \, dx cos(n \pi t)] \sin(n \pi x) .&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedemos a representar la solución obteniendo:&lt;br /&gt;
[[Archivo:ejer3a_edp.png|500px|thumb|right|]]&lt;br /&gt;
[[Archivo:ejer3b_edp.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
 &lt;br /&gt;
# Definimos las funciones iniciales u0(x) y u1(x)&lt;br /&gt;
def u0(x):&lt;br /&gt;
    return np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
def u1(x):&lt;br /&gt;
    return np.zeros_like(x)&lt;br /&gt;
 &lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1.0&lt;br /&gt;
c = 1.0  # Velocidad de propagación de las ondas&lt;br /&gt;
N = 100  # Número de puntos para el método del trapecio&lt;br /&gt;
x = np.linspace(0, L, N)&lt;br /&gt;
 &lt;br /&gt;
# Intervalo de tiempo y número de términos de Fourier&lt;br /&gt;
T = 2.0&lt;br /&gt;
n_terms = 50&lt;br /&gt;
 &lt;br /&gt;
# Resolución temporal&lt;br /&gt;
t_steps = 200&lt;br /&gt;
t = np.linspace(0, T, t_steps)&lt;br /&gt;
 &lt;br /&gt;
# Inicialización de u(x,t)&lt;br /&gt;
u_xt = np.zeros((N, t_steps))&lt;br /&gt;
 &lt;br /&gt;
# Calculamos la solución para cada tiempo t&lt;br /&gt;
for j, tj in enumerate(t):&lt;br /&gt;
    u_t = np.zeros_like(x)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        # Calculamos los coeficientes A_n y B_n&lt;br /&gt;
        integrand_f = u0(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        A_n = 2 * np.trapz(integrand_f, x)&lt;br /&gt;
 &lt;br /&gt;
        integrand_g = u1(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        B_n = 2 / (n * np.pi * c) * np.trapz(integrand_g, x)&lt;br /&gt;
 &lt;br /&gt;
        # Suma de términos en la serie de Fourier&lt;br /&gt;
        u_t += (A_n * np.cos(n * np.pi * c * tj) + B_n * np.sin(n * np.pi * c * tj)) * np.sin(n * np.pi * x / L)&lt;br /&gt;
    u_xt[:, j] = u_t&lt;br /&gt;
 &lt;br /&gt;
# Graficamos la solución en diferentes tiempos&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
for j in range(0, t_steps, t_steps // 10):&lt;br /&gt;
    plt.plot(x, u_xt[:, j], label=f't={t[j]:.2f}')&lt;br /&gt;
 &lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('u(x,t)')&lt;br /&gt;
plt.title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
 &lt;br /&gt;
# Comprobamos la periodicidad en el tiempo&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
for i in range(0, N, N // 10):&lt;br /&gt;
    plt.plot(t, u_xt[i, :], label=f'x={x[i]:.2f}')&lt;br /&gt;
 &lt;br /&gt;
plt.xlabel('t')&lt;br /&gt;
plt.ylabel('u(x,t)')&lt;br /&gt;
plt.title('Periodicidad de la solución en el tiempo')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Representándolo en tres dimensiones obtenemos&lt;br /&gt;
[[Archivo:ejer3c_edp.png|350px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation, PillowWriter&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
# Graficamos la solución en 3D&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
 &lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
 &lt;br /&gt;
# Transponemos u_xt para que las dimensiones coincidan con las de X y T&lt;br /&gt;
ax.plot_surface(X, T, u_xt.T, cmap='viridis')&lt;br /&gt;
 &lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('t')&lt;br /&gt;
ax.set_zlabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Archivo:Wave_equation.gif|350px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Configuración de la animación&lt;br /&gt;
fig, ax = plt.subplots()&lt;br /&gt;
line, = ax.plot(x, u_xt[:, 0])&lt;br /&gt;
ax.set_xlim(0, L)&lt;br /&gt;
ax.set_ylim(-1.10, 1.10)&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
# Agregar un texto que muestre el instante de tiempo&lt;br /&gt;
time_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)&lt;br /&gt;
 &lt;br /&gt;
def update(frame):&lt;br /&gt;
    line.set_ydata(u_xt[:, frame])&lt;br /&gt;
    time_text.set_text(f't = {t[frame]:.2f}s')&lt;br /&gt;
    return line, time_text&lt;br /&gt;
 &lt;br /&gt;
ani = FuncAnimation(fig, update, frames=t_steps, blit=True)&lt;br /&gt;
 &lt;br /&gt;
# Guardar la animación como GIF&lt;br /&gt;
writer = PillowWriter(fps=20)&lt;br /&gt;
ani.save(&amp;quot;wave_equation.gif&amp;quot;, writer=writer)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La gráfica muestra la periodicidad en el tiempo de la solución &amp;lt;math&amp;gt;u(x,t) &amp;lt;/math&amp;gt;. La función claramente repite su patrón a medida que &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; varía, lo que confirma que la solución es periódica en el tiempo con un período de 2. Este período corresponde al término más lento &amp;lt;math&amp;gt; n=1 &amp;lt;/math&amp;gt;, ya que &amp;lt;math&amp;gt;\cos(\pi t)&amp;lt;/math&amp;gt; tiene un período de 2.&lt;br /&gt;
&lt;br /&gt;
La periodicidad observada es coherente con la naturaleza periódica de las funciones seno y coseno involucradas en la solución de la ecuación de la cuerda vibrante.&lt;br /&gt;
&lt;br /&gt;
==Onda en un solo sentido==&lt;br /&gt;
Veamos ahora lo que ocurre cuando estudiamos una onda que viaja en un solo sentido, es decir, &amp;lt;math&amp;gt; u(x, t) = f (x − t)&amp;lt;/math&amp;gt;. Que particularizaremos tomando como datos iniciales &amp;lt;math&amp;gt;u_0(x) = f(x)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u_1(x) = -f'(x)&amp;lt;/math&amp;gt;, con &amp;lt;math&amp;gt;f(x)=e^{-100(x-1/2)^2}&amp;lt;/math&amp;gt;. Por tanto el sistema con el que trabajamos es&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = u(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =e^{-100(x-1/2)^2} \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = 200(x-1/2)e^{-100(x-1/2)^2},&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Su solución viene dada mediante el método de separación de variables en términos de los coeficientes de Fourier:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_0^1 u_0(x) \sin(n \pi x) \, dx = 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n \pi} \int_0^1 u_1(x) \sin(n \pi x) \, dx =\frac{2}{n \pi} \int_0^1 (200(x-1/2)e^{-100(x-1/2)^2})\sin(n \pi x) \, dx&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo que la solución completa de la ecuación de ondas para la cuerda vibrante con las condiciones iniciales dadas es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty}[ ( 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx) \cos(n \pi t) + (\frac{2}{n \pi} \int_0^1 (200(x-1/2)e^{-100(x-1/2)^2})\sin(n \pi x) \, dx)\sin(n\pi t)] \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La representación gráfica de esta solución es:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:wave_equation_dirichlet.gif|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation, PillowWriter&lt;br /&gt;
 &lt;br /&gt;
# Definimos la función f(x)&lt;br /&gt;
def f(x):&lt;br /&gt;
    return np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
# Definimos la derivada de f(x)&lt;br /&gt;
def primef(x):&lt;br /&gt;
    return -200 * (x - 0.5) * np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1.0&lt;br /&gt;
c = 1.0  # Velocidad de propagación de las ondas&lt;br /&gt;
N = 300  # Número de puntos para el método del trapecio&lt;br /&gt;
x = np.linspace(0, L, N)&lt;br /&gt;
 &lt;br /&gt;
# Intervalo de tiempo y número de términos de Fourier&lt;br /&gt;
T = 2.0&lt;br /&gt;
n_terms = 50&lt;br /&gt;
 &lt;br /&gt;
# Resolución temporal&lt;br /&gt;
t_steps = 600&lt;br /&gt;
t = np.linspace(0, T, t_steps)&lt;br /&gt;
 &lt;br /&gt;
# Inicialización de u(x,t)&lt;br /&gt;
u_xt = np.zeros((N, t_steps))&lt;br /&gt;
 &lt;br /&gt;
# Calculamos la solución para cada tiempo t&lt;br /&gt;
for j, tj in enumerate(t):&lt;br /&gt;
    u_t = np.zeros_like(x)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        # Calculamos los coeficientes A_n y B_n&lt;br /&gt;
        integrand_f = f(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        A_n = 2 * np.trapz(integrand_f, x)&lt;br /&gt;
 &lt;br /&gt;
        integrand_g = primef(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        B_n = 2 / (n * np.pi * c) * np.trapz(integrand_g, x)&lt;br /&gt;
 &lt;br /&gt;
        # Suma de términos en la serie de Fourier&lt;br /&gt;
        u_t += (A_n * np.cos(n * np.pi * c * tj) + B_n * np.sin(n * np.pi * c * tj)) * np.sin(n * np.pi * x / L)&lt;br /&gt;
   &lt;br /&gt;
    u_xt[:, j] = u_t&lt;br /&gt;
 &lt;br /&gt;
# Configuración de la animación&lt;br /&gt;
fig, ax = plt.subplots()&lt;br /&gt;
line, = ax.plot(x, u_xt[:, 0])&lt;br /&gt;
ax.set_xlim(0, L)&lt;br /&gt;
ax.set_ylim(-1.10, 1.10)&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
# Agregar un texto que muestre el instante de tiempo&lt;br /&gt;
time_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)&lt;br /&gt;
 &lt;br /&gt;
def update(frame):&lt;br /&gt;
    line.set_ydata(u_xt[:, frame])&lt;br /&gt;
    time_text.set_text(f't = {t[frame]:.2f}s')&lt;br /&gt;
    return line, time_text&lt;br /&gt;
 &lt;br /&gt;
ani = FuncAnimation(fig, update, frames=t_steps, blit=True)&lt;br /&gt;
 &lt;br /&gt;
# Guardar la animación como GIF&lt;br /&gt;
writer = PillowWriter(fps=20)&lt;br /&gt;
ani.save(&amp;quot;wave_equation_dirichlet.gif&amp;quot;, writer=writer)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Cambio en condición frontera==&lt;br /&gt;
Para comprender la diferencia entre las condiciones de frontera Dirichlet y Neumann en la ecuación de ondas, repetiremos el análisis del apartado anterior, esta vez aplicando condiciones de Neumann. En lugar de fijar los valores de la función en los extremos (condiciones de Dirichlet), estableceremos que las derivadas parciales respecto a &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; en los extremos sean cero. Es decir, consideramos las condiciones &amp;lt;math&amp;gt; u_x(0,t)=u_x(1,t)=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
Por tanto nuestro nuevo problema es&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u_x(0, t) = u_x(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =e^{-100(x-1/2)^2} \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = 200(x-1/2)e^{-100(x-1/2)^2}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para resolver esta ecuación utilizando el método de Fourier, se expande la función &amp;lt;math&amp;gt; u(x,t) &amp;lt;/math&amp;gt; en una serie de Fourier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x,t) = \sum_{n=1}^{\infty} \left( A_n \cos(n\pi ct) + B_n \sin(n\pi ct) \right) \cos \left( \frac{n\pi x}{L} \right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; es la longitud de la cuerda y los coeficientes &amp;lt;math&amp;gt; A_n &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; B_n &amp;lt;/math&amp;gt; se calculan mediante integrales utilizando las funciones iniciales &amp;lt;math&amp;gt; f(x) &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; f'(x) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Estas funciones se utilizan para calcular los coeficientes \( A_n \) y \( B_n \), y luego se utilizan en la serie de Fourier para obtener la solución \( u(x,t) \).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_{0}^{L} f(x) \cos \left( \frac{n\pi x}{L} \right) \, dx&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n\pi c} \int_{0}^{L} f'(x) \cos \left( \frac{n\pi x}{L} \right) \, dx&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
La gran diferencia con la solución por serie de Fourier del apartado anterior, radica en la resolución del problema de autovalores para la variable x.&lt;br /&gt;
&lt;br /&gt;
Comenzamos buscando soluciones de la forma &amp;lt;math&amp;gt;U(x, t) = w(t) v(x)&amp;lt;/math&amp;gt; con &amp;lt;math&amp;gt;v(0) = v(L) = 0&amp;lt;/math&amp;gt;. Insertando &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; en la ecuación de onda, encontramos:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
0 = U_{tt} - c^2 U_{xx} = w''(t) v(x) - c^2 w(t) v''(x)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
O, separando las variables,&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{1}{c^2} \frac{w''(t)}{w(t)} = \frac{v''(x)}{v(x)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Es una identidad entre dos funciones, una dependiendo solo de &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; y la otra solo de &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;. Por lo tanto, ambos lados de la igualdad deben ser iguales a la misma constante, digamos &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;. Así, llegamos a la ecuación&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
w''(t) - \lambda c^2 w(t) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
y al problema de los autovalores&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v''(x) - \lambda v(x) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v'(0) = v'(L) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para la solución del problema de los autovalores. Hay tres posibilidades.&lt;br /&gt;
&lt;br /&gt;
# Si &amp;lt;math&amp;gt;\lambda = 0&amp;lt;/math&amp;gt;, entonces &amp;lt;math&amp;gt;v(x) = A + Bx&amp;lt;/math&amp;gt; esto implica &amp;lt;math&amp;gt;A = B = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Si &amp;lt;math&amp;gt;\lambda &amp;gt; 0&amp;lt;/math&amp;gt;, entonces &amp;lt;math&amp;gt;v(x) = Ae^{-\sqrt\lambda x} + Be^{\sqrt\lambda x}&amp;lt;/math&amp;gt; y nuevamente implica &amp;lt;math&amp;gt;A = B = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Si &amp;lt;math&amp;gt;\lambda &amp;lt; 0&amp;lt;/math&amp;gt;, entonces &amp;lt;math&amp;gt;v(x) = A \sin(\sqrt\lambda x) + B \cos(\sqrt\lambda x)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
De las condiciones obtenemos:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v'(0) = \sqrt\lambda A = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
por tanto &amp;lt;math&amp;gt;A =0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v'(1) = A\sqrt{\lambda}\cos(\sqrt{\lambda}) - B\sqrt{\lambda}\sin(\sqrt{\lambda}) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
de donde&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
B \text{ arbitrario}, A = 0, \lambda = \frac{m^2\pi^2}{L^2}, n = 1, 2, \ldots&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Por lo tanto, en el caso c) solo encontramos soluciones no triviales, de la forma&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
v_m(x) = B_n \cos(\lambda_n x), \quad \lambda_n = \frac{m^2\pi^2}{L^2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Particularizando a nuestros datos:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x,t) = \sum_{n=1}^{\infty} \left( A_n \cos(n\pi t) + B_n \sin(n\pi t) \right) \cos(n\pi x) \quad&lt;br /&gt;
&lt;br /&gt;
A_n = 2 \int_{0}^{1} f(x) \cos(n\pi x) \, dx \quad&lt;br /&gt;
&lt;br /&gt;
B_n = \frac{2}{n\pi} \int_{0}^{1} f'(x) \cos(n\pi x) \, dx&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas II=&lt;br /&gt;
En esta sección, abordaremos la resolución de la ecuación de ondas en dimensiones 1, 2 y 3, una tarea que nos permitirá explorar la solución fundamental y, a su vez, comprender el principio de Huygens.&lt;br /&gt;
&lt;br /&gt;
==Soluciones fundamentales para diferentes dimensiones==&lt;br /&gt;
Comenzamos estudiando la solución fundamental, que surge como respuesta a un impulso inicial localizado en \( x = 0 \). Formalmente, se define mediante límites y funciones características. El objetivo es observar y graficar las soluciones fundamentales en su forma radial para cada dimensión, lo que nos ayudará a comprender mejor la naturaleza de las ondas en diferentes entornos dimensionales.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 1===&lt;br /&gt;
La solución fundamental en dimensión 1, \( K_1(x, t) \), se define como:&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_1(x, t) = \frac{1}{2c} \left[ H(x + ct) - H(x - ct) \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde \( H(s) \) es la función de Heaviside, dada por:&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H(s) = \begin{cases}&lt;br /&gt;
0, &amp;amp; \text{si } s &amp;lt; 0 \\&lt;br /&gt;
1, &amp;amp; \text{si } s \geq 0&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dicha función, \( K_1(x, t) \), se compone de dos funciones de Heaviside desplazadas horizontalmente a lo largo del eje \( x \) en \( ct \) y \( -ct \) y luego divididas por \( 2c \). Esto significa que en el intervalo \( (-\infty, -ct) \), \( K_1(x, t) \) es 0, luego aumenta a 1 en el intervalo \( (-ct, ct) \), y finalmente vuelve a 0 en el intervalo \( (ct, \infty) \). La constante \( c \) controla la velocidad de propagación de la onda, que hemos exigido \(1\). Graficamos la función para tener una primera idea intuitiva de la solución fundamental:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli1.png|650px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
 def heaviside(x):&lt;br /&gt;
    return np.where(x &amp;gt;= 0, 1, 0)&lt;br /&gt;
 def fundamental_solution_1D(x, t, c):&lt;br /&gt;
    return (1 / (2 * c)) * (heaviside(x + c * t) - heaviside(x - c * t))&lt;br /&gt;
 # Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = [0.5, 1.0, 1.5]  # Valores de tiempo que queremos graficar&lt;br /&gt;
x_range = np.linspace(-5, 5, 100)&lt;br /&gt;
 # Graficamos las soluciones fundamentales en 1D, 2D y 3D para los diferentes valores de tiempo&lt;br /&gt;
fig, axes = plt.subplots(1, len(t_values), figsize=(15, 5))&lt;br /&gt;
 for i, t in enumerate(t_values):&lt;br /&gt;
    # Solución en 1D&lt;br /&gt;
    axes[i].plot(x_range, fundamental_solution_1D(x_range, t, c))&lt;br /&gt;
    axes[i].set_title(f'Solución Fundamental en 1D (t={t})')&lt;br /&gt;
    axes[i].set_xlabel('x')&lt;br /&gt;
    axes[i].set_ylabel('K(x, t)') &lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Visualmente, la gráfica de \( K_1(x, t) \) parece una función escalón, donde hay un cambio abrupto en el valor de la función en \( x = \pm ct \). Esto refleja la propagación de una onda con velocidad \( c \) a lo largo del eje \( x \).  Además, debido a que su valor depende únicamente de la distancia radial desde el origen, es decir, de la magnitud de \( x \), podemos decir que se trata de una función radial y, por tanto, graficarla de esta forma. En la expresión de \( K_1(x, t) \), la variable \( x \) aparece únicamente como \( x \pm ct \), lo que permite su reescritura como \( K_1(r, t) \), donde \( r = |x| \) es la distancia radial.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:fundamental_solution_1D.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation&lt;br /&gt;
def heaviside(x):&lt;br /&gt;
    return np.where(x &amp;gt;= 0, 1, 0)&lt;br /&gt;
def fundamental_solution_1D_radial(r, t, c):&lt;br /&gt;
    return (1 / (2 * c)) * (np.heaviside(r + c * t, 0) - np.heaviside(r - c * t, 0))&lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = np.arange(0, 5, 0.01)  # Valores de tiempo en incrementos de 0.01&lt;br /&gt;
r_values = np.linspace(0, 5, 500)&lt;br /&gt;
# Creamos una función para actualizar el gráfico en cada cuadro de la animación&lt;br /&gt;
def update(frame):&lt;br /&gt;
    plt.cla()  # Limpiamos el gráfico actual&lt;br /&gt;
    plt.plot(r_values, fundamental_solution_1D_radial(r_values, t_values[frame], c),color = 'blue')&lt;br /&gt;
    plt.title(f'Solución Fundamental en 1D - t={t_values[frame]}')&lt;br /&gt;
    plt.xlabel('r')&lt;br /&gt;
    plt.ylabel('K(r, t)')&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
# Creamos la animación&lt;br /&gt;
fig = plt.figure(figsize=(8, 6))&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(t_values), interval=50)&lt;br /&gt;
# Guardamos la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_1D.gif', writer='pillow', fps=30)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Al graficar \( K_1(r, t) \) como función de \( r \) para diferentes valores de \( t \), se observa que la forma de la curva es la misma independientemente de la dirección específica en la que nos movamos desde el origen, lo que confirma su carácter radial.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 2===&lt;br /&gt;
La solución fundamental en dimensión 2, \( K_2(x, t) \), se define como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_2(x, t) = \frac{1}{2\pi c \sqrt{c^2 t^2 - |x|^2}} \chi_{B(0,ct)}(x),&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
donde \(\chi_B(0,ct)(x)\) es la función característica de la bola de centro \(\ 0 \) y radio \(\ c \cdot t \). Esta función describe cómo una perturbación inicial, localizada en el centro de una bola de radio \( ct \), se propaga a lo largo del plano. La función característica \( \chi_{B(0, ct)}(x) \) asegura que la perturbación solo se propague dentro de esta bola. La presencia del término \( \frac{1}{c^2 t^2 - |x|^2} \) indica cómo la amplitud de la onda varía con la distancia desde el centro de la bola y el tiempo. Mostraremos gráficamente esta función para tener una primera idea intuitiva. Se mostrará un video que varía en función del tiempo:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli2.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import imageio&lt;br /&gt;
from io import BytesIO&lt;br /&gt;
def chi_B(r, ct):&lt;br /&gt;
    return np.where(r &amp;lt;= ct, 1, 0)&lt;br /&gt;
def fundamental_solution_2D(x, y, t, c, epsilon=0.01):&lt;br /&gt;
    r = np.sqrt(x ** 2 + y ** 2)&lt;br /&gt;
    discriminant = c ** 2 * t ** 2 - r ** 2&lt;br /&gt;
    solution = 1 / (epsilon + 2 * np.pi * c * np.sqrt(discriminant)) * chi_B(r, c * t)&lt;br /&gt;
    return np.where(discriminant &amp;gt; 0, np.minimum(solution, 1), 0)&lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
epsilon = 0.01&lt;br /&gt;
t_values = np.linspace(0.1, 5, 50)  # Valores de tiempo a animar&lt;br /&gt;
x = np.linspace(-5, 5, 1000)&lt;br /&gt;
y = np.linspace(-5, 5, 1000)&lt;br /&gt;
# Generamos los frames y los guardamos&lt;br /&gt;
frames = []&lt;br /&gt;
for t in t_values:&lt;br /&gt;
    fig, ax = plt.subplots(figsize=(8, 8))&lt;br /&gt;
    X, Y = np.meshgrid(x, y)&lt;br /&gt;
    Z = fundamental_solution_2D(X, Y, t, c, epsilon)&lt;br /&gt;
    ax.contourf(X, Y, Z, cmap='viridis') #Greys?&lt;br /&gt;
    ax.set_title(f'Solución Fundamental en 2D para t={t}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
    ax.grid(True)&lt;br /&gt;
    # Convertir la figura a una imagen numérica&lt;br /&gt;
    buf = BytesIO()&lt;br /&gt;
    fig.savefig(buf, format='png')&lt;br /&gt;
    buf.seek(0)&lt;br /&gt;
    frames.append(imageio.imread(buf))&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
# Guardamos los frames como un gif&lt;br /&gt;
imageio.mimsave('fundamental_solution_cartesiana_2D_2D.gif', frames, fps=10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Podemos notar que la ''circunferencia amarilla'' no es uniforme, sino que muestra irregularidades. Esto se debe a que la solución fundamental presenta discontinuidades cuando \(\left| x \right| \rightarrow t\). Para visualizar esto mejor, en lugar de mostrar solo el contorno de la solución, vamos a representarla en tres dimensiones:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli7.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import imageio&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
def chi_B(r, ct):&lt;br /&gt;
    return np.where(r &amp;lt;= ct, 1, 0) &lt;br /&gt;
def fundamental_solution_2D(x, y, t_values, c, epsilon=0.01):&lt;br /&gt;
    solutions = []&lt;br /&gt;
    for t in t_values:&lt;br /&gt;
        r = np.sqrt(x ** 2 + y ** 2)&lt;br /&gt;
        discriminant = c ** 2 * t ** 2 - r ** 2&lt;br /&gt;
        solution = 1 / (epsilon + 2 * np.pi * c * np.sqrt(discriminant)) * chi_B(r, c * t)&lt;br /&gt;
        solutions.append(np.where(discriminant &amp;gt; 0, np.minimum(solution, 1), 0))&lt;br /&gt;
    return solutions&lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
epsilon = 0.01&lt;br /&gt;
t_values = np.linspace(0.1, 5, 50)  # Valores de tiempo a animar&lt;br /&gt;
x = np.linspace(-5, 5, 1000)&lt;br /&gt;
y = np.linspace(-5, 5, 1000)&lt;br /&gt;
X, Y = np.meshgrid(x, y)&lt;br /&gt;
# Generamos las soluciones para cada valor de tiempo&lt;br /&gt;
solutions = fundamental_solution_2D(X, Y, t_values, c, epsilon)&lt;br /&gt;
# Creamos los frames&lt;br /&gt;
frames = []&lt;br /&gt;
for t, solution in zip(t_values, solutions):&lt;br /&gt;
    fig = plt.figure(figsize=(10, 8))&lt;br /&gt;
    ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
    ax.plot_surface(X, Y, solution, cmap='viridis')&lt;br /&gt;
    ax.set_title(f'Solución Fundamental en 2D para t={t:.2f}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
    ax.set_zlabel('K(x, y, t)')&lt;br /&gt;
    ax.set_zlim(0, 1)&lt;br /&gt;
    plt.tight_layout()&lt;br /&gt;
    fig.canvas.draw()  # Dibujamos la figura para actualizarla&lt;br /&gt;
    frame = np.array(fig.canvas.renderer._renderer)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
    frames.append(frame)&lt;br /&gt;
# Guardamos el GIF&lt;br /&gt;
imageio.mimsave('fundamental_solution_cartesiana_2D_3D.gif', frames, fps=10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es importante señalar que la discontinuidad no aparece de la misma manera en todos los ángulos, lo que podría sugerir que no es radial. Sin embargo, esta aparente discrepancia se debe a que estamos utilizando un mallado rectangular en lugar de uno polar en el código. A pesar de esto, podemos concluir que la función es claramente radial, lo que nos permite representar una sección transversal de la misma. En otras palabras, podemos visualizarla en función de la variable radial:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli3.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation&lt;br /&gt;
 &lt;br /&gt;
def chi_B(r, ct):&lt;br /&gt;
    return np.where(r &amp;lt;= ct, 1, 0)&lt;br /&gt;
 &lt;br /&gt;
def fundamental_solution_2D_radial(r, t, c, epsilon=0.01):&lt;br /&gt;
    discriminant = c ** 2 * t ** 2 - r ** 2&lt;br /&gt;
    solution = 1 / (epsilon + 2 * np.pi * c * np.sqrt(discriminant))* chi_B(r, c * t)&lt;br /&gt;
    return np.where(discriminant &amp;gt; 0, np.minimum(solution, 1), 0)&lt;br /&gt;
 &lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = np.arange(0, 5, 0.01)  # Valores de tiempo en incrementos de 0.01&lt;br /&gt;
r_values = np.linspace(0, 5, 500)&lt;br /&gt;
 &lt;br /&gt;
# Creamos una función para actualizar el gráfico en cada cuadro de la animación&lt;br /&gt;
def update(frame):&lt;br /&gt;
    plt.cla()  # Limpiamos el gráfico actual&lt;br /&gt;
    plt.plot(r_values, fundamental_solution_2D_radial(r_values, t_values[frame], c), color='blue')&lt;br /&gt;
    plt.ylim(0, 1.01)  # Ajustamos el eje y en el rango de 0 a 1&lt;br /&gt;
    plt.title(f'Solución Fundamental en 2D - t={t_values[frame]}')&lt;br /&gt;
    plt.xlabel('r')&lt;br /&gt;
    plt.ylabel('K(r, t)')&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
 &lt;br /&gt;
# Creamos la animación&lt;br /&gt;
fig = plt.figure(figsize=(8, 6))&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(t_values), interval=50)&lt;br /&gt;
 &lt;br /&gt;
# Guardamos la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_2D.gif', writer='pillow', fps=30)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observamos la presencia de una asíntota en \( K_2(x, t) \). Esta asíntota refleja cómo la amplitud de la onda se acerca a cero cuando el denominador se aproxima a cero. Sin embargo, a medida que el tiempo avanza y el radio \( |x| \) aumenta, la amplitud de la onda disminuye. Esta disminución en la amplitud se interpreta como una disminución en la intensidad o &amp;quot;altura&amp;quot; de la onda (del agua, por ejemplo) a medida que se propaga a través del espacio en dos dimensiones.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 3===&lt;br /&gt;
La solución fundamental en dimensión 2, \( K_3(x, t) \), se define como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_3(x, t) = \frac{\delta(|x| - ct)}{4\pi c|x|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde \( \delta(|x| - ct) \) representa la función delta de Dirac. Esta función modela cómo una perturbación inicial, localizada en un radio \( ct \) del origen, se propaga en el espacio tridimensional. La presencia de la función delta de Dirac garantiza que la perturbación solo se propague en un radio \( ct \) del origen. Comenzamos, como en los dos apartados anteriores, graficando la función. En este caso, no se puede representar en un mismo video cómo varía en función de \( x,y,z \) y \(t\) de manera clara. De modo que se ha optado por representar en un primer lugar un video de la relación entre  \( x,y,z \) fijando \( t=1 \):&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli4.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation &lt;br /&gt;
def dirac_approximation(s, k):&lt;br /&gt;
    return np.sqrt(k / (np.pi)) * np.exp(-k * s ** 2) &lt;br /&gt;
def fundamental_solution_3D(x, y, z, t, c, k=1000):&lt;br /&gt;
    r = np.sqrt(x ** 2 + y ** 2 + z ** 2)&lt;br /&gt;
    return dirac_approximation(r - c * t, k) / (4 * np.pi * c * r)&lt;br /&gt;
# Parámetros&lt;br /&gt;
t = 1.0&lt;br /&gt;
c = 1.0&lt;br /&gt;
k = 1000&lt;br /&gt;
x = np.linspace(-5, 5, 500)&lt;br /&gt;
y = np.linspace(-5, 5, 500)&lt;br /&gt;
X, Y = np.meshgrid(x, y)&lt;br /&gt;
# Valores de z&lt;br /&gt;
z_values = np.linspace(-1, 1, 50)&lt;br /&gt;
# Crear figura y ejes&lt;br /&gt;
fig, ax = plt.subplots(figsize=(8, 8)) &lt;br /&gt;
def update(frame):&lt;br /&gt;
    z = z_values[frame]&lt;br /&gt;
    ax.clear()&lt;br /&gt;
    Z = fundamental_solution_3D(X, Y, z, t, c, k)&lt;br /&gt;
    cset = ax.contourf(X, Y, Z, cmap='viridis')&lt;br /&gt;
    ax.set_title(f'z = {z:.2f}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(z_values), interval=100) &lt;br /&gt;
# Guardar la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_3D_corte_z.gif', writer='pillow', fps=10)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observamos que se trata de una sección de esfera hueca,  debido a la presencia de la función delta de Dirac en el numerador. ¿Qué pasa si fijamos \(z\) y variamos \(t\)?&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli5.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation &lt;br /&gt;
def dirac_approximation(s, k):&lt;br /&gt;
    return np.sqrt(k / (np.pi)) * np.exp(-k * s ** 2)&lt;br /&gt;
def fundamental_solution_3D(x, y, z, t, c, k=1000):&lt;br /&gt;
    r = np.sqrt(x ** 2 + y ** 2 + z ** 2)&lt;br /&gt;
    return dirac_approximation(r - c * t, k) / (4 * np.pi * c * r)&lt;br /&gt;
# Parámetros&lt;br /&gt;
z = 0&lt;br /&gt;
c = 1.0&lt;br /&gt;
k = 1000&lt;br /&gt;
x = np.linspace(-5, 5, 500)&lt;br /&gt;
y = np.linspace(-5, 5, 500)&lt;br /&gt;
X, Y = np.meshgrid(x, y) &lt;br /&gt;
# Valores de z&lt;br /&gt;
t_values = np.linspace(0, 5, 50) &lt;br /&gt;
# Crear figura y ejes&lt;br /&gt;
fig, ax = plt.subplots(figsize=(8, 8)) &lt;br /&gt;
def update(frame):&lt;br /&gt;
    t = t_values[frame]&lt;br /&gt;
    ax.clear()&lt;br /&gt;
    Z = fundamental_solution_3D(X, Y, z, t, c, k)&lt;br /&gt;
    cset = ax.contourf(X, Y, Z, cmap='viridis')&lt;br /&gt;
    ax.set_title(f't = {t:.2f}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(z_values), interval=100) &lt;br /&gt;
# Guardar la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_3D_dif_t.gif', writer='pillow', fps=10)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Obtenemos también una circunferencia que se va expandiendo con el tiempo. Uniendo ambas ideas podemos ver que en dimensión 3, la solución fundamental es una esfera hueca que con el tiempo va aumentando de radio y disminuyendo la intensidad del primer impulso.&lt;br /&gt;
&lt;br /&gt;
Claramente es una función que depende únicamente del radio, así pues, de manera análoga, la representamos en su variable radial.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli6.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation&lt;br /&gt;
 &lt;br /&gt;
def dirac_approximation(s, k):&lt;br /&gt;
    return (k / np.pi) ** 0.5 * np.exp(-k * s ** 2)&lt;br /&gt;
 &lt;br /&gt;
def fundamental_solution_3D_radial(r, t, c, k=1000):&lt;br /&gt;
    return dirac_approximation(r - c * t, k) / (4 * np.pi * c * r)&lt;br /&gt;
 &lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = np.arange(0, 5, 0.01)  # Valores de tiempo en incrementos de 0.01&lt;br /&gt;
r_values = np.linspace(0, 5, 500)&lt;br /&gt;
 &lt;br /&gt;
# Creamos una función para actualizar el gráfico en cada cuadro de la animación&lt;br /&gt;
def update(frame):&lt;br /&gt;
    plt.cla()  # Limpiamos el gráfico actual&lt;br /&gt;
    plt.plot(r_values, fundamental_solution_3D_radial(r_values, t_values[frame], c), color= 'blue')&lt;br /&gt;
    plt.ylim(0, 5)  # Ajustamos el eje y en el rango de 0 a 1&lt;br /&gt;
    plt.title(f'Solución Fundamental en 3D - t={t_values[frame]}')&lt;br /&gt;
    plt.xlabel('r')&lt;br /&gt;
    plt.ylabel('K(r, t)')&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
 &lt;br /&gt;
# Creamos la animación&lt;br /&gt;
fig = plt.figure(figsize=(8, 6))&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(t_values), interval=50)&lt;br /&gt;
 &lt;br /&gt;
# Guardamos la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_3D.gif', writer='pillow', fps=30)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este video puede intuir que un impulso solo es percibido por el individuo en el momento en que la esfera ''lo alcanza'', y con una intensidad que va disminuyendo. Esto es fundamental en la comprensión de la propagación de ondas, conocido como el principio de Huygens.&lt;br /&gt;
&lt;br /&gt;
== Solución fundamental del problema en dimensión 2==&lt;br /&gt;
En esta sección nos centraremos en resolver el siguiente problema de la ecuación de ondas en dos dimensiones:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;u_{tt} - c^2 \Delta u  = 0, &amp;amp; \quad x \in \mathbb{R}^2, \quad t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, \quad u_t(x,0) = h(x) = \chi_{B(0,\frac{1}{2})(x)}, &amp;amp; \quad x \in \mathbb{R}^2,&lt;br /&gt;
\end{align}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La solución se obtendrá mediante una convolución entre la solución fundamental, explicada en la sección anterior, y \(u_t(x,0)\). Es decir, la solución se calcula de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
 u(x,t) = \int_{\mathbb{R}^2} K_2(x-y, t) h(y) \, dy.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dado que hemos demostrado previamente que \(K_2(x, t)\) es radial, es evidente que \(K_2(x-y, t)\) también lo es. Además, consideremos \(h(x)=\chi_{B(0,\frac{1}{2})}(x)\), la función característica de una bola centrada en \(0\). Esta función también es radial. Por lo tanto, podemos simplificar nuestros cálculos y calcular la integral en coordenadas polares.&lt;br /&gt;
&lt;br /&gt;
Para resolver la integral de la función \( u(x,t) \) en coordenadas polares, primero necesitamos reformular la integral en términos de coordenadas polares, donde &amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{array}{ll}&lt;br /&gt;
x = (r_x \cos \theta_x, r_x \sin \theta_x) \\&lt;br /&gt;
y = (r_y \cos \theta_y, r_y \sin \theta_y)&lt;br /&gt;
\end{array}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
La integral se transforma usando el jacobiano de la transformación polar \( r \, dr \, d\theta \):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(r_x, \theta_x, t) = \int_0^{2\pi} \int_0^{\infty} K_2(r, t) h((r_y \cos \theta_y, r_y \sin \theta_y)) r \, dr \, d\theta, \, \text{donde} \, r = \sqrt{r_x^2 + r_y^2 - 2r_x r_y \cos(\theta_x-\theta_y)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podemos simplificar nuestros cálculos y calcular la integral para una sección transversal, es decir, fijando un ángulo. Esto se debe a que para cualquier ángulo diferente, la representación obtenida seguirá teniendo la misma forma.  Podemos exigir, por ejemplo \( \theta_x = 0\) y representar \(x=(r_x ,0)\). De modo, que mi nueva integral a calcular será:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(r_x, t) = \int_0^{2\pi} \int_0^{\infty} K_2(r, t) h((r_y \cos \theta_y, r_y \sin \theta_y)) r \, dr \, d\theta, \, \text{donde} \, r = \sqrt{r_x^2 + r_y^2 - 2r_x r_y \cos(\theta_y)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72538</id>
		<title>Ecuación de ondas. Grupo Eau De Parfum(EDP)</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72538"/>
				<updated>2024-05-25T18:18:41Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Solución fundamental en dimensión 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación de Ondas. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
&lt;br /&gt;
=Introducción=&lt;br /&gt;
&lt;br /&gt;
=Contexto histórico=&lt;br /&gt;
[[Archivo:alambert_edp.jpg|200px|thumb|right|Jean le Rond D'Alembert]]&lt;br /&gt;
La ecuación de onda es una ecuación diferencial en derivadas parciales lineal de segundo orden, crucial para describir la propagación de diversas ondas, como las ondas sonoras, las ondas de luz y las ondas en el agua. Su relevancia se extiende a múltiples campos, incluyendo la acústica, el electromagnetismo, la mecánica cuántica y la dinámica de fluidos. Históricamente, Jean le Rond d'Alembert fue el primero en estudiar el problema de una cuerda vibrante, como las utilizadas en instrumentos musicales, en 1746.&lt;br /&gt;
&lt;br /&gt;
=Conocimientos previos=&lt;br /&gt;
En esta sección se van a describir algunos conceptos a tener en cuenta durante todo el trabajo.&lt;br /&gt;
&lt;br /&gt;
-Principio de Huygens: Afirma que cada punto en un frente de onda actúa como una fuente de ondas secundarias que se propagan hacia adelante con la misma velocidad que la propia onda. Estas ondas secundarias se combinan para formar un nuevo frente de onda, que es tangente a todas las ondas secundarias. Es decir, cada punto del frente de onda original puede considerarse como un punto de partida para nuevas ondas que se mueven en la misma dirección que la perturbación inicial. Estas ondas secundarias tienen la misma velocidad y frecuencia que la onda original.&lt;br /&gt;
&lt;br /&gt;
Cabe destacar que vamos a utilizar [[Series de Fourier (Grupo Eau De Parfum (EDP))|Series de Furier]]&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas I=&lt;br /&gt;
Estamos considerando una cuerda vibrante que se extiende en el intervalo [0,1], con una densidad &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; y una tensión constante &amp;lt;math&amp;gt;\tau_0&amp;lt;/math&amp;gt;, lo que resulta en una velocidad de propagación &amp;lt;math&amp;gt;c=\frac{\tau_0}{d}=1&amp;lt;/math&amp;gt;. Además suponemos que la cuerda está fija en los extremos y llamamos &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt; a su posición e impulso iniciales respectivamente.&lt;br /&gt;
&lt;br /&gt;
El sistema de ecuaciones que modeliza el comportamiento de los desplazamientos transversales de la cuerda es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = u(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =u_0(x) \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = u_1(x),&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La solución general de la ecuación de ondas empleando separación de variables se puede expresar en términos de la serie de Fourier de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;. La solución tiene la forma&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty} [A_n \cos(n\pi t)+B_n \sin(n \pi t)]sin(n \pi x)  &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde los coeficientes &amp;lt;math&amp;gt;A_n&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;B_n&amp;lt;/math&amp;gt; se determinan a partir de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;.Por lo que la solución completa de a ecuación de ondas para la cuerda vibrante con las condiciones iniciales dadas es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty}[ (2\int_{0}^{1} u_0(x) \sin(n \pi x) dx) \cos(n \pi t) + (\frac{2}{n\pi} \int_{0}^{1} u_0(x) \sin(n \pi x) dx)\sin(n\pi t)] \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Cambiando datos iniciales==&lt;br /&gt;
Para resolver este problema, primero debemos calcular los coeficientes de Fourier &amp;lt;math&amp;gt; A_n &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; B_n &amp;lt;/math&amp;gt; usando los datos iniciales &amp;lt;math&amp;gt; u_0(x)=e^{-100(x-1/2)^2} &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; u_1(x)=0 &amp;lt;/math&amp;gt;. Luego, usaremos estos coeficientes para construir la solución aproximada &amp;lt;math&amp;gt; u(x,t) &amp;lt;/math&amp;gt; tomando los primeros 50 términos de la serie.&lt;br /&gt;
&lt;br /&gt;
Los coeficientes de Fourier son:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_0^1 u_0(x) \sin(n \pi x) \, dx = 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n \pi} \int_0^1 u_1(x) \sin(n \pi x) \, dx = 0 \quad (\text{porque } u_1(x) = 0).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo tanto, la solución se simplifica a:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x,t) = \sum_{n=1}^{50} A_n \cos(n \pi t) \sin(n \pi x)=\sum_{n=1}^{50}[2 \int_0^1 u_0(x) \sin(n \pi x) \, dx cos(n \pi t)] \sin(n \pi x) .&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedemos a representar la solución obteniendo:&lt;br /&gt;
[[Archivo:ejer3a_edp.png|500px|thumb|right|]]&lt;br /&gt;
[[Archivo:ejer3b_edp.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
 &lt;br /&gt;
# Definimos las funciones iniciales u0(x) y u1(x)&lt;br /&gt;
def u0(x):&lt;br /&gt;
    return np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
def u1(x):&lt;br /&gt;
    return np.zeros_like(x)&lt;br /&gt;
 &lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1.0&lt;br /&gt;
c = 1.0  # Velocidad de propagación de las ondas&lt;br /&gt;
N = 100  # Número de puntos para el método del trapecio&lt;br /&gt;
x = np.linspace(0, L, N)&lt;br /&gt;
 &lt;br /&gt;
# Intervalo de tiempo y número de términos de Fourier&lt;br /&gt;
T = 2.0&lt;br /&gt;
n_terms = 50&lt;br /&gt;
 &lt;br /&gt;
# Resolución temporal&lt;br /&gt;
t_steps = 200&lt;br /&gt;
t = np.linspace(0, T, t_steps)&lt;br /&gt;
 &lt;br /&gt;
# Inicialización de u(x,t)&lt;br /&gt;
u_xt = np.zeros((N, t_steps))&lt;br /&gt;
 &lt;br /&gt;
# Calculamos la solución para cada tiempo t&lt;br /&gt;
for j, tj in enumerate(t):&lt;br /&gt;
    u_t = np.zeros_like(x)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        # Calculamos los coeficientes A_n y B_n&lt;br /&gt;
        integrand_f = u0(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        A_n = 2 * np.trapz(integrand_f, x)&lt;br /&gt;
 &lt;br /&gt;
        integrand_g = u1(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        B_n = 2 / (n * np.pi * c) * np.trapz(integrand_g, x)&lt;br /&gt;
 &lt;br /&gt;
        # Suma de términos en la serie de Fourier&lt;br /&gt;
        u_t += (A_n * np.cos(n * np.pi * c * tj) + B_n * np.sin(n * np.pi * c * tj)) * np.sin(n * np.pi * x / L)&lt;br /&gt;
    u_xt[:, j] = u_t&lt;br /&gt;
 &lt;br /&gt;
# Graficamos la solución en diferentes tiempos&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
for j in range(0, t_steps, t_steps // 10):&lt;br /&gt;
    plt.plot(x, u_xt[:, j], label=f't={t[j]:.2f}')&lt;br /&gt;
 &lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('u(x,t)')&lt;br /&gt;
plt.title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
 &lt;br /&gt;
# Comprobamos la periodicidad en el tiempo&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
for i in range(0, N, N // 10):&lt;br /&gt;
    plt.plot(t, u_xt[i, :], label=f'x={x[i]:.2f}')&lt;br /&gt;
 &lt;br /&gt;
plt.xlabel('t')&lt;br /&gt;
plt.ylabel('u(x,t)')&lt;br /&gt;
plt.title('Periodicidad de la solución en el tiempo')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Representándolo en tres dimensiones obtenemos&lt;br /&gt;
[[Archivo:ejer3c_edp.png|350px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation, PillowWriter&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
# Graficamos la solución en 3D&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
 &lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
 &lt;br /&gt;
# Transponemos u_xt para que las dimensiones coincidan con las de X y T&lt;br /&gt;
ax.plot_surface(X, T, u_xt.T, cmap='viridis')&lt;br /&gt;
 &lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('t')&lt;br /&gt;
ax.set_zlabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Archivo:Wave_equation.gif|350px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Configuración de la animación&lt;br /&gt;
fig, ax = plt.subplots()&lt;br /&gt;
line, = ax.plot(x, u_xt[:, 0])&lt;br /&gt;
ax.set_xlim(0, L)&lt;br /&gt;
ax.set_ylim(-1.10, 1.10)&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
# Agregar un texto que muestre el instante de tiempo&lt;br /&gt;
time_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)&lt;br /&gt;
 &lt;br /&gt;
def update(frame):&lt;br /&gt;
    line.set_ydata(u_xt[:, frame])&lt;br /&gt;
    time_text.set_text(f't = {t[frame]:.2f}s')&lt;br /&gt;
    return line, time_text&lt;br /&gt;
 &lt;br /&gt;
ani = FuncAnimation(fig, update, frames=t_steps, blit=True)&lt;br /&gt;
 &lt;br /&gt;
# Guardar la animación como GIF&lt;br /&gt;
writer = PillowWriter(fps=20)&lt;br /&gt;
ani.save(&amp;quot;wave_equation.gif&amp;quot;, writer=writer)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La gráfica muestra la periodicidad en el tiempo de la solución &amp;lt;math&amp;gt;u(x,t) &amp;lt;/math&amp;gt;. La función claramente repite su patrón a medida que &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; varía, lo que confirma que la solución es periódica en el tiempo con un período de 2. Este período corresponde al término más lento &amp;lt;math&amp;gt; n=1 &amp;lt;/math&amp;gt;, ya que &amp;lt;math&amp;gt;\cos(\pi t)&amp;lt;/math&amp;gt; tiene un período de 2.&lt;br /&gt;
&lt;br /&gt;
La periodicidad observada es coherente con la naturaleza periódica de las funciones seno y coseno involucradas en la solución de la ecuación de la cuerda vibrante.&lt;br /&gt;
&lt;br /&gt;
==Onda en un solo sentido==&lt;br /&gt;
Veamos ahora lo que ocurre cuando estudiamos una onda que viaja en un solo sentido, es decir, &amp;lt;math&amp;gt; u(x, t) = f (x − t)&amp;lt;/math&amp;gt;. Que particularizaremos tomando como datos iniciales &amp;lt;math&amp;gt;u_0(x) = f(x)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u_1(x) = -f'(x)&amp;lt;/math&amp;gt;, con &amp;lt;math&amp;gt;f(x)=e^{-100(x-1/2)^2}&amp;lt;/math&amp;gt;. Por tanto el sistema con el que trabajamos es&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = u(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =e^{-100(x-1/2)^2} \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = 200(x-1/2)e^{-100(x-1/2)^2},&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Su solución viene dada mediante el método de separación de variables en términos de los coeficientes de Fourier:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_0^1 u_0(x) \sin(n \pi x) \, dx = 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n \pi} \int_0^1 u_1(x) \sin(n \pi x) \, dx =\frac{2}{n \pi} \int_0^1 (200(x-1/2)e^{-100(x-1/2)^2})\sin(n \pi x) \, dx&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo que la solución completa de la ecuación de ondas para la cuerda vibrante con las condiciones iniciales dadas es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty}[ ( 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx) \cos(n \pi t) + (\frac{2}{n \pi} \int_0^1 (200(x-1/2)e^{-100(x-1/2)^2})\sin(n \pi x) \, dx)\sin(n\pi t)] \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La representación gráfica de esta solución es:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:wave_equation_dirichlet.gif|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation, PillowWriter&lt;br /&gt;
 &lt;br /&gt;
# Definimos la función f(x)&lt;br /&gt;
def f(x):&lt;br /&gt;
    return np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
# Definimos la derivada de f(x)&lt;br /&gt;
def primef(x):&lt;br /&gt;
    return -200 * (x - 0.5) * np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1.0&lt;br /&gt;
c = 1.0  # Velocidad de propagación de las ondas&lt;br /&gt;
N = 300  # Número de puntos para el método del trapecio&lt;br /&gt;
x = np.linspace(0, L, N)&lt;br /&gt;
 &lt;br /&gt;
# Intervalo de tiempo y número de términos de Fourier&lt;br /&gt;
T = 2.0&lt;br /&gt;
n_terms = 50&lt;br /&gt;
 &lt;br /&gt;
# Resolución temporal&lt;br /&gt;
t_steps = 600&lt;br /&gt;
t = np.linspace(0, T, t_steps)&lt;br /&gt;
 &lt;br /&gt;
# Inicialización de u(x,t)&lt;br /&gt;
u_xt = np.zeros((N, t_steps))&lt;br /&gt;
 &lt;br /&gt;
# Calculamos la solución para cada tiempo t&lt;br /&gt;
for j, tj in enumerate(t):&lt;br /&gt;
    u_t = np.zeros_like(x)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        # Calculamos los coeficientes A_n y B_n&lt;br /&gt;
        integrand_f = f(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        A_n = 2 * np.trapz(integrand_f, x)&lt;br /&gt;
 &lt;br /&gt;
        integrand_g = primef(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        B_n = 2 / (n * np.pi * c) * np.trapz(integrand_g, x)&lt;br /&gt;
 &lt;br /&gt;
        # Suma de términos en la serie de Fourier&lt;br /&gt;
        u_t += (A_n * np.cos(n * np.pi * c * tj) + B_n * np.sin(n * np.pi * c * tj)) * np.sin(n * np.pi * x / L)&lt;br /&gt;
   &lt;br /&gt;
    u_xt[:, j] = u_t&lt;br /&gt;
 &lt;br /&gt;
# Configuración de la animación&lt;br /&gt;
fig, ax = plt.subplots()&lt;br /&gt;
line, = ax.plot(x, u_xt[:, 0])&lt;br /&gt;
ax.set_xlim(0, L)&lt;br /&gt;
ax.set_ylim(-1.10, 1.10)&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
# Agregar un texto que muestre el instante de tiempo&lt;br /&gt;
time_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)&lt;br /&gt;
 &lt;br /&gt;
def update(frame):&lt;br /&gt;
    line.set_ydata(u_xt[:, frame])&lt;br /&gt;
    time_text.set_text(f't = {t[frame]:.2f}s')&lt;br /&gt;
    return line, time_text&lt;br /&gt;
 &lt;br /&gt;
ani = FuncAnimation(fig, update, frames=t_steps, blit=True)&lt;br /&gt;
 &lt;br /&gt;
# Guardar la animación como GIF&lt;br /&gt;
writer = PillowWriter(fps=20)&lt;br /&gt;
ani.save(&amp;quot;wave_equation_dirichlet.gif&amp;quot;, writer=writer)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Cambio en condición frontera==&lt;br /&gt;
Para comprender la diferencia entre las condiciones de frontera Dirichlet y Neumann en la ecuación de ondas, repetiremos el análisis del apartado anterior, esta vez aplicando condiciones de Neumann. En lugar de fijar los valores de la función en los extremos (condiciones de Dirichlet), estableceremos que las derivadas parciales respecto a &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; en los extremos sean cero. Es decir, consideramos las condiciones &amp;lt;math&amp;gt; u_x(0,t)=u_x(1,t)=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
Por tanto nuestro nuevo problema es&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u_x(0, t) = u_x(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =e^{-100(x-1/2)^2} \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = 200(x-1/2)e^{-100(x-1/2)^2}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas II=&lt;br /&gt;
En esta sección, abordaremos la resolución de la ecuación de ondas en dimensiones 1, 2 y 3, una tarea que nos permitirá explorar la solución fundamental y, a su vez, comprender el principio de Huygens.&lt;br /&gt;
&lt;br /&gt;
==Soluciones fundamentales para diferentes dimensiones==&lt;br /&gt;
Comenzamos estudiando la solución fundamental, que surge como respuesta a un impulso inicial localizado en \( x = 0 \). Formalmente, se define mediante límites y funciones características. El objetivo es observar y graficar las soluciones fundamentales en su forma radial para cada dimensión, lo que nos ayudará a comprender mejor la naturaleza de las ondas en diferentes entornos dimensionales.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 1===&lt;br /&gt;
La solución fundamental en dimensión 1, \( K_1(x, t) \), se define como:&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_1(x, t) = \frac{1}{2c} \left[ H(x + ct) - H(x - ct) \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde \( H(s) \) es la función de Heaviside, dada por:&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H(s) = \begin{cases}&lt;br /&gt;
0, &amp;amp; \text{si } s &amp;lt; 0 \\&lt;br /&gt;
1, &amp;amp; \text{si } s \geq 0&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dicha función, \( K_1(x, t) \), se compone de dos funciones de Heaviside desplazadas horizontalmente a lo largo del eje \( x \) en \( ct \) y \( -ct \) y luego divididas por \( 2c \). Esto significa que en el intervalo \( (-\infty, -ct) \), \( K_1(x, t) \) es 0, luego aumenta a 1 en el intervalo \( (-ct, ct) \), y finalmente vuelve a 0 en el intervalo \( (ct, \infty) \). La constante \( c \) controla la velocidad de propagación de la onda, que hemos exigido \(1\). Graficamos la función para tener una primera idea intuitiva de la solución fundamental:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli1.png|650px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
 def heaviside(x):&lt;br /&gt;
    return np.where(x &amp;gt;= 0, 1, 0)&lt;br /&gt;
 def fundamental_solution_1D(x, t, c):&lt;br /&gt;
    return (1 / (2 * c)) * (heaviside(x + c * t) - heaviside(x - c * t))&lt;br /&gt;
 # Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = [0.5, 1.0, 1.5]  # Valores de tiempo que queremos graficar&lt;br /&gt;
x_range = np.linspace(-5, 5, 100)&lt;br /&gt;
 # Graficamos las soluciones fundamentales en 1D, 2D y 3D para los diferentes valores de tiempo&lt;br /&gt;
fig, axes = plt.subplots(1, len(t_values), figsize=(15, 5))&lt;br /&gt;
 for i, t in enumerate(t_values):&lt;br /&gt;
    # Solución en 1D&lt;br /&gt;
    axes[i].plot(x_range, fundamental_solution_1D(x_range, t, c))&lt;br /&gt;
    axes[i].set_title(f'Solución Fundamental en 1D (t={t})')&lt;br /&gt;
    axes[i].set_xlabel('x')&lt;br /&gt;
    axes[i].set_ylabel('K(x, t)') &lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Visualmente, la gráfica de \( K_1(x, t) \) parece una función escalón, donde hay un cambio abrupto en el valor de la función en \( x = \pm ct \). Esto refleja la propagación de una onda con velocidad \( c \) a lo largo del eje \( x \).  Además, debido a que su valor depende únicamente de la distancia radial desde el origen, es decir, de la magnitud de \( x \), podemos decir que se trata de una función radial y, por tanto, graficarla de esta forma. En la expresión de \( K_1(x, t) \), la variable \( x \) aparece únicamente como \( x \pm ct \), lo que permite su reescritura como \( K_1(r, t) \), donde \( r = |x| \) es la distancia radial.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:fundamental_solution_1D.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation&lt;br /&gt;
def heaviside(x):&lt;br /&gt;
    return np.where(x &amp;gt;= 0, 1, 0)&lt;br /&gt;
def fundamental_solution_1D_radial(r, t, c):&lt;br /&gt;
    return (1 / (2 * c)) * (np.heaviside(r + c * t, 0) - np.heaviside(r - c * t, 0))&lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = np.arange(0, 5, 0.01)  # Valores de tiempo en incrementos de 0.01&lt;br /&gt;
r_values = np.linspace(0, 5, 500)&lt;br /&gt;
# Creamos una función para actualizar el gráfico en cada cuadro de la animación&lt;br /&gt;
def update(frame):&lt;br /&gt;
    plt.cla()  # Limpiamos el gráfico actual&lt;br /&gt;
    plt.plot(r_values, fundamental_solution_1D_radial(r_values, t_values[frame], c),color = 'blue')&lt;br /&gt;
    plt.title(f'Solución Fundamental en 1D - t={t_values[frame]}')&lt;br /&gt;
    plt.xlabel('r')&lt;br /&gt;
    plt.ylabel('K(r, t)')&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
# Creamos la animación&lt;br /&gt;
fig = plt.figure(figsize=(8, 6))&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(t_values), interval=50)&lt;br /&gt;
# Guardamos la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_1D.gif', writer='pillow', fps=30)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Al graficar \( K_1(r, t) \) como función de \( r \) para diferentes valores de \( t \), se observa que la forma de la curva es la misma independientemente de la dirección específica en la que nos movamos desde el origen, lo que confirma su carácter radial.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 2===&lt;br /&gt;
La solución fundamental en dimensión 2, \( K_2(x, t) \), se define como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_2(x, t) = \frac{1}{2\pi c \sqrt{c^2 t^2 - |x|^2}} \chi_{B(0,ct)}(x),&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
donde \(\chi_B(0,ct)(x)\) es la función característica de la bola de centro \(\ 0 \) y radio \(\ c \cdot t \). Esta función describe cómo una perturbación inicial, localizada en el centro de una bola de radio \( ct \), se propaga a lo largo del plano. La función característica \( \chi_{B(0, ct)}(x) \) asegura que la perturbación solo se propague dentro de esta bola. La presencia del término \( \frac{1}{c^2 t^2 - |x|^2} \) indica cómo la amplitud de la onda varía con la distancia desde el centro de la bola y el tiempo. Mostraremos gráficamente esta función para tener una primera idea intuitiva. Se mostrará un video que varía en función del tiempo:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli2.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import imageio&lt;br /&gt;
from io import BytesIO&lt;br /&gt;
def chi_B(r, ct):&lt;br /&gt;
    return np.where(r &amp;lt;= ct, 1, 0)&lt;br /&gt;
def fundamental_solution_2D(x, y, t, c, epsilon=0.01):&lt;br /&gt;
    r = np.sqrt(x ** 2 + y ** 2)&lt;br /&gt;
    discriminant = c ** 2 * t ** 2 - r ** 2&lt;br /&gt;
    solution = 1 / (epsilon + 2 * np.pi * c * np.sqrt(discriminant)) * chi_B(r, c * t)&lt;br /&gt;
    return np.where(discriminant &amp;gt; 0, np.minimum(solution, 1), 0)&lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
epsilon = 0.01&lt;br /&gt;
t_values = np.linspace(0.1, 5, 50)  # Valores de tiempo a animar&lt;br /&gt;
x = np.linspace(-5, 5, 1000)&lt;br /&gt;
y = np.linspace(-5, 5, 1000)&lt;br /&gt;
# Generamos los frames y los guardamos&lt;br /&gt;
frames = []&lt;br /&gt;
for t in t_values:&lt;br /&gt;
    fig, ax = plt.subplots(figsize=(8, 8))&lt;br /&gt;
    X, Y = np.meshgrid(x, y)&lt;br /&gt;
    Z = fundamental_solution_2D(X, Y, t, c, epsilon)&lt;br /&gt;
    ax.contourf(X, Y, Z, cmap='viridis') #Greys?&lt;br /&gt;
    ax.set_title(f'Solución Fundamental en 2D para t={t}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
    ax.grid(True)&lt;br /&gt;
    # Convertir la figura a una imagen numérica&lt;br /&gt;
    buf = BytesIO()&lt;br /&gt;
    fig.savefig(buf, format='png')&lt;br /&gt;
    buf.seek(0)&lt;br /&gt;
    frames.append(imageio.imread(buf))&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
# Guardamos los frames como un gif&lt;br /&gt;
imageio.mimsave('fundamental_solution_cartesiana_2D_2D.gif', frames, fps=10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Podemos notar que la ''circunferencia amarilla'' no es uniforme, sino que muestra irregularidades. Esto se debe a que la solución fundamental presenta discontinuidades cuando \(\left| x \right| \rightarrow t\). Para visualizar esto mejor, en lugar de mostrar solo el contorno de la solución, vamos a representarla en tres dimensiones:&lt;br /&gt;
&lt;br /&gt;
[gif-código]&lt;br /&gt;
&lt;br /&gt;
Es importante señalar que la discontinuidad no aparece de la misma manera en todos los ángulos, lo que podría sugerir que no es radial. Sin embargo, esta aparente discrepancia se debe a que estamos utilizando un mallado rectangular en lugar de uno polar en el código. A pesar de esto, podemos concluir que la función es claramente radial, lo que nos permite representar una sección transversal de la misma. En otras palabras, podemos visualizarla en función de la variable radial:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli3.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation&lt;br /&gt;
 &lt;br /&gt;
def chi_B(r, ct):&lt;br /&gt;
    return np.where(r &amp;lt;= ct, 1, 0)&lt;br /&gt;
 &lt;br /&gt;
def fundamental_solution_2D_radial(r, t, c, epsilon=0.01):&lt;br /&gt;
    discriminant = c ** 2 * t ** 2 - r ** 2&lt;br /&gt;
    solution = 1 / (epsilon + 2 * np.pi * c * np.sqrt(discriminant))* chi_B(r, c * t)&lt;br /&gt;
    return np.where(discriminant &amp;gt; 0, np.minimum(solution, 1), 0)&lt;br /&gt;
 &lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = np.arange(0, 5, 0.01)  # Valores de tiempo en incrementos de 0.01&lt;br /&gt;
r_values = np.linspace(0, 5, 500)&lt;br /&gt;
 &lt;br /&gt;
# Creamos una función para actualizar el gráfico en cada cuadro de la animación&lt;br /&gt;
def update(frame):&lt;br /&gt;
    plt.cla()  # Limpiamos el gráfico actual&lt;br /&gt;
    plt.plot(r_values, fundamental_solution_2D_radial(r_values, t_values[frame], c), color='blue')&lt;br /&gt;
    plt.ylim(0, 1.01)  # Ajustamos el eje y en el rango de 0 a 1&lt;br /&gt;
    plt.title(f'Solución Fundamental en 2D - t={t_values[frame]}')&lt;br /&gt;
    plt.xlabel('r')&lt;br /&gt;
    plt.ylabel('K(r, t)')&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
 &lt;br /&gt;
# Creamos la animación&lt;br /&gt;
fig = plt.figure(figsize=(8, 6))&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(t_values), interval=50)&lt;br /&gt;
 &lt;br /&gt;
# Guardamos la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_2D.gif', writer='pillow', fps=30)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observamos la presencia de una asíntota en \( K_2(x, t) \). Esta asíntota refleja cómo la amplitud de la onda se acerca a cero cuando el denominador se aproxima a cero. Sin embargo, a medida que el tiempo avanza y el radio \( |x| \) aumenta, la amplitud de la onda disminuye. Esta disminución en la amplitud se interpreta como una disminución en la intensidad o &amp;quot;altura&amp;quot; de la onda (del agua, por ejemplo) a medida que se propaga a través del espacio en dos dimensiones.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 3===&lt;br /&gt;
La solución fundamental en dimensión 2, \( K_3(x, t) \), se define como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_3(x, t) = \frac{\delta(|x| - ct)}{4\pi c|x|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde \( \delta(|x| - ct) \) representa la función delta de Dirac. Esta función modela cómo una perturbación inicial, localizada en un radio \( ct \) del origen, se propaga en el espacio tridimensional. La presencia de la función delta de Dirac garantiza que la perturbación solo se propague en un radio \( ct \) del origen. Comenzamos, como en los dos apartados anteriores, graficando la función. En este caso, no se puede representar en un mismo video cómo varía en función de \( x,y,z \) y \(t\) de manera clara. De modo que se ha optado por representar en un primer lugar un video de la relación entre  \( x,y,z \) fijando \( t=1 \):&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli4.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation &lt;br /&gt;
def dirac_approximation(s, k):&lt;br /&gt;
    return np.sqrt(k / (np.pi)) * np.exp(-k * s ** 2) &lt;br /&gt;
def fundamental_solution_3D(x, y, z, t, c, k=1000):&lt;br /&gt;
    r = np.sqrt(x ** 2 + y ** 2 + z ** 2)&lt;br /&gt;
    return dirac_approximation(r - c * t, k) / (4 * np.pi * c * r)&lt;br /&gt;
# Parámetros&lt;br /&gt;
t = 1.0&lt;br /&gt;
c = 1.0&lt;br /&gt;
k = 1000&lt;br /&gt;
x = np.linspace(-5, 5, 500)&lt;br /&gt;
y = np.linspace(-5, 5, 500)&lt;br /&gt;
X, Y = np.meshgrid(x, y)&lt;br /&gt;
# Valores de z&lt;br /&gt;
z_values = np.linspace(-1, 1, 50)&lt;br /&gt;
# Crear figura y ejes&lt;br /&gt;
fig, ax = plt.subplots(figsize=(8, 8)) &lt;br /&gt;
def update(frame):&lt;br /&gt;
    z = z_values[frame]&lt;br /&gt;
    ax.clear()&lt;br /&gt;
    Z = fundamental_solution_3D(X, Y, z, t, c, k)&lt;br /&gt;
    cset = ax.contourf(X, Y, Z, cmap='viridis')&lt;br /&gt;
    ax.set_title(f'z = {z:.2f}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(z_values), interval=100) &lt;br /&gt;
# Guardar la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_3D_corte_z.gif', writer='pillow', fps=10)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observamos que se trata de una sección de esfera hueca,  debido a la presencia de la función delta de Dirac en el numerador. ¿Qué pasa si fijamos \(z\) y variamos \(t\)?&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli5.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation &lt;br /&gt;
def dirac_approximation(s, k):&lt;br /&gt;
    return np.sqrt(k / (np.pi)) * np.exp(-k * s ** 2)&lt;br /&gt;
def fundamental_solution_3D(x, y, z, t, c, k=1000):&lt;br /&gt;
    r = np.sqrt(x ** 2 + y ** 2 + z ** 2)&lt;br /&gt;
    return dirac_approximation(r - c * t, k) / (4 * np.pi * c * r)&lt;br /&gt;
# Parámetros&lt;br /&gt;
z = 0&lt;br /&gt;
c = 1.0&lt;br /&gt;
k = 1000&lt;br /&gt;
x = np.linspace(-5, 5, 500)&lt;br /&gt;
y = np.linspace(-5, 5, 500)&lt;br /&gt;
X, Y = np.meshgrid(x, y) &lt;br /&gt;
# Valores de z&lt;br /&gt;
t_values = np.linspace(0, 5, 50) &lt;br /&gt;
# Crear figura y ejes&lt;br /&gt;
fig, ax = plt.subplots(figsize=(8, 8)) &lt;br /&gt;
def update(frame):&lt;br /&gt;
    t = t_values[frame]&lt;br /&gt;
    ax.clear()&lt;br /&gt;
    Z = fundamental_solution_3D(X, Y, z, t, c, k)&lt;br /&gt;
    cset = ax.contourf(X, Y, Z, cmap='viridis')&lt;br /&gt;
    ax.set_title(f't = {t:.2f}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(z_values), interval=100) &lt;br /&gt;
# Guardar la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_3D_dif_t.gif', writer='pillow', fps=10)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Obtenemos también una circunferencia que se va expandiendo con el tiempo. Uniendo ambas ideas podemos ver que en dimensión 3, la solución fundamental es una esfera hueca que con el tiempo va aumentando de radio y disminuyendo la intensidad del primer impulso.&lt;br /&gt;
&lt;br /&gt;
Claramente es una función que depende únicamente del radio, así pues, de manera análoga, la representamos en su variable radial.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli6.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation&lt;br /&gt;
 &lt;br /&gt;
def dirac_approximation(s, k):&lt;br /&gt;
    return (k / np.pi) ** 0.5 * np.exp(-k * s ** 2)&lt;br /&gt;
 &lt;br /&gt;
def fundamental_solution_3D_radial(r, t, c, k=1000):&lt;br /&gt;
    return dirac_approximation(r - c * t, k) / (4 * np.pi * c * r)&lt;br /&gt;
 &lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = np.arange(0, 5, 0.01)  # Valores de tiempo en incrementos de 0.01&lt;br /&gt;
r_values = np.linspace(0, 5, 500)&lt;br /&gt;
 &lt;br /&gt;
# Creamos una función para actualizar el gráfico en cada cuadro de la animación&lt;br /&gt;
def update(frame):&lt;br /&gt;
    plt.cla()  # Limpiamos el gráfico actual&lt;br /&gt;
    plt.plot(r_values, fundamental_solution_3D_radial(r_values, t_values[frame], c), color= 'blue')&lt;br /&gt;
    plt.ylim(0, 5)  # Ajustamos el eje y en el rango de 0 a 1&lt;br /&gt;
    plt.title(f'Solución Fundamental en 3D - t={t_values[frame]}')&lt;br /&gt;
    plt.xlabel('r')&lt;br /&gt;
    plt.ylabel('K(r, t)')&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
 &lt;br /&gt;
# Creamos la animación&lt;br /&gt;
fig = plt.figure(figsize=(8, 6))&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(t_values), interval=50)&lt;br /&gt;
 &lt;br /&gt;
# Guardamos la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_3D.gif', writer='pillow', fps=30)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este video puede intuir que un impulso solo es percibido por el individuo en el momento en que la esfera ''lo alcanza'', y con una intensidad que va disminuyendo. Esto es fundamental en la comprensión de la propagación de ondas, conocido como el principio de Huygens.&lt;br /&gt;
&lt;br /&gt;
== Solución fundamental del problema en dimensión 2==&lt;br /&gt;
En esta sección nos centraremos en resolver el siguiente problema de la ecuación de ondas en dos dimensiones:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;u_{tt} - c^2 \Delta u  = 0, &amp;amp; \quad x \in \mathbb{R}^2, \quad t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, \quad u_t(x,0) = h(x) = \chi_{B(0,\frac{1}{2})(x)}, &amp;amp; \quad x \in \mathbb{R}^2,&lt;br /&gt;
\end{align}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La solución se obtendrá mediante una convolución entre la solución fundamental, explicada en la sección anterior, y \(u_t(x,0)\). Es decir, la solución se calcula de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
 u(x,t) = \int_{\mathbb{R}^2} K_2(x-y, t) h(y) \, dy.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dado que hemos demostrado previamente que \(K_2(x, t)\) es radial, es evidente que \(K_2(x-y, t)\) también lo es. Además, consideremos \(h(x)=\chi_{B(0,\frac{1}{2})}(x)\), la función característica de una bola centrada en \(0\). Esta función también es radial. Por lo tanto, podemos simplificar nuestros cálculos y calcular la integral en coordenadas polares.&lt;br /&gt;
&lt;br /&gt;
Para resolver la integral de la función \( u(x,t) \) en coordenadas polares, primero necesitamos reformular la integral en términos de coordenadas polares, donde &amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{array}{ll}&lt;br /&gt;
x = (r_x \cos \theta_x, r_x \sin \theta_x) \\&lt;br /&gt;
y = (r_y \cos \theta_y, r_y \sin \theta_y)&lt;br /&gt;
\end{array}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
La integral se transforma usando el jacobiano de la transformación polar \( r \, dr \, d\theta \):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(r_x, \theta_x, t) = \int_0^{2\pi} \int_0^{\infty} K_2(r, t, c) h(r_y \cos(\theta_y)) r \, dr \, d\theta, \, \text{donde} \, r = \sqrt{r_x^2 + r_y^2 - 2r_x r_y \cos(\theta_x-\theta_y)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podemos simplificar nuestros cálculos y calcular la integral para una sección transversal, es decir, fijando un ángulo. Esto se debe a que para cualquier ángulo diferente, la representación obtenida seguirá teniendo la misma forma.&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72537</id>
		<title>Ecuación de ondas. Grupo Eau De Parfum(EDP)</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72537"/>
				<updated>2024-05-25T18:05:19Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Solución fundamental del problema en dimensión 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación de Ondas. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
&lt;br /&gt;
=Introducción=&lt;br /&gt;
&lt;br /&gt;
=Contexto histórico=&lt;br /&gt;
[[Archivo:alambert_edp.jpg|200px|thumb|right|Jean le Rond D'Alembert]]&lt;br /&gt;
La ecuación de onda es una ecuación diferencial en derivadas parciales lineal de segundo orden, crucial para describir la propagación de diversas ondas, como las ondas sonoras, las ondas de luz y las ondas en el agua. Su relevancia se extiende a múltiples campos, incluyendo la acústica, el electromagnetismo, la mecánica cuántica y la dinámica de fluidos. Históricamente, Jean le Rond d'Alembert fue el primero en estudiar el problema de una cuerda vibrante, como las utilizadas en instrumentos musicales, en 1746.&lt;br /&gt;
&lt;br /&gt;
=Conocimientos previos=&lt;br /&gt;
En esta sección se van a describir algunos conceptos a tener en cuenta durante todo el trabajo.&lt;br /&gt;
&lt;br /&gt;
-Principio de Huygens: Afirma que cada punto en un frente de onda actúa como una fuente de ondas secundarias que se propagan hacia adelante con la misma velocidad que la propia onda. Estas ondas secundarias se combinan para formar un nuevo frente de onda, que es tangente a todas las ondas secundarias. Es decir, cada punto del frente de onda original puede considerarse como un punto de partida para nuevas ondas que se mueven en la misma dirección que la perturbación inicial. Estas ondas secundarias tienen la misma velocidad y frecuencia que la onda original.&lt;br /&gt;
&lt;br /&gt;
Cabe destacar que vamos a utilizar [[Series de Fourier (Grupo Eau De Parfum (EDP))|Series de Furier]]&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas I=&lt;br /&gt;
Estamos considerando una cuerda vibrante que se extiende en el intervalo [0,1], con una densidad &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; y una tensión constante &amp;lt;math&amp;gt;\tau_0&amp;lt;/math&amp;gt;, lo que resulta en una velocidad de propagación &amp;lt;math&amp;gt;c=\frac{\tau_0}{d}=1&amp;lt;/math&amp;gt;. Además suponemos que la cuerda está fija en los extremos y llamamos &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt; a su posición e impulso iniciales respectivamente.&lt;br /&gt;
&lt;br /&gt;
El sistema de ecuaciones que modeliza el comportamiento de los desplazamientos transversales de la cuerda es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = u(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =u_0(x) \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = u_1(x),&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La solución general de la ecuación de ondas empleando separación de variables se puede expresar en términos de la serie de Fourier de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;. La solución tiene la forma&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty} [A_n \cos(n\pi t)+B_n \sin(n \pi t)]sin(n \pi x)  &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde los coeficientes &amp;lt;math&amp;gt;A_n&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;B_n&amp;lt;/math&amp;gt; se determinan a partir de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;.Por lo que la solución completa de a ecuación de ondas para la cuerda vibrante con las condiciones iniciales dadas es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty}[ (2\int_{0}^{1} u_0(x) \sin(n \pi x) dx) \cos(n \pi t) + (\frac{2}{n\pi} \int_{0}^{1} u_0(x) \sin(n \pi x) dx)\sin(n\pi t)] \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Cambiando datos iniciales==&lt;br /&gt;
Para resolver este problema, primero debemos calcular los coeficientes de Fourier &amp;lt;math&amp;gt; A_n &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; B_n &amp;lt;/math&amp;gt; usando los datos iniciales &amp;lt;math&amp;gt; u_0(x)=e^{-100(x-1/2)^2} &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; u_1(x)=0 &amp;lt;/math&amp;gt;. Luego, usaremos estos coeficientes para construir la solución aproximada &amp;lt;math&amp;gt; u(x,t) &amp;lt;/math&amp;gt; tomando los primeros 50 términos de la serie.&lt;br /&gt;
&lt;br /&gt;
Los coeficientes de Fourier son:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_0^1 u_0(x) \sin(n \pi x) \, dx = 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n \pi} \int_0^1 u_1(x) \sin(n \pi x) \, dx = 0 \quad (\text{porque } u_1(x) = 0).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo tanto, la solución se simplifica a:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x,t) = \sum_{n=1}^{50} A_n \cos(n \pi t) \sin(n \pi x)=\sum_{n=1}^{50}[2 \int_0^1 u_0(x) \sin(n \pi x) \, dx cos(n \pi t)] \sin(n \pi x) .&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedemos a representar la solución obteniendo:&lt;br /&gt;
[[Archivo:ejer3a_edp.png|500px|thumb|right|]]&lt;br /&gt;
[[Archivo:ejer3b_edp.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
 &lt;br /&gt;
# Definimos las funciones iniciales u0(x) y u1(x)&lt;br /&gt;
def u0(x):&lt;br /&gt;
    return np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
def u1(x):&lt;br /&gt;
    return np.zeros_like(x)&lt;br /&gt;
 &lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1.0&lt;br /&gt;
c = 1.0  # Velocidad de propagación de las ondas&lt;br /&gt;
N = 100  # Número de puntos para el método del trapecio&lt;br /&gt;
x = np.linspace(0, L, N)&lt;br /&gt;
 &lt;br /&gt;
# Intervalo de tiempo y número de términos de Fourier&lt;br /&gt;
T = 2.0&lt;br /&gt;
n_terms = 50&lt;br /&gt;
 &lt;br /&gt;
# Resolución temporal&lt;br /&gt;
t_steps = 200&lt;br /&gt;
t = np.linspace(0, T, t_steps)&lt;br /&gt;
 &lt;br /&gt;
# Inicialización de u(x,t)&lt;br /&gt;
u_xt = np.zeros((N, t_steps))&lt;br /&gt;
 &lt;br /&gt;
# Calculamos la solución para cada tiempo t&lt;br /&gt;
for j, tj in enumerate(t):&lt;br /&gt;
    u_t = np.zeros_like(x)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        # Calculamos los coeficientes A_n y B_n&lt;br /&gt;
        integrand_f = u0(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        A_n = 2 * np.trapz(integrand_f, x)&lt;br /&gt;
 &lt;br /&gt;
        integrand_g = u1(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        B_n = 2 / (n * np.pi * c) * np.trapz(integrand_g, x)&lt;br /&gt;
 &lt;br /&gt;
        # Suma de términos en la serie de Fourier&lt;br /&gt;
        u_t += (A_n * np.cos(n * np.pi * c * tj) + B_n * np.sin(n * np.pi * c * tj)) * np.sin(n * np.pi * x / L)&lt;br /&gt;
    u_xt[:, j] = u_t&lt;br /&gt;
 &lt;br /&gt;
# Graficamos la solución en diferentes tiempos&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
for j in range(0, t_steps, t_steps // 10):&lt;br /&gt;
    plt.plot(x, u_xt[:, j], label=f't={t[j]:.2f}')&lt;br /&gt;
 &lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('u(x,t)')&lt;br /&gt;
plt.title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
 &lt;br /&gt;
# Comprobamos la periodicidad en el tiempo&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
for i in range(0, N, N // 10):&lt;br /&gt;
    plt.plot(t, u_xt[i, :], label=f'x={x[i]:.2f}')&lt;br /&gt;
 &lt;br /&gt;
plt.xlabel('t')&lt;br /&gt;
plt.ylabel('u(x,t)')&lt;br /&gt;
plt.title('Periodicidad de la solución en el tiempo')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Representándolo en tres dimensiones obtenemos&lt;br /&gt;
[[Archivo:ejer3c_edp.png|350px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation, PillowWriter&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
# Graficamos la solución en 3D&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
 &lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
 &lt;br /&gt;
# Transponemos u_xt para que las dimensiones coincidan con las de X y T&lt;br /&gt;
ax.plot_surface(X, T, u_xt.T, cmap='viridis')&lt;br /&gt;
 &lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('t')&lt;br /&gt;
ax.set_zlabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Archivo:Wave_equation.gif|350px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Configuración de la animación&lt;br /&gt;
fig, ax = plt.subplots()&lt;br /&gt;
line, = ax.plot(x, u_xt[:, 0])&lt;br /&gt;
ax.set_xlim(0, L)&lt;br /&gt;
ax.set_ylim(-1.10, 1.10)&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
# Agregar un texto que muestre el instante de tiempo&lt;br /&gt;
time_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)&lt;br /&gt;
 &lt;br /&gt;
def update(frame):&lt;br /&gt;
    line.set_ydata(u_xt[:, frame])&lt;br /&gt;
    time_text.set_text(f't = {t[frame]:.2f}s')&lt;br /&gt;
    return line, time_text&lt;br /&gt;
 &lt;br /&gt;
ani = FuncAnimation(fig, update, frames=t_steps, blit=True)&lt;br /&gt;
 &lt;br /&gt;
# Guardar la animación como GIF&lt;br /&gt;
writer = PillowWriter(fps=20)&lt;br /&gt;
ani.save(&amp;quot;wave_equation.gif&amp;quot;, writer=writer)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La gráfica muestra la periodicidad en el tiempo de la solución &amp;lt;math&amp;gt;u(x,t) &amp;lt;/math&amp;gt;. La función claramente repite su patrón a medida que &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; varía, lo que confirma que la solución es periódica en el tiempo con un período de 2. Este período corresponde al término más lento &amp;lt;math&amp;gt; n=1 &amp;lt;/math&amp;gt;, ya que &amp;lt;math&amp;gt;\cos(\pi t)&amp;lt;/math&amp;gt; tiene un período de 2.&lt;br /&gt;
&lt;br /&gt;
La periodicidad observada es coherente con la naturaleza periódica de las funciones seno y coseno involucradas en la solución de la ecuación de la cuerda vibrante.&lt;br /&gt;
&lt;br /&gt;
==Onda en un solo sentido==&lt;br /&gt;
Veamos ahora lo que ocurre cuando estudiamos una onda que viaja en un solo sentido, es decir, &amp;lt;math&amp;gt; u(x, t) = f (x − t)&amp;lt;/math&amp;gt;. Que particularizaremos tomando como datos iniciales &amp;lt;math&amp;gt;u_0(x) = f(x)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u_1(x) = -f'(x)&amp;lt;/math&amp;gt;, con &amp;lt;math&amp;gt;f(x)=e^{-100(x-1/2)^2}&amp;lt;/math&amp;gt;. Por tanto el sistema con el que trabajamos es&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = u(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =e^{-100(x-1/2)^2} \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = 200(x-1/2)e^{-100(x-1/2)^2},&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Su solución viene dada mediante el método de separación de variables en términos de los coeficientes de Fourier:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_0^1 u_0(x) \sin(n \pi x) \, dx = 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n \pi} \int_0^1 u_1(x) \sin(n \pi x) \, dx =\frac{2}{n \pi} \int_0^1 (200(x-1/2)e^{-100(x-1/2)^2})\sin(n \pi x) \, dx&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo que la solución completa de la ecuación de ondas para la cuerda vibrante con las condiciones iniciales dadas es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty}[ ( 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx) \cos(n \pi t) + (\frac{2}{n \pi} \int_0^1 (200(x-1/2)e^{-100(x-1/2)^2})\sin(n \pi x) \, dx)\sin(n\pi t)] \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La representación gráfica de esta solución es:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:wave_equation_dirichlet.gif|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation, PillowWriter&lt;br /&gt;
 &lt;br /&gt;
# Definimos la función f(x)&lt;br /&gt;
def f(x):&lt;br /&gt;
    return np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
# Definimos la derivada de f(x)&lt;br /&gt;
def primef(x):&lt;br /&gt;
    return -200 * (x - 0.5) * np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1.0&lt;br /&gt;
c = 1.0  # Velocidad de propagación de las ondas&lt;br /&gt;
N = 300  # Número de puntos para el método del trapecio&lt;br /&gt;
x = np.linspace(0, L, N)&lt;br /&gt;
 &lt;br /&gt;
# Intervalo de tiempo y número de términos de Fourier&lt;br /&gt;
T = 2.0&lt;br /&gt;
n_terms = 50&lt;br /&gt;
 &lt;br /&gt;
# Resolución temporal&lt;br /&gt;
t_steps = 600&lt;br /&gt;
t = np.linspace(0, T, t_steps)&lt;br /&gt;
 &lt;br /&gt;
# Inicialización de u(x,t)&lt;br /&gt;
u_xt = np.zeros((N, t_steps))&lt;br /&gt;
 &lt;br /&gt;
# Calculamos la solución para cada tiempo t&lt;br /&gt;
for j, tj in enumerate(t):&lt;br /&gt;
    u_t = np.zeros_like(x)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        # Calculamos los coeficientes A_n y B_n&lt;br /&gt;
        integrand_f = f(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        A_n = 2 * np.trapz(integrand_f, x)&lt;br /&gt;
 &lt;br /&gt;
        integrand_g = primef(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        B_n = 2 / (n * np.pi * c) * np.trapz(integrand_g, x)&lt;br /&gt;
 &lt;br /&gt;
        # Suma de términos en la serie de Fourier&lt;br /&gt;
        u_t += (A_n * np.cos(n * np.pi * c * tj) + B_n * np.sin(n * np.pi * c * tj)) * np.sin(n * np.pi * x / L)&lt;br /&gt;
   &lt;br /&gt;
    u_xt[:, j] = u_t&lt;br /&gt;
 &lt;br /&gt;
# Configuración de la animación&lt;br /&gt;
fig, ax = plt.subplots()&lt;br /&gt;
line, = ax.plot(x, u_xt[:, 0])&lt;br /&gt;
ax.set_xlim(0, L)&lt;br /&gt;
ax.set_ylim(-1.10, 1.10)&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
# Agregar un texto que muestre el instante de tiempo&lt;br /&gt;
time_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)&lt;br /&gt;
 &lt;br /&gt;
def update(frame):&lt;br /&gt;
    line.set_ydata(u_xt[:, frame])&lt;br /&gt;
    time_text.set_text(f't = {t[frame]:.2f}s')&lt;br /&gt;
    return line, time_text&lt;br /&gt;
 &lt;br /&gt;
ani = FuncAnimation(fig, update, frames=t_steps, blit=True)&lt;br /&gt;
 &lt;br /&gt;
# Guardar la animación como GIF&lt;br /&gt;
writer = PillowWriter(fps=20)&lt;br /&gt;
ani.save(&amp;quot;wave_equation_dirichlet.gif&amp;quot;, writer=writer)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Cambio en condición frontera==&lt;br /&gt;
Para comprender la diferencia entre las condiciones de frontera Dirichlet y Neumann en la ecuación de ondas, repetiremos el análisis del apartado anterior, esta vez aplicando condiciones de Neumann. En lugar de fijar los valores de la función en los extremos (condiciones de Dirichlet), estableceremos que las derivadas parciales respecto a &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; en los extremos sean cero. Es decir, consideramos las condiciones &amp;lt;math&amp;gt; u_x(0,t)=u_x(1,t)=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
Por tanto nuestro nuevo problema es&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u_x(0, t) = u_x(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =e^{-100(x-1/2)^2} \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = 200(x-1/2)e^{-100(x-1/2)^2}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas II=&lt;br /&gt;
En esta sección, abordaremos la resolución de la ecuación de ondas en dimensiones 1, 2 y 3, una tarea que nos permitirá explorar la solución fundamental y, a su vez, comprender el principio de Huygens.&lt;br /&gt;
&lt;br /&gt;
==Soluciones fundamentales para diferentes dimensiones==&lt;br /&gt;
Comenzamos estudiando la solución fundamental, que surge como respuesta a un impulso inicial localizado en \( x = 0 \). Formalmente, se define mediante límites y funciones características. El objetivo es observar y graficar las soluciones fundamentales en su forma radial para cada dimensión, lo que nos ayudará a comprender mejor la naturaleza de las ondas en diferentes entornos dimensionales.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 1===&lt;br /&gt;
La solución fundamental en dimensión 1, \( K_1(x, t) \), se define como:&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_1(x, t) = \frac{1}{2c} \left[ H(x + ct) - H(x - ct) \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde \( H(s) \) es la función de Heaviside, dada por:&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H(s) = \begin{cases}&lt;br /&gt;
0, &amp;amp; \text{si } s &amp;lt; 0 \\&lt;br /&gt;
1, &amp;amp; \text{si } s \geq 0&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dicha función, \( K_1(x, t) \), se compone de dos funciones de Heaviside desplazadas horizontalmente a lo largo del eje \( x \) en \( ct \) y \( -ct \) y luego divididas por \( 2c \). Esto significa que en el intervalo \( (-\infty, -ct) \), \( K_1(x, t) \) es 0, luego aumenta a 1 en el intervalo \( (-ct, ct) \), y finalmente vuelve a 0 en el intervalo \( (ct, \infty) \). La constante \( c \) controla la velocidad de propagación de la onda, que hemos exigido \(1\). Graficamos la función para tener una primera idea intuitiva de la solución fundamental:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli1.png|650px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
 def heaviside(x):&lt;br /&gt;
    return np.where(x &amp;gt;= 0, 1, 0)&lt;br /&gt;
 def fundamental_solution_1D(x, t, c):&lt;br /&gt;
    return (1 / (2 * c)) * (heaviside(x + c * t) - heaviside(x - c * t))&lt;br /&gt;
 # Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = [0.5, 1.0, 1.5]  # Valores de tiempo que queremos graficar&lt;br /&gt;
x_range = np.linspace(-5, 5, 100)&lt;br /&gt;
 # Graficamos las soluciones fundamentales en 1D, 2D y 3D para los diferentes valores de tiempo&lt;br /&gt;
fig, axes = plt.subplots(1, len(t_values), figsize=(15, 5))&lt;br /&gt;
 for i, t in enumerate(t_values):&lt;br /&gt;
    # Solución en 1D&lt;br /&gt;
    axes[i].plot(x_range, fundamental_solution_1D(x_range, t, c))&lt;br /&gt;
    axes[i].set_title(f'Solución Fundamental en 1D (t={t})')&lt;br /&gt;
    axes[i].set_xlabel('x')&lt;br /&gt;
    axes[i].set_ylabel('K(x, t)') &lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Visualmente, la gráfica de \( K_1(x, t) \) parece una función escalón, donde hay un cambio abrupto en el valor de la función en \( x = \pm ct \). Esto refleja la propagación de una onda con velocidad \( c \) a lo largo del eje \( x \).  Además, debido a que su valor depende únicamente de la distancia radial desde el origen, es decir, de la magnitud de \( x \), podemos decir que se trata de una función radial y, por tanto, graficarla de esta forma. En la expresión de \( K_1(x, t) \), la variable \( x \) aparece únicamente como \( x \pm ct \), lo que permite su reescritura como \( K_1(r, t) \), donde \( r = |x| \) es la distancia radial.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:fundamental_solution_1D.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation&lt;br /&gt;
def heaviside(x):&lt;br /&gt;
    return np.where(x &amp;gt;= 0, 1, 0)&lt;br /&gt;
def fundamental_solution_1D_radial(r, t, c):&lt;br /&gt;
    return (1 / (2 * c)) * (np.heaviside(r + c * t, 0) - np.heaviside(r - c * t, 0))&lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = np.arange(0, 5, 0.01)  # Valores de tiempo en incrementos de 0.01&lt;br /&gt;
r_values = np.linspace(0, 5, 500)&lt;br /&gt;
# Creamos una función para actualizar el gráfico en cada cuadro de la animación&lt;br /&gt;
def update(frame):&lt;br /&gt;
    plt.cla()  # Limpiamos el gráfico actual&lt;br /&gt;
    plt.plot(r_values, fundamental_solution_1D_radial(r_values, t_values[frame], c),color = 'blue')&lt;br /&gt;
    plt.title(f'Solución Fundamental en 1D - t={t_values[frame]}')&lt;br /&gt;
    plt.xlabel('r')&lt;br /&gt;
    plt.ylabel('K(r, t)')&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
# Creamos la animación&lt;br /&gt;
fig = plt.figure(figsize=(8, 6))&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(t_values), interval=50)&lt;br /&gt;
# Guardamos la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_1D.gif', writer='pillow', fps=30)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Al graficar \( K_1(r, t) \) como función de \( r \) para diferentes valores de \( t \), se observa que la forma de la curva es la misma independientemente de la dirección específica en la que nos movamos desde el origen, lo que confirma su carácter radial.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 2===&lt;br /&gt;
La solución fundamental en dimensión 2, \( K_2(x, t) \), se define como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_2(x, t) = \frac{1}{2\pi c \sqrt{c^2 t^2 - |x|^2}} \chi_{B(0,ct)}(x),&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
donde \(\chi_B(0,ct)(x)\) es la función característica de la bola de centro \(\ 0 \) y radio \(\ c \cdot t \). Esta función describe cómo una perturbación inicial, localizada en el centro de una bola de radio \( ct \), se propaga a lo largo del plano. La función característica \( \chi_{B(0, ct)}(x) \) asegura que la perturbación solo se propague dentro de esta bola. La presencia del término \( \frac{1}{c^2 t^2 - |x|^2} \) indica cómo la amplitud de la onda varía con la distancia desde el centro de la bola y el tiempo. Mostraremos gráficamente esta función para tener una primera idea intuitiva. Se mostrará un video que varía en función del tiempo:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli2.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import imageio&lt;br /&gt;
from io import BytesIO&lt;br /&gt;
def chi_B(r, ct):&lt;br /&gt;
    return np.where(r &amp;lt;= ct, 1, 0)&lt;br /&gt;
def fundamental_solution_2D(x, y, t, c, epsilon=0.01):&lt;br /&gt;
    r = np.sqrt(x ** 2 + y ** 2)&lt;br /&gt;
    discriminant = c ** 2 * t ** 2 - r ** 2&lt;br /&gt;
    solution = 1 / (epsilon + 2 * np.pi * c * np.sqrt(discriminant)) * chi_B(r, c * t)&lt;br /&gt;
    return np.where(discriminant &amp;gt; 0, np.minimum(solution, 1), 0)&lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
epsilon = 0.01&lt;br /&gt;
t_values = np.linspace(0.1, 5, 50)  # Valores de tiempo a animar&lt;br /&gt;
x = np.linspace(-5, 5, 1000)&lt;br /&gt;
y = np.linspace(-5, 5, 1000)&lt;br /&gt;
# Generamos los frames y los guardamos&lt;br /&gt;
frames = []&lt;br /&gt;
for t in t_values:&lt;br /&gt;
    fig, ax = plt.subplots(figsize=(8, 8))&lt;br /&gt;
    X, Y = np.meshgrid(x, y)&lt;br /&gt;
    Z = fundamental_solution_2D(X, Y, t, c, epsilon)&lt;br /&gt;
    ax.contourf(X, Y, Z, cmap='viridis') #Greys?&lt;br /&gt;
    ax.set_title(f'Solución Fundamental en 2D para t={t}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
    ax.grid(True)&lt;br /&gt;
    # Convertir la figura a una imagen numérica&lt;br /&gt;
    buf = BytesIO()&lt;br /&gt;
    fig.savefig(buf, format='png')&lt;br /&gt;
    buf.seek(0)&lt;br /&gt;
    frames.append(imageio.imread(buf))&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
# Guardamos los frames como un gif&lt;br /&gt;
imageio.mimsave('fundamental_solution_cartesiana_2D_2D.gif', frames, fps=10)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Claramente se trata de una función radial, de manera que podemos representar una sección transversal de la función. Esto es, representarla en la variable radial:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli3.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation&lt;br /&gt;
 &lt;br /&gt;
def chi_B(r, ct):&lt;br /&gt;
    return np.where(r &amp;lt;= ct, 1, 0)&lt;br /&gt;
 &lt;br /&gt;
def fundamental_solution_2D_radial(r, t, c, epsilon=0.01):&lt;br /&gt;
    discriminant = c ** 2 * t ** 2 - r ** 2&lt;br /&gt;
    solution = 1 / (epsilon + 2 * np.pi * c * np.sqrt(discriminant))* chi_B(r, c * t)&lt;br /&gt;
    return np.where(discriminant &amp;gt; 0, np.minimum(solution, 1), 0)&lt;br /&gt;
 &lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = np.arange(0, 5, 0.01)  # Valores de tiempo en incrementos de 0.01&lt;br /&gt;
r_values = np.linspace(0, 5, 500)&lt;br /&gt;
 &lt;br /&gt;
# Creamos una función para actualizar el gráfico en cada cuadro de la animación&lt;br /&gt;
def update(frame):&lt;br /&gt;
    plt.cla()  # Limpiamos el gráfico actual&lt;br /&gt;
    plt.plot(r_values, fundamental_solution_2D_radial(r_values, t_values[frame], c), color='blue')&lt;br /&gt;
    plt.ylim(0, 1.01)  # Ajustamos el eje y en el rango de 0 a 1&lt;br /&gt;
    plt.title(f'Solución Fundamental en 2D - t={t_values[frame]}')&lt;br /&gt;
    plt.xlabel('r')&lt;br /&gt;
    plt.ylabel('K(r, t)')&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
 &lt;br /&gt;
# Creamos la animación&lt;br /&gt;
fig = plt.figure(figsize=(8, 6))&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(t_values), interval=50)&lt;br /&gt;
 &lt;br /&gt;
# Guardamos la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_2D.gif', writer='pillow', fps=30)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observamos la presencia de una asíntota en \( K_2(x, t) \). Esta asíntota refleja cómo la amplitud de la onda se acerca a cero cuando el denominador se aproxima a cero. Sin embargo, a medida que el tiempo avanza y el radio \( |x| \) aumenta, la amplitud de la onda disminuye. Esta disminución en la amplitud se interpreta como una disminución en la intensidad o &amp;quot;altura&amp;quot; de la onda (del agua, por ejemplo) a medida que se propaga a través del espacio en dos dimensiones.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 3===&lt;br /&gt;
La solución fundamental en dimensión 2, \( K_3(x, t) \), se define como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_3(x, t) = \frac{\delta(|x| - ct)}{4\pi c|x|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde \( \delta(|x| - ct) \) representa la función delta de Dirac. Esta función modela cómo una perturbación inicial, localizada en un radio \( ct \) del origen, se propaga en el espacio tridimensional. La presencia de la función delta de Dirac garantiza que la perturbación solo se propague en un radio \( ct \) del origen. Comenzamos, como en los dos apartados anteriores, graficando la función. En este caso, no se puede representar en un mismo video cómo varía en función de \( x,y,z \) y \(t\) de manera clara. De modo que se ha optado por representar en un primer lugar un video de la relación entre  \( x,y,z \) fijando \( t=1 \):&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli4.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation &lt;br /&gt;
def dirac_approximation(s, k):&lt;br /&gt;
    return np.sqrt(k / (np.pi)) * np.exp(-k * s ** 2) &lt;br /&gt;
def fundamental_solution_3D(x, y, z, t, c, k=1000):&lt;br /&gt;
    r = np.sqrt(x ** 2 + y ** 2 + z ** 2)&lt;br /&gt;
    return dirac_approximation(r - c * t, k) / (4 * np.pi * c * r)&lt;br /&gt;
# Parámetros&lt;br /&gt;
t = 1.0&lt;br /&gt;
c = 1.0&lt;br /&gt;
k = 1000&lt;br /&gt;
x = np.linspace(-5, 5, 500)&lt;br /&gt;
y = np.linspace(-5, 5, 500)&lt;br /&gt;
X, Y = np.meshgrid(x, y)&lt;br /&gt;
# Valores de z&lt;br /&gt;
z_values = np.linspace(-1, 1, 50)&lt;br /&gt;
# Crear figura y ejes&lt;br /&gt;
fig, ax = plt.subplots(figsize=(8, 8)) &lt;br /&gt;
def update(frame):&lt;br /&gt;
    z = z_values[frame]&lt;br /&gt;
    ax.clear()&lt;br /&gt;
    Z = fundamental_solution_3D(X, Y, z, t, c, k)&lt;br /&gt;
    cset = ax.contourf(X, Y, Z, cmap='viridis')&lt;br /&gt;
    ax.set_title(f'z = {z:.2f}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(z_values), interval=100) &lt;br /&gt;
# Guardar la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_3D_corte_z.gif', writer='pillow', fps=10)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observamos que se trata de una sección de esfera hueca,  debido a la presencia de la función delta de Dirac en el numerador. ¿Qué pasa si fijamos \(z\) y variamos \(t\)?&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli5.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation &lt;br /&gt;
def dirac_approximation(s, k):&lt;br /&gt;
    return np.sqrt(k / (np.pi)) * np.exp(-k * s ** 2)&lt;br /&gt;
def fundamental_solution_3D(x, y, z, t, c, k=1000):&lt;br /&gt;
    r = np.sqrt(x ** 2 + y ** 2 + z ** 2)&lt;br /&gt;
    return dirac_approximation(r - c * t, k) / (4 * np.pi * c * r)&lt;br /&gt;
# Parámetros&lt;br /&gt;
z = 0&lt;br /&gt;
c = 1.0&lt;br /&gt;
k = 1000&lt;br /&gt;
x = np.linspace(-5, 5, 500)&lt;br /&gt;
y = np.linspace(-5, 5, 500)&lt;br /&gt;
X, Y = np.meshgrid(x, y) &lt;br /&gt;
# Valores de z&lt;br /&gt;
t_values = np.linspace(0, 5, 50) &lt;br /&gt;
# Crear figura y ejes&lt;br /&gt;
fig, ax = plt.subplots(figsize=(8, 8)) &lt;br /&gt;
def update(frame):&lt;br /&gt;
    t = t_values[frame]&lt;br /&gt;
    ax.clear()&lt;br /&gt;
    Z = fundamental_solution_3D(X, Y, z, t, c, k)&lt;br /&gt;
    cset = ax.contourf(X, Y, Z, cmap='viridis')&lt;br /&gt;
    ax.set_title(f't = {t:.2f}')&lt;br /&gt;
    ax.set_xlabel('x')&lt;br /&gt;
    ax.set_ylabel('y')&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(z_values), interval=100) &lt;br /&gt;
# Guardar la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_3D_dif_t.gif', writer='pillow', fps=10)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Obtenemos también una circunferencia que se va expandiendo con el tiempo. Uniendo ambas ideas podemos ver que en dimensión 3, la solución fundamental es una esfera hueca que con el tiempo va aumentando de radio y disminuyendo la intensidad del primer impulso.&lt;br /&gt;
&lt;br /&gt;
Claramente es una función que depende únicamente del radio, así pues, de manera análoga, la representamos en su variable radial.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:celiceli6.gif|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import matplotlib.animation as animation&lt;br /&gt;
 &lt;br /&gt;
def dirac_approximation(s, k):&lt;br /&gt;
    return (k / np.pi) ** 0.5 * np.exp(-k * s ** 2)&lt;br /&gt;
 &lt;br /&gt;
def fundamental_solution_3D_radial(r, t, c, k=1000):&lt;br /&gt;
    return dirac_approximation(r - c * t, k) / (4 * np.pi * c * r)&lt;br /&gt;
 &lt;br /&gt;
# Definimos los parámetros&lt;br /&gt;
c = 1&lt;br /&gt;
t_values = np.arange(0, 5, 0.01)  # Valores de tiempo en incrementos de 0.01&lt;br /&gt;
r_values = np.linspace(0, 5, 500)&lt;br /&gt;
 &lt;br /&gt;
# Creamos una función para actualizar el gráfico en cada cuadro de la animación&lt;br /&gt;
def update(frame):&lt;br /&gt;
    plt.cla()  # Limpiamos el gráfico actual&lt;br /&gt;
    plt.plot(r_values, fundamental_solution_3D_radial(r_values, t_values[frame], c), color= 'blue')&lt;br /&gt;
    plt.ylim(0, 5)  # Ajustamos el eje y en el rango de 0 a 1&lt;br /&gt;
    plt.title(f'Solución Fundamental en 3D - t={t_values[frame]}')&lt;br /&gt;
    plt.xlabel('r')&lt;br /&gt;
    plt.ylabel('K(r, t)')&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
 &lt;br /&gt;
# Creamos la animación&lt;br /&gt;
fig = plt.figure(figsize=(8, 6))&lt;br /&gt;
ani = animation.FuncAnimation(fig, update, frames=len(t_values), interval=50)&lt;br /&gt;
 &lt;br /&gt;
# Guardamos la animación como un GIF&lt;br /&gt;
ani.save('fundamental_solution_3D.gif', writer='pillow', fps=30)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este video puede intuir que un impulso solo es percibido por el individuo en el momento en que la esfera ''lo alcanza'', y con una intensidad que va disminuyendo. Esto es fundamental en la comprensión de la propagación de ondas, conocido como el principio de Huygens.&lt;br /&gt;
&lt;br /&gt;
== Solución fundamental del problema en dimensión 2==&lt;br /&gt;
En esta sección nos centraremos en resolver el siguiente problema de la ecuación de ondas en dos dimensiones:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp;u_{tt} - c^2 \Delta u  = 0, &amp;amp; \quad x \in \mathbb{R}^2, \quad t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, \quad u_t(x,0) = h(x) = \chi_{B(0,\frac{1}{2})(x)}, &amp;amp; \quad x \in \mathbb{R}^2,&lt;br /&gt;
\end{align}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La solución se obtendrá mediante una convolución entre la solución fundamental, explicada en la sección anterior, y \(u_t(x,0)\). Es decir, la solución se calcula de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
 u(x,t) = \int_{\mathbb{R}^2} K_2(x-y, t) h(y) \, dy.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dado que hemos demostrado previamente que \(K_2(x, t)\) es radial, es evidente que \(K_2(x-y, t)\) también lo es. Además, consideremos \(h(x)=\chi_{B(0,\frac{1}{2})}(x)\), la función característica de una bola centrada en \(0\). Esta función también es radial. Por lo tanto, podemos simplificar nuestros cálculos y calcular la integral en coordenadas polares.&lt;br /&gt;
&lt;br /&gt;
Para resolver la integral de la función \( u(x,t) \) en coordenadas polares, primero necesitamos reformular la integral en términos de coordenadas polares, donde &amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{array}{ll}&lt;br /&gt;
x = (r_x \cos \theta_x, r_x \sin \theta_x) \\&lt;br /&gt;
y = (r_y \cos \theta_y, r_y \sin \theta_y)&lt;br /&gt;
\end{array}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
La integral se transforma usando el jacobiano de la transformación polar \( r \, dr \, d\theta \):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(r_x, \theta_x, t) = \int_0^{2\pi} \int_0^{\infty} K_2(r, t, c) h(r_y \cos(\theta_y)) r \, dr \, d\theta, \, \text{donde} \, r = \sqrt{r_x^2 + r_y^2 - 2r_x r_y \cos(\theta_x-\theta_y)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podemos simplificar nuestros cálculos y calcular la integral para una sección transversal, es decir, fijando un ángulo. Esto se debe a que para cualquier ángulo diferente, la representación obtenida seguirá teniendo la misma forma.&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72520</id>
		<title>Ecuación de ondas. Grupo Eau De Parfum(EDP)</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72520"/>
				<updated>2024-05-25T17:26:08Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Solución fundamental en dimensión 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación de Ondas. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
&lt;br /&gt;
=Introducción=&lt;br /&gt;
&lt;br /&gt;
=Contexto histórico=&lt;br /&gt;
[[Archivo:alambert_edp.jpg|200px|thumb|right|Jean le Rond D'Alembert]]&lt;br /&gt;
La ecuación de onda es una ecuación diferencial en derivadas parciales lineal de segundo orden, crucial para describir la propagación de diversas ondas, como las ondas sonoras, las ondas de luz y las ondas en el agua. Su relevancia se extiende a múltiples campos, incluyendo la acústica, el electromagnetismo, la mecánica cuántica y la dinámica de fluidos. Históricamente, Jean le Rond d'Alembert fue el primero en estudiar el problema de una cuerda vibrante, como las utilizadas en instrumentos musicales, en 1746.&lt;br /&gt;
&lt;br /&gt;
=Conocimientos previos=&lt;br /&gt;
En esta sección se van a describir algunos conceptos a tener en cuenta durante todo el trabajo.&lt;br /&gt;
&lt;br /&gt;
-Principio de Huygens: Afirma que cada punto en un frente de onda actúa como una fuente de ondas secundarias que se propagan hacia adelante con la misma velocidad que la propia onda. Estas ondas secundarias se combinan para formar un nuevo frente de onda, que es tangente a todas las ondas secundarias. Es decir, cada punto del frente de onda original puede considerarse como un punto de partida para nuevas ondas que se mueven en la misma dirección que la perturbación inicial. Estas ondas secundarias tienen la misma velocidad y frecuencia que la onda original.&lt;br /&gt;
&lt;br /&gt;
Cabe destacar que vamos a utilizar [[Series de Fourier (Grupo Eau De Parfum (EDP))|Series de Furier]]&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas I=&lt;br /&gt;
Estamos considerando una cuerda vibrante que se extiende en el intervalo [0,1], con una densidad &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; y una tensión constante &amp;lt;math&amp;gt;\tau_0&amp;lt;/math&amp;gt;, lo que resulta en una velocidad de propagación &amp;lt;math&amp;gt;c=\frac{\tau_0}{d}=1&amp;lt;/math&amp;gt;. Además suponemos que la cuerda está fija en los extremos y llamamos &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt; a su posición e impulso iniciales respectivamente.&lt;br /&gt;
&lt;br /&gt;
El sistema de ecuaciones que modeliza el comportamiento de los desplazamientos transversales de la cuerda es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = u(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =u_0(x) \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = u_1(x),&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La solución general de la ecuación de ondas empleando separación de variables se puede expresar en términos de la serie de Fourier de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;. La solución tiene la forma&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty} [A_n \cos(n\pi t)+B_n \sin(n \pi t)]sin(n \pi x)  &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde los coeficientes &amp;lt;math&amp;gt;A_n&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;B_n&amp;lt;/math&amp;gt; se determinan a partir de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;.Por lo que la solución completa de a ecuación de ondas para la cuerda vibrante con las condiciones iniciales dadas es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty}[ (2\int_{0}^{1} u_0(x) \sin(n \pi x) dx) \cos(n \pi t) + (\frac{2}{n\pi} \int_{0}^{1} u_0(x) \sin(n \pi x) dx)\sin(n\pi t)] \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Cambiando datos iniciales==&lt;br /&gt;
Para resolver este problema, primero debemos calcular los coeficientes de Fourier &amp;lt;math&amp;gt; A_n &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; B_n &amp;lt;/math&amp;gt; usando los datos iniciales &amp;lt;math&amp;gt; u_0(x)=e^{-100(x-1/2)^2} &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; u_1(x)=0 &amp;lt;/math&amp;gt;. Luego, usaremos estos coeficientes para construir la solución aproximada &amp;lt;math&amp;gt; u(x,t) &amp;lt;/math&amp;gt; tomando los primeros 50 términos de la serie.&lt;br /&gt;
&lt;br /&gt;
Los coeficientes de Fourier son:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_0^1 u_0(x) \sin(n \pi x) \, dx = 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n \pi} \int_0^1 u_1(x) \sin(n \pi x) \, dx = 0 \quad (\text{porque } u_1(x) = 0).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo tanto, la solución se simplifica a:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x,t) = \sum_{n=1}^{50} A_n \cos(n \pi t) \sin(n \pi x)=\sum_{n=1}^{50}[2 \int_0^1 u_0(x) \sin(n \pi x) \, dx cos(n \pi t)] \sin(n \pi x) .&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedemos a representar la solución obteniendo:&lt;br /&gt;
[[Archivo:ejer3a_edp.png|500px|thumb|right|]]&lt;br /&gt;
[[Archivo:ejer3b_edp.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
 &lt;br /&gt;
# Definimos las funciones iniciales u0(x) y u1(x)&lt;br /&gt;
def u0(x):&lt;br /&gt;
    return np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
def u1(x):&lt;br /&gt;
    return np.zeros_like(x)&lt;br /&gt;
 &lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1.0&lt;br /&gt;
c = 1.0  # Velocidad de propagación de las ondas&lt;br /&gt;
N = 100  # Número de puntos para el método del trapecio&lt;br /&gt;
x = np.linspace(0, L, N)&lt;br /&gt;
 &lt;br /&gt;
# Intervalo de tiempo y número de términos de Fourier&lt;br /&gt;
T = 2.0&lt;br /&gt;
n_terms = 50&lt;br /&gt;
 &lt;br /&gt;
# Resolución temporal&lt;br /&gt;
t_steps = 200&lt;br /&gt;
t = np.linspace(0, T, t_steps)&lt;br /&gt;
 &lt;br /&gt;
# Inicialización de u(x,t)&lt;br /&gt;
u_xt = np.zeros((N, t_steps))&lt;br /&gt;
 &lt;br /&gt;
# Calculamos la solución para cada tiempo t&lt;br /&gt;
for j, tj in enumerate(t):&lt;br /&gt;
    u_t = np.zeros_like(x)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        # Calculamos los coeficientes A_n y B_n&lt;br /&gt;
        integrand_f = u0(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        A_n = 2 * np.trapz(integrand_f, x)&lt;br /&gt;
 &lt;br /&gt;
        integrand_g = u1(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        B_n = 2 / (n * np.pi * c) * np.trapz(integrand_g, x)&lt;br /&gt;
 &lt;br /&gt;
        # Suma de términos en la serie de Fourier&lt;br /&gt;
        u_t += (A_n * np.cos(n * np.pi * c * tj) + B_n * np.sin(n * np.pi * c * tj)) * np.sin(n * np.pi * x / L)&lt;br /&gt;
    u_xt[:, j] = u_t&lt;br /&gt;
 &lt;br /&gt;
# Graficamos la solución en diferentes tiempos&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
for j in range(0, t_steps, t_steps // 10):&lt;br /&gt;
    plt.plot(x, u_xt[:, j], label=f't={t[j]:.2f}')&lt;br /&gt;
 &lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('u(x,t)')&lt;br /&gt;
plt.title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
 &lt;br /&gt;
# Comprobamos la periodicidad en el tiempo&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
for i in range(0, N, N // 10):&lt;br /&gt;
    plt.plot(t, u_xt[i, :], label=f'x={x[i]:.2f}')&lt;br /&gt;
 &lt;br /&gt;
plt.xlabel('t')&lt;br /&gt;
plt.ylabel('u(x,t)')&lt;br /&gt;
plt.title('Periodicidad de la solución en el tiempo')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Representándolo en tres dimensiones obtenemos&lt;br /&gt;
[[Archivo:ejer3c_edp.png|350px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation, PillowWriter&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
# Graficamos la solución en 3D&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
 &lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
 &lt;br /&gt;
# Transponemos u_xt para que las dimensiones coincidan con las de X y T&lt;br /&gt;
ax.plot_surface(X, T, u_xt.T, cmap='viridis')&lt;br /&gt;
 &lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('t')&lt;br /&gt;
ax.set_zlabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Archivo:Wave_equation.gif|350px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Configuración de la animación&lt;br /&gt;
fig, ax = plt.subplots()&lt;br /&gt;
line, = ax.plot(x, u_xt[:, 0])&lt;br /&gt;
ax.set_xlim(0, L)&lt;br /&gt;
ax.set_ylim(-1.10, 1.10)&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
# Agregar un texto que muestre el instante de tiempo&lt;br /&gt;
time_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)&lt;br /&gt;
 &lt;br /&gt;
def update(frame):&lt;br /&gt;
    line.set_ydata(u_xt[:, frame])&lt;br /&gt;
    time_text.set_text(f't = {t[frame]:.2f}s')&lt;br /&gt;
    return line, time_text&lt;br /&gt;
 &lt;br /&gt;
ani = FuncAnimation(fig, update, frames=t_steps, blit=True)&lt;br /&gt;
 &lt;br /&gt;
# Guardar la animación como GIF&lt;br /&gt;
writer = PillowWriter(fps=20)&lt;br /&gt;
ani.save(&amp;quot;wave_equation.gif&amp;quot;, writer=writer)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La gráfica muestra la periodicidad en el tiempo de la solución &amp;lt;math&amp;gt;u(x,t) &amp;lt;/math&amp;gt;. La función claramente repite su patrón a medida que &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; varía, lo que confirma que la solución es periódica en el tiempo con un período de 2. Este período corresponde al término más lento &amp;lt;math&amp;gt; n=1 &amp;lt;/math&amp;gt;, ya que &amp;lt;math&amp;gt;\cos(\pi t)&amp;lt;/math&amp;gt; tiene un período de 2.&lt;br /&gt;
&lt;br /&gt;
La periodicidad observada es coherente con la naturaleza periódica de las funciones seno y coseno involucradas en la solución de la ecuación de la cuerda vibrante.&lt;br /&gt;
&lt;br /&gt;
==Onda en un solo sentido==&lt;br /&gt;
Veamos ahora lo que ocurre cuando estudiamos una onda que viaja en un solo sentido, es decir, &amp;lt;math&amp;gt; u(x, t) = f (x − t)&amp;lt;/math&amp;gt;. Que particularizaremos tomando como datos iniciales &amp;lt;math&amp;gt;u_0(x) = f(x)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u_1(x) = -f'(x)&amp;lt;/math&amp;gt;, con &amp;lt;math&amp;gt;f(x)=e^{-100(x-1/2)^2}&amp;lt;/math&amp;gt;. Por tanto el sistema con el que trabajamos es&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = u(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =e^{-100(x-1/2)^2} \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = 200(x-1/2)e^{-100(x-1/2)^2},&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Su solución viene dada mediante el método de separación de variables en términos de los coeficientes de Fourier:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_0^1 u_0(x) \sin(n \pi x) \, dx = 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n \pi} \int_0^1 u_1(x) \sin(n \pi x) \, dx =\frac{2}{n \pi} \int_0^1 (200(x-1/2)e^{-100(x-1/2)^2})\sin(n \pi x) \, dx&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo que la solución completa de la ecuación de ondas para la cuerda vibrante con las condiciones iniciales dadas es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty}[ ( 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx) \cos(n \pi t) + (\frac{2}{n \pi} \int_0^1 (200(x-1/2)e^{-100(x-1/2)^2})\sin(n \pi x) \, dx)\sin(n\pi t)] \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La representación gráfica de esta solución es:&lt;br /&gt;
&lt;br /&gt;
GRÁFICAAAAAAAA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Cambio en condición frontera==&lt;br /&gt;
Para comprender la diferencia entre las condiciones de frontera Dirichlet y Neumann en la ecuación de ondas, repetiremos el análisis del apartado anterior, esta vez aplicando condiciones de Neumann. En lugar de fijar los valores de la función en los extremos (condiciones de Dirichlet), estableceremos que las derivadas parciales respecto a &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; en los extremos sean cero. Es decir, consideramos las condiciones &amp;lt;math&amp;gt; u_x(0,t)=u_x(1,t)=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
Por tanto nuestro nuevo problema es&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u_x(0, t) = u_x(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =e^{-100(x-1/2)^2} \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = 200(x-1/2)e^{-100(x-1/2)^2}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas II=&lt;br /&gt;
En esta sección, abordaremos la resolución de la ecuación de ondas en dimensiones 1, 2 y 3, una tarea que nos permitirá explorar la solución fundamental y, a su vez, comprender el principio de Huygens.&lt;br /&gt;
&lt;br /&gt;
==Soluciones fundamentales para diferentes dimensiones==&lt;br /&gt;
Comenzamos estudiando la solución fundamental, que surge como respuesta a un impulso inicial localizado en \( x = 0 \). Formalmente, se define mediante límites y funciones características. El objetivo es observar y graficar las soluciones fundamentales en su forma radial para cada dimensión, lo que nos ayudará a comprender mejor la naturaleza de las ondas en diferentes entornos dimensionales.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 1===&lt;br /&gt;
La solución fundamental en dimensión 1, \( K_1(x, t) \), se define como:&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_1(x, t) = \frac{1}{2c} \left[ H(x + ct) - H(x - ct) \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde \( H(s) \) es la función de Heaviside, dada por:&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H(s) = \begin{cases}&lt;br /&gt;
0, &amp;amp; \text{si } s &amp;lt; 0 \\&lt;br /&gt;
1, &amp;amp; \text{si } s \geq 0&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dicha función, \( K_1(x, t) \), se compone de dos funciones de Heaviside desplazadas horizontalmente a lo largo del eje \( x \) en \( ct \) y \( -ct \) y luego divididas por \( 2c \). Esto significa que en el intervalo \( (-\infty, -ct) \), \( K_1(x, t) \) es 0, luego aumenta a 1 en el intervalo \( (-ct, ct) \), y finalmente vuelve a 0 en el intervalo \( (ct, \infty) \). La constante \( c \) controla la velocidad de propagación de la onda, que hemos exigido \(1\). Graficamos la función para tener una primera idea intuitiva de la solución fundamental:&lt;br /&gt;
&lt;br /&gt;
[CODIGO-IMAGEN]&lt;br /&gt;
&lt;br /&gt;
Visualmente, la gráfica de \( K_1(x, t) \) parece una función escalón, donde hay un cambio abrupto en el valor de la función en \( x = \pm ct \). Esto refleja la propagación de una onda con velocidad \( c \) a lo largo del eje \( x \).  Además, debido a que su valor depende únicamente de la distancia radial desde el origen, es decir, de la magnitud de \( x \), podemos decir que se trata de una función radial y, por tanto, graficarla de esta forma. En la expresión de \( K_1(x, t) \), la variable \( x \) aparece únicamente como \( x \pm ct \), lo que permite su reescritura como \( K_1(r, t) \), donde \( r = |x| \) es la distancia radial.&lt;br /&gt;
&lt;br /&gt;
[CODIGO-GIF]&lt;br /&gt;
&lt;br /&gt;
Al graficar \( K_1(r, t) \) como función de \( r \) para diferentes valores de \( t \), se observa que la forma de la curva es la misma independientemente de la dirección específica en la que nos movamos desde el origen, lo que confirma su carácter radial.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 2===&lt;br /&gt;
La solución fundamental en dimensión 2, \( K_2(x, t) \), se define como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_2(x, t) = \frac{1}{2\pi c \sqrt{c^2 t^2 - |x|^2}} \chi_{B(0,ct)}(x),&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
donde \(\chi_B(0,ct)(x)\) es la función característica de la bola de centro (\ 0 \) y radio (\ c \cdot t \). Esta función describe cómo una perturbación inicial, localizada en el centro de una bola de radio \( ct \), se propaga a lo largo del plano. La función característica \( \chi_{B(0, ct)}(x) \) asegura que la perturbación solo se propague dentro de esta bola. La presencia del término \( \frac{1}{c^2 t^2 - |x|^2} \) indica cómo la amplitud de la onda varía con la distancia desde el centro de la bola y el tiempo. Mostraremos gráficamente esta función para tener una primera idea intuitiva. Se mostrará un video que varía en función del tiempo:&lt;br /&gt;
&lt;br /&gt;
[CODIGO-GIF]&lt;br /&gt;
&lt;br /&gt;
Claramente se trata de una función radial, de manera que podemos representar una sección transversal de la función. Esto es, representarla en la variable radial:&lt;br /&gt;
&lt;br /&gt;
[CODIGO-GIF]&lt;br /&gt;
&lt;br /&gt;
Observamos la presencia de una asíntota en \( K_2(x, t) \). Esta asíntota refleja cómo la amplitud de la onda se acerca a cero cuando el denominador se aproxima a cero. Sin embargo, a medida que el tiempo avanza y el radio \( |x| \) aumenta, la amplitud de la onda disminuye. Esta disminución en la amplitud se interpreta como una disminución en la intensidad o &amp;quot;altura&amp;quot; de la onda (del agua, por ejemplo) a medida que se propaga a través del espacio en dos dimensiones.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 3===&lt;br /&gt;
La solución fundamental en dimensión 2, \( K_3(x, t) \), se define como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_3(x, t) = \frac{\delta(|x| - ct)}{4\pi c|x|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde \( \delta(|x| - ct) \) representa la función delta de Dirac. Esta función modela cómo una perturbación inicial, localizada en un radio \( ct \) del origen, se propaga en el espacio tridimensional. La presencia de la función delta de Dirac garantiza que la perturbación solo se propague en un radio \( ct \) del origen. Comenzamos, como en los dos apartados anteriores, graficando la función. En este caso, no se puede representar en un mismo video cómo varía en función de \( x,y,z \) y \(t\) de manera clara. De modo que se ha optado por representar en un primer lugar un video de la relación entre  \( x,y,z \) fijando \( t=1 \):&lt;br /&gt;
&lt;br /&gt;
[CODIGO-GIF]&lt;br /&gt;
&lt;br /&gt;
Observamos que se trata de una sección de esfera hueca,  debido a la presencia de la función delta de Dirac en el numerador. ¿Qué pasa si fijamos \(z\) y variamos \(t\)?&lt;br /&gt;
&lt;br /&gt;
[CODIGO-GIF]&lt;br /&gt;
&lt;br /&gt;
Obtenemos también una circunferencia que se va expandiendo con el tiempo. Uniendo ambas ideas podemos ver que en dimensión 3, la solución fundamental es una esfera hueca que con el tiempo va aumentando de radio y disminuyendo la intensidad del primer impulso.&lt;br /&gt;
&lt;br /&gt;
Claramente es una función que depende únicamente del radio, así pues, de manera análoga, la representamos en su variable radial.&lt;br /&gt;
&lt;br /&gt;
[CODIGO-GIF]&lt;br /&gt;
&lt;br /&gt;
Este video puede intuir que un impulso solo es percibido por el individuo en el momento en que la esfera ''lo alcanza'', y con una intensidad que va disminuyendo. Esto es fundamental en la comprensión de la propagación de ondas, conocido como el principio de Huygens.&lt;br /&gt;
&lt;br /&gt;
== Solución fundamental del problema en dimensión 2==&lt;br /&gt;
En particular, nos enfocaremos en la solución del problema en dos dimensiones. Esta solución, obtenida a través de la convolución, nos ofrece una interesante propiedad radial en &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;. ¿Qué significa esto y cómo se traduce visualmente? A lo largo de esta resolución, analizaremos cómo varía esta solución en puntos específicos, aprovechando su naturaleza radial y centrándonos en &amp;lt;math&amp;gt;x_1 &amp;gt; 0&amp;lt;/math&amp;gt;. Además, exploraremos el concepto de la solución fundamental, que surge al considerar un impulso inicial concentrado en &amp;lt;math&amp;gt;x = 0&amp;lt;/math&amp;gt;, delineando su definición matemática y su relevancia en el contexto físico. Con esta premisa, procedamos a abordar la resolución de este fascinante problema.&lt;br /&gt;
&lt;br /&gt;
Para resolver la integral de la función \( u(x,t) \) en coordenadas polares, primero necesitamos reformular la integral en términos de coordenadas polares. La integral original es:&lt;br /&gt;
&lt;br /&gt;
\( u(x,t) = \int_{\mathbb{R}^2} K_2(x-y, t) h(y) \, dy. \)&lt;br /&gt;
&lt;br /&gt;
En coordenadas polares, donde \( x = (r_x \cos \theta_x, r_x \sin \theta_x) \) y \( y = (r_y \cos \theta_y, r_y \sin \theta_y) \), la integral se transforma usando el jacobiano de la transformación polar \( r \, dr \, d\theta \):&lt;br /&gt;
&lt;br /&gt;
\( u(r_x, t) = \int_0^{2\pi} \int_0^{\infty} K_2(r, t, c) h(r \cos(\theta)) r \, dr \, d\theta, \)&lt;br /&gt;
&lt;br /&gt;
donde&lt;br /&gt;
&lt;br /&gt;
\( r = \sqrt{r_x^2 + r_y^2 - 2r_x r_y \cos(\theta)}. \)&lt;br /&gt;
&lt;br /&gt;
=== Pasos para Transformar la Integral ===&lt;br /&gt;
&lt;br /&gt;
'''1. Transformación de Coordenadas:'''&lt;br /&gt;
* Elemento de lista de viñetas: Cambiar las coordenadas cartesianas \( (x,y) \) a coordenadas polares \( (r, \theta) \).&lt;br /&gt;
* Las coordenadas \( x \) y \( y \) en polares se expresan como \( x = (r_x \cos \theta_x, r_x \sin \theta_x) \) y \( y = (r_y \cos \theta_y, r_y \sin \theta_y) \).&lt;br /&gt;
&lt;br /&gt;
'''2. Calcular el Jacobiano:'''&lt;br /&gt;
* La transformación a coordenadas polares introduce un factor adicional \( r \) en el diferencial del área, es decir, \( dx \, dy = r \, dr \, d\theta \).&lt;br /&gt;
&lt;br /&gt;
'''3. Reformular la Integral:'''&lt;br /&gt;
* Sustituir las variables y el jacobiano en la integral original:  \( u(r_x, t) = \int_0^{2\pi} \int_0^{\infty} K_2(r, t, c) h(r \cos(\theta)) r \, dr \, d\theta. \)&lt;br /&gt;
&lt;br /&gt;
'''4. Expresar \( r \):'''&lt;br /&gt;
* Expresar la distancia \( r \) en términos de \( r_x \) y \( r_y \): \( r = \sqrt{r_x^2 + r_y^2 - 2r_x r_y \cos(\theta)}. \)&lt;br /&gt;
&lt;br /&gt;
Esta reformulación permite evaluar la integral original en coordenadas polares, facilitando el cálculo en situaciones donde la simetría radial simplifica la solución.&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72519</id>
		<title>Ecuación de ondas. Grupo Eau De Parfum(EDP)</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72519"/>
				<updated>2024-05-25T17:24:44Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Solución fundamental en dimensión 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación de Ondas. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
&lt;br /&gt;
=Introducción=&lt;br /&gt;
&lt;br /&gt;
=Contexto histórico=&lt;br /&gt;
[[Archivo:alambert_edp.jpg|200px|thumb|right|Jean le Rond D'Alembert]]&lt;br /&gt;
La ecuación de onda es una ecuación diferencial en derivadas parciales lineal de segundo orden, crucial para describir la propagación de diversas ondas, como las ondas sonoras, las ondas de luz y las ondas en el agua. Su relevancia se extiende a múltiples campos, incluyendo la acústica, el electromagnetismo, la mecánica cuántica y la dinámica de fluidos. Históricamente, Jean le Rond d'Alembert fue el primero en estudiar el problema de una cuerda vibrante, como las utilizadas en instrumentos musicales, en 1746.&lt;br /&gt;
&lt;br /&gt;
=Conocimientos previos=&lt;br /&gt;
En esta sección se van a describir algunos conceptos a tener en cuenta durante todo el trabajo.&lt;br /&gt;
&lt;br /&gt;
-Principio de Huygens: Afirma que cada punto en un frente de onda actúa como una fuente de ondas secundarias que se propagan hacia adelante con la misma velocidad que la propia onda. Estas ondas secundarias se combinan para formar un nuevo frente de onda, que es tangente a todas las ondas secundarias. Es decir, cada punto del frente de onda original puede considerarse como un punto de partida para nuevas ondas que se mueven en la misma dirección que la perturbación inicial. Estas ondas secundarias tienen la misma velocidad y frecuencia que la onda original.&lt;br /&gt;
&lt;br /&gt;
Cabe destacar que vamos a utilizar [[Series de Fourier (Grupo Eau De Parfum (EDP))|Series de Furier]]&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas I=&lt;br /&gt;
Estamos considerando una cuerda vibrante que se extiende en el intervalo [0,1], con una densidad &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; y una tensión constante &amp;lt;math&amp;gt;\tau_0&amp;lt;/math&amp;gt;, lo que resulta en una velocidad de propagación &amp;lt;math&amp;gt;c=\frac{\tau_0}{d}=1&amp;lt;/math&amp;gt;. Además suponemos que la cuerda está fija en los extremos y llamamos &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt; a su posición e impulso iniciales respectivamente.&lt;br /&gt;
&lt;br /&gt;
El sistema de ecuaciones que modeliza el comportamiento de los desplazamientos transversales de la cuerda es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = u(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =u_0(x) \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = u_1(x),&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La solución general de la ecuación de ondas empleando separación de variables se puede expresar en términos de la serie de Fourier de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;. La solución tiene la forma&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty} [A_n \cos(n\pi t)+B_n \sin(n \pi t)]sin(n \pi x)  &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde los coeficientes &amp;lt;math&amp;gt;A_n&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;B_n&amp;lt;/math&amp;gt; se determinan a partir de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;.Por lo que la solución completa de a ecuación de ondas para la cuerda vibrante con las condiciones iniciales dadas es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty}[ (2\int_{0}^{1} u_0(x) \sin(n \pi x) dx) \cos(n \pi t) + (\frac{2}{n\pi} \int_{0}^{1} u_0(x) \sin(n \pi x) dx)\sin(n\pi t)] \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Cambiando datos iniciales==&lt;br /&gt;
Para resolver este problema, primero debemos calcular los coeficientes de Fourier &amp;lt;math&amp;gt; A_n &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; B_n &amp;lt;/math&amp;gt; usando los datos iniciales &amp;lt;math&amp;gt; u_0(x)=e^{-100(x-1/2)^2} &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; u_1(x)=0 &amp;lt;/math&amp;gt;. Luego, usaremos estos coeficientes para construir la solución aproximada &amp;lt;math&amp;gt; u(x,t) &amp;lt;/math&amp;gt; tomando los primeros 50 términos de la serie.&lt;br /&gt;
&lt;br /&gt;
Los coeficientes de Fourier son:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_0^1 u_0(x) \sin(n \pi x) \, dx = 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n \pi} \int_0^1 u_1(x) \sin(n \pi x) \, dx = 0 \quad (\text{porque } u_1(x) = 0).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo tanto, la solución se simplifica a:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x,t) = \sum_{n=1}^{50} A_n \cos(n \pi t) \sin(n \pi x)=\sum_{n=1}^{50}[2 \int_0^1 u_0(x) \sin(n \pi x) \, dx cos(n \pi t)] \sin(n \pi x) .&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedemos a representar la solución obteniendo:&lt;br /&gt;
[[Archivo:ejer3a_edp.png|500px|thumb|right|]]&lt;br /&gt;
[[Archivo:ejer3b_edp.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
 &lt;br /&gt;
# Definimos las funciones iniciales u0(x) y u1(x)&lt;br /&gt;
def u0(x):&lt;br /&gt;
    return np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
def u1(x):&lt;br /&gt;
    return np.zeros_like(x)&lt;br /&gt;
 &lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1.0&lt;br /&gt;
c = 1.0  # Velocidad de propagación de las ondas&lt;br /&gt;
N = 100  # Número de puntos para el método del trapecio&lt;br /&gt;
x = np.linspace(0, L, N)&lt;br /&gt;
 &lt;br /&gt;
# Intervalo de tiempo y número de términos de Fourier&lt;br /&gt;
T = 2.0&lt;br /&gt;
n_terms = 50&lt;br /&gt;
 &lt;br /&gt;
# Resolución temporal&lt;br /&gt;
t_steps = 200&lt;br /&gt;
t = np.linspace(0, T, t_steps)&lt;br /&gt;
 &lt;br /&gt;
# Inicialización de u(x,t)&lt;br /&gt;
u_xt = np.zeros((N, t_steps))&lt;br /&gt;
 &lt;br /&gt;
# Calculamos la solución para cada tiempo t&lt;br /&gt;
for j, tj in enumerate(t):&lt;br /&gt;
    u_t = np.zeros_like(x)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        # Calculamos los coeficientes A_n y B_n&lt;br /&gt;
        integrand_f = u0(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        A_n = 2 * np.trapz(integrand_f, x)&lt;br /&gt;
 &lt;br /&gt;
        integrand_g = u1(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        B_n = 2 / (n * np.pi * c) * np.trapz(integrand_g, x)&lt;br /&gt;
 &lt;br /&gt;
        # Suma de términos en la serie de Fourier&lt;br /&gt;
        u_t += (A_n * np.cos(n * np.pi * c * tj) + B_n * np.sin(n * np.pi * c * tj)) * np.sin(n * np.pi * x / L)&lt;br /&gt;
    u_xt[:, j] = u_t&lt;br /&gt;
 &lt;br /&gt;
# Graficamos la solución en diferentes tiempos&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
for j in range(0, t_steps, t_steps // 10):&lt;br /&gt;
    plt.plot(x, u_xt[:, j], label=f't={t[j]:.2f}')&lt;br /&gt;
 &lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('u(x,t)')&lt;br /&gt;
plt.title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
 &lt;br /&gt;
# Comprobamos la periodicidad en el tiempo&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
for i in range(0, N, N // 10):&lt;br /&gt;
    plt.plot(t, u_xt[i, :], label=f'x={x[i]:.2f}')&lt;br /&gt;
 &lt;br /&gt;
plt.xlabel('t')&lt;br /&gt;
plt.ylabel('u(x,t)')&lt;br /&gt;
plt.title('Periodicidad de la solución en el tiempo')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Representándolo en tres dimensiones obtenemos&lt;br /&gt;
[[Archivo:ejer3c_edp.png|350px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation, PillowWriter&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
# Graficamos la solución en 3D&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
 &lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
 &lt;br /&gt;
# Transponemos u_xt para que las dimensiones coincidan con las de X y T&lt;br /&gt;
ax.plot_surface(X, T, u_xt.T, cmap='viridis')&lt;br /&gt;
 &lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('t')&lt;br /&gt;
ax.set_zlabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Archivo:Wave_equation.gif|350px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Configuración de la animación&lt;br /&gt;
fig, ax = plt.subplots()&lt;br /&gt;
line, = ax.plot(x, u_xt[:, 0])&lt;br /&gt;
ax.set_xlim(0, L)&lt;br /&gt;
ax.set_ylim(-1.10, 1.10)&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
# Agregar un texto que muestre el instante de tiempo&lt;br /&gt;
time_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)&lt;br /&gt;
 &lt;br /&gt;
def update(frame):&lt;br /&gt;
    line.set_ydata(u_xt[:, frame])&lt;br /&gt;
    time_text.set_text(f't = {t[frame]:.2f}s')&lt;br /&gt;
    return line, time_text&lt;br /&gt;
 &lt;br /&gt;
ani = FuncAnimation(fig, update, frames=t_steps, blit=True)&lt;br /&gt;
 &lt;br /&gt;
# Guardar la animación como GIF&lt;br /&gt;
writer = PillowWriter(fps=20)&lt;br /&gt;
ani.save(&amp;quot;wave_equation.gif&amp;quot;, writer=writer)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La gráfica muestra la periodicidad en el tiempo de la solución &amp;lt;math&amp;gt;u(x,t) &amp;lt;/math&amp;gt;. La función claramente repite su patrón a medida que &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; varía, lo que confirma que la solución es periódica en el tiempo con un período de 2. Este período corresponde al término más lento &amp;lt;math&amp;gt; n=1 &amp;lt;/math&amp;gt;, ya que &amp;lt;math&amp;gt;\cos(\pi t)&amp;lt;/math&amp;gt; tiene un período de 2.&lt;br /&gt;
&lt;br /&gt;
La periodicidad observada es coherente con la naturaleza periódica de las funciones seno y coseno involucradas en la solución de la ecuación de la cuerda vibrante.&lt;br /&gt;
&lt;br /&gt;
==Onda en un solo sentido==&lt;br /&gt;
Veamos ahora lo que ocurre cuando estudiamos una onda que viaja en un solo sentido, es decir, &amp;lt;math&amp;gt; u(x, t) = f (x − t)&amp;lt;/math&amp;gt;. Que particularizaremos tomando como datos iniciales &amp;lt;math&amp;gt;u_0(x) = f(x)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u_1(x) = -f'(x)&amp;lt;/math&amp;gt;, con &amp;lt;math&amp;gt;f(x)=e^{-100(x-1/2)^2}&amp;lt;/math&amp;gt;. Por tanto el sistema con el que trabajamos es&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = u(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =e^{-100(x-1/2)^2} \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = 200(x-1/2)e^{-100(x-1/2)^2},&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Su solución viene dada mediante el método de separación de variables en términos de los coeficientes de Fourier:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_0^1 u_0(x) \sin(n \pi x) \, dx = 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n \pi} \int_0^1 u_1(x) \sin(n \pi x) \, dx =\frac{2}{n \pi} \int_0^1 (200(x-1/2)e^{-100(x-1/2)^2})\sin(n \pi x) \, dx&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo que la solución completa de la ecuación de ondas para la cuerda vibrante con las condiciones iniciales dadas es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty}[ ( 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx) \cos(n \pi t) + (\frac{2}{n \pi} \int_0^1 (200(x-1/2)e^{-100(x-1/2)^2})\sin(n \pi x) \, dx)\sin(n\pi t)] \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La representación gráfica de esta solución es:&lt;br /&gt;
&lt;br /&gt;
GRÁFICAAAAAAAA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Cambio en condición frontera==&lt;br /&gt;
Para comprender la diferencia entre las condiciones de frontera Dirichlet y Neumann en la ecuación de ondas, repetiremos el análisis del apartado anterior, esta vez aplicando condiciones de Neumann. En lugar de fijar los valores de la función en los extremos (condiciones de Dirichlet), estableceremos que las derivadas parciales respecto a &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; en los extremos sean cero. Es decir, consideramos las condiciones &amp;lt;math&amp;gt; u_x(0,t)=u_x(1,t)=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
Por tanto nuestro nuevo problema es&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u_x(0, t) = u_x(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =e^{-100(x-1/2)^2} \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = 200(x-1/2)e^{-100(x-1/2)^2}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas II=&lt;br /&gt;
En esta sección, abordaremos la resolución de la ecuación de ondas en dimensiones 1, 2 y 3, una tarea que nos permitirá explorar la solución fundamental y, a su vez, comprender el principio de Huygens.&lt;br /&gt;
&lt;br /&gt;
==Soluciones fundamentales para diferentes dimensiones==&lt;br /&gt;
Comenzamos estudiando la solución fundamental, que surge como respuesta a un impulso inicial localizado en \( x = 0 \). Formalmente, se define mediante límites y funciones características. El objetivo es observar y graficar las soluciones fundamentales en su forma radial para cada dimensión, lo que nos ayudará a comprender mejor la naturaleza de las ondas en diferentes entornos dimensionales.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 1===&lt;br /&gt;
La solución fundamental en dimensión 1, \( K_1(x, t) \), se define como:&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_1(x, t) = \frac{1}{2c} \left[ H(x + ct) - H(x - ct) \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde \( H(s) \) es la función de Heaviside, dada por:&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H(s) = \begin{cases}&lt;br /&gt;
0, &amp;amp; \text{si } s &amp;lt; 0 \\&lt;br /&gt;
1, &amp;amp; \text{si } s \geq 0&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dicha función, \( K_1(x, t) \), se compone de dos funciones de Heaviside desplazadas horizontalmente a lo largo del eje \( x \) en \( ct \) y \( -ct \) y luego divididas por \( 2c \). Esto significa que en el intervalo \( (-\infty, -ct) \), \( K_1(x, t) \) es 0, luego aumenta a 1 en el intervalo \( (-ct, ct) \), y finalmente vuelve a 0 en el intervalo \( (ct, \infty) \). La constante \( c \) controla la velocidad de propagación de la onda, que hemos exigido \(1\). Graficamos la función para tener una primera idea intuitiva de la solución fundamental:&lt;br /&gt;
&lt;br /&gt;
[CODIGO-IMAGEN]&lt;br /&gt;
&lt;br /&gt;
Visualmente, la gráfica de \( K_1(x, t) \) parece una función escalón, donde hay un cambio abrupto en el valor de la función en \( x = \pm ct \). Esto refleja la propagación de una onda con velocidad \( c \) a lo largo del eje \( x \).  Además, debido a que su valor depende únicamente de la distancia radial desde el origen, es decir, de la magnitud de \( x \), podemos decir que se trata de una función radial y, por tanto, graficarla de esta forma. En la expresión de \( K_1(x, t) \), la variable \( x \) aparece únicamente como \( x \pm ct \), lo que permite su reescritura como \( K_1(r, t) \), donde \( r = |x| \) es la distancia radial.&lt;br /&gt;
&lt;br /&gt;
[CODIGO-GIF]&lt;br /&gt;
&lt;br /&gt;
Al graficar \( K_1(r, t) \) como función de \( r \) para diferentes valores de \( t \), se observa que la forma de la curva es la misma independientemente de la dirección específica en la que nos movamos desde el origen, lo que confirma su carácter radial.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 2===&lt;br /&gt;
La solución fundamental en dimensión 2, \( K_2(x, t) \), se define como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_2(x, t) = \frac{1}{2\pi c p} \frac{1}{c^2 t^2 - |x|^2} \chi_B(0,ct)(x),&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
donde \(\chi_B(0,ct)(x)\) es la función característica de la bola de centro (\ 0 \) y radio (\ c \cdot t \). Esta función describe cómo una perturbación inicial, localizada en el centro de una bola de radio \( ct \), se propaga a lo largo del plano. La función característica \( \chi_B(0, ct)(x) \) asegura que la perturbación solo se propague dentro de esta bola. La presencia del término \( \frac{1}{c^2 t^2 - |x|^2} \) indica cómo la amplitud de la onda varía con la distancia desde el centro de la bola y el tiempo. Mostraremos gráficamente esta función para tener una primera idea intuitiva. Se mostrará un video que varía en función del tiempo:&lt;br /&gt;
&lt;br /&gt;
[CODIGO-GIF]&lt;br /&gt;
&lt;br /&gt;
Claramente se trata de una función radial, de manera que podemos representar una sección transversal de la función. Esto es, representarla en la variable radial:&lt;br /&gt;
&lt;br /&gt;
[CODIGO-GIF]&lt;br /&gt;
&lt;br /&gt;
Observamos la presencia de una asíntota en \( K_2(x, t) \). Esta asíntota refleja cómo la amplitud de la onda se acerca a cero cuando el denominador se aproxima a cero. Sin embargo, a medida que el tiempo avanza y el radio \( |x| \) aumenta, la amplitud de la onda disminuye. Esta disminución en la amplitud se interpreta como una disminución en la intensidad o &amp;quot;altura&amp;quot; de la onda (del agua, por ejemplo) a medida que se propaga a través del espacio en dos dimensiones.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 3===&lt;br /&gt;
La solución fundamental en dimensión 2, \( K_3(x, t) \), se define como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_3(x, t) = \frac{\delta(|x| - ct)}{4\pi c|x|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde \( \delta(|x| - ct) \) representa la función delta de Dirac. Esta función modela cómo una perturbación inicial, localizada en un radio \( ct \) del origen, se propaga en el espacio tridimensional. La presencia de la función delta de Dirac garantiza que la perturbación solo se propague en un radio \( ct \) del origen. Comenzamos, como en los dos apartados anteriores, graficando la función. En este caso, no se puede representar en un mismo video cómo varía en función de \( x,y,z \) y \(t\) de manera clara. De modo que se ha optado por representar en un primer lugar un video de la relación entre  \( x,y,z \) fijando \( t=1 \):&lt;br /&gt;
&lt;br /&gt;
[CODIGO-GIF]&lt;br /&gt;
&lt;br /&gt;
Observamos que se trata de una sección de esfera hueca,  debido a la presencia de la función delta de Dirac en el numerador. ¿Qué pasa si fijamos \(z\) y variamos \(t\)?&lt;br /&gt;
&lt;br /&gt;
[CODIGO-GIF]&lt;br /&gt;
&lt;br /&gt;
Obtenemos también una circunferencia que se va expandiendo con el tiempo. Uniendo ambas ideas podemos ver que en dimensión 3, la solución fundamental es una esfera hueca que con el tiempo va aumentando de radio y disminuyendo la intensidad del primer impulso.&lt;br /&gt;
&lt;br /&gt;
Claramente es una función que depende únicamente del radio, así pues, de manera análoga, la representamos en su variable radial.&lt;br /&gt;
&lt;br /&gt;
[CODIGO-GIF]&lt;br /&gt;
&lt;br /&gt;
Este video puede intuir que un impulso solo es percibido por el individuo en el momento en que la esfera ''lo alcanza'', y con una intensidad que va disminuyendo. Esto es fundamental en la comprensión de la propagación de ondas, conocido como el principio de Huygens.&lt;br /&gt;
&lt;br /&gt;
== Solución fundamental del problema en dimensión 2==&lt;br /&gt;
En particular, nos enfocaremos en la solución del problema en dos dimensiones. Esta solución, obtenida a través de la convolución, nos ofrece una interesante propiedad radial en &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;. ¿Qué significa esto y cómo se traduce visualmente? A lo largo de esta resolución, analizaremos cómo varía esta solución en puntos específicos, aprovechando su naturaleza radial y centrándonos en &amp;lt;math&amp;gt;x_1 &amp;gt; 0&amp;lt;/math&amp;gt;. Además, exploraremos el concepto de la solución fundamental, que surge al considerar un impulso inicial concentrado en &amp;lt;math&amp;gt;x = 0&amp;lt;/math&amp;gt;, delineando su definición matemática y su relevancia en el contexto físico. Con esta premisa, procedamos a abordar la resolución de este fascinante problema.&lt;br /&gt;
&lt;br /&gt;
Para resolver la integral de la función \( u(x,t) \) en coordenadas polares, primero necesitamos reformular la integral en términos de coordenadas polares. La integral original es:&lt;br /&gt;
&lt;br /&gt;
\( u(x,t) = \int_{\mathbb{R}^2} K_2(x-y, t) h(y) \, dy. \)&lt;br /&gt;
&lt;br /&gt;
En coordenadas polares, donde \( x = (r_x \cos \theta_x, r_x \sin \theta_x) \) y \( y = (r_y \cos \theta_y, r_y \sin \theta_y) \), la integral se transforma usando el jacobiano de la transformación polar \( r \, dr \, d\theta \):&lt;br /&gt;
&lt;br /&gt;
\( u(r_x, t) = \int_0^{2\pi} \int_0^{\infty} K_2(r, t, c) h(r \cos(\theta)) r \, dr \, d\theta, \)&lt;br /&gt;
&lt;br /&gt;
donde&lt;br /&gt;
&lt;br /&gt;
\( r = \sqrt{r_x^2 + r_y^2 - 2r_x r_y \cos(\theta)}. \)&lt;br /&gt;
&lt;br /&gt;
=== Pasos para Transformar la Integral ===&lt;br /&gt;
&lt;br /&gt;
'''1. Transformación de Coordenadas:'''&lt;br /&gt;
* Elemento de lista de viñetas: Cambiar las coordenadas cartesianas \( (x,y) \) a coordenadas polares \( (r, \theta) \).&lt;br /&gt;
* Las coordenadas \( x \) y \( y \) en polares se expresan como \( x = (r_x \cos \theta_x, r_x \sin \theta_x) \) y \( y = (r_y \cos \theta_y, r_y \sin \theta_y) \).&lt;br /&gt;
&lt;br /&gt;
'''2. Calcular el Jacobiano:'''&lt;br /&gt;
* La transformación a coordenadas polares introduce un factor adicional \( r \) en el diferencial del área, es decir, \( dx \, dy = r \, dr \, d\theta \).&lt;br /&gt;
&lt;br /&gt;
'''3. Reformular la Integral:'''&lt;br /&gt;
* Sustituir las variables y el jacobiano en la integral original:  \( u(r_x, t) = \int_0^{2\pi} \int_0^{\infty} K_2(r, t, c) h(r \cos(\theta)) r \, dr \, d\theta. \)&lt;br /&gt;
&lt;br /&gt;
'''4. Expresar \( r \):'''&lt;br /&gt;
* Expresar la distancia \( r \) en términos de \( r_x \) y \( r_y \): \( r = \sqrt{r_x^2 + r_y^2 - 2r_x r_y \cos(\theta)}. \)&lt;br /&gt;
&lt;br /&gt;
Esta reformulación permite evaluar la integral original en coordenadas polares, facilitando el cálculo en situaciones donde la simetría radial simplifica la solución.&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72517</id>
		<title>Ecuación de ondas. Grupo Eau De Parfum(EDP)</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72517"/>
				<updated>2024-05-25T17:24:17Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Soluciones fundamentales para diferentes dimensiones */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación de Ondas. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
&lt;br /&gt;
=Introducción=&lt;br /&gt;
&lt;br /&gt;
=Contexto histórico=&lt;br /&gt;
[[Archivo:alambert_edp.jpg|200px|thumb|right|Jean le Rond D'Alembert]]&lt;br /&gt;
La ecuación de onda es una ecuación diferencial en derivadas parciales lineal de segundo orden, crucial para describir la propagación de diversas ondas, como las ondas sonoras, las ondas de luz y las ondas en el agua. Su relevancia se extiende a múltiples campos, incluyendo la acústica, el electromagnetismo, la mecánica cuántica y la dinámica de fluidos. Históricamente, Jean le Rond d'Alembert fue el primero en estudiar el problema de una cuerda vibrante, como las utilizadas en instrumentos musicales, en 1746.&lt;br /&gt;
&lt;br /&gt;
=Conocimientos previos=&lt;br /&gt;
En esta sección se van a describir algunos conceptos a tener en cuenta durante todo el trabajo.&lt;br /&gt;
&lt;br /&gt;
-Principio de Huygens: Afirma que cada punto en un frente de onda actúa como una fuente de ondas secundarias que se propagan hacia adelante con la misma velocidad que la propia onda. Estas ondas secundarias se combinan para formar un nuevo frente de onda, que es tangente a todas las ondas secundarias. Es decir, cada punto del frente de onda original puede considerarse como un punto de partida para nuevas ondas que se mueven en la misma dirección que la perturbación inicial. Estas ondas secundarias tienen la misma velocidad y frecuencia que la onda original.&lt;br /&gt;
&lt;br /&gt;
Cabe destacar que vamos a utilizar [[Series de Fourier (Grupo Eau De Parfum (EDP))|Series de Furier]]&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas I=&lt;br /&gt;
Estamos considerando una cuerda vibrante que se extiende en el intervalo [0,1], con una densidad &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; y una tensión constante &amp;lt;math&amp;gt;\tau_0&amp;lt;/math&amp;gt;, lo que resulta en una velocidad de propagación &amp;lt;math&amp;gt;c=\frac{\tau_0}{d}=1&amp;lt;/math&amp;gt;. Además suponemos que la cuerda está fija en los extremos y llamamos &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt; a su posición e impulso iniciales respectivamente.&lt;br /&gt;
&lt;br /&gt;
El sistema de ecuaciones que modeliza el comportamiento de los desplazamientos transversales de la cuerda es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = u(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =u_0(x) \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = u_1(x),&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La solución general de la ecuación de ondas empleando separación de variables se puede expresar en términos de la serie de Fourier de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;. La solución tiene la forma&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty} [A_n \cos(n\pi t)+B_n \sin(n \pi t)]sin(n \pi x)  &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde los coeficientes &amp;lt;math&amp;gt;A_n&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;B_n&amp;lt;/math&amp;gt; se determinan a partir de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;.Por lo que la solución completa de a ecuación de ondas para la cuerda vibrante con las condiciones iniciales dadas es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty}[ (2\int_{0}^{1} u_0(x) \sin(n \pi x) dx) \cos(n \pi t) + (\frac{2}{n\pi} \int_{0}^{1} u_0(x) \sin(n \pi x) dx)\sin(n\pi t)] \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Cambiando datos iniciales==&lt;br /&gt;
Para resolver este problema, primero debemos calcular los coeficientes de Fourier &amp;lt;math&amp;gt; A_n &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; B_n &amp;lt;/math&amp;gt; usando los datos iniciales &amp;lt;math&amp;gt; u_0(x)=e^{-100(x-1/2)^2} &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; u_1(x)=0 &amp;lt;/math&amp;gt;. Luego, usaremos estos coeficientes para construir la solución aproximada &amp;lt;math&amp;gt; u(x,t) &amp;lt;/math&amp;gt; tomando los primeros 50 términos de la serie.&lt;br /&gt;
&lt;br /&gt;
Los coeficientes de Fourier son:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_0^1 u_0(x) \sin(n \pi x) \, dx = 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n \pi} \int_0^1 u_1(x) \sin(n \pi x) \, dx = 0 \quad (\text{porque } u_1(x) = 0).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo tanto, la solución se simplifica a:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x,t) = \sum_{n=1}^{50} A_n \cos(n \pi t) \sin(n \pi x)=\sum_{n=1}^{50}[2 \int_0^1 u_0(x) \sin(n \pi x) \, dx cos(n \pi t)] \sin(n \pi x) .&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedemos a representar la solución obteniendo:&lt;br /&gt;
[[Archivo:ejer3a_edp.png|500px|thumb|right|]]&lt;br /&gt;
[[Archivo:ejer3b_edp.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
 &lt;br /&gt;
# Definimos las funciones iniciales u0(x) y u1(x)&lt;br /&gt;
def u0(x):&lt;br /&gt;
    return np.exp(-100 * (x - 0.5) ** 2)&lt;br /&gt;
 &lt;br /&gt;
def u1(x):&lt;br /&gt;
    return np.zeros_like(x)&lt;br /&gt;
 &lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1.0&lt;br /&gt;
c = 1.0  # Velocidad de propagación de las ondas&lt;br /&gt;
N = 100  # Número de puntos para el método del trapecio&lt;br /&gt;
x = np.linspace(0, L, N)&lt;br /&gt;
 &lt;br /&gt;
# Intervalo de tiempo y número de términos de Fourier&lt;br /&gt;
T = 2.0&lt;br /&gt;
n_terms = 50&lt;br /&gt;
 &lt;br /&gt;
# Resolución temporal&lt;br /&gt;
t_steps = 200&lt;br /&gt;
t = np.linspace(0, T, t_steps)&lt;br /&gt;
 &lt;br /&gt;
# Inicialización de u(x,t)&lt;br /&gt;
u_xt = np.zeros((N, t_steps))&lt;br /&gt;
 &lt;br /&gt;
# Calculamos la solución para cada tiempo t&lt;br /&gt;
for j, tj in enumerate(t):&lt;br /&gt;
    u_t = np.zeros_like(x)&lt;br /&gt;
    for n in range(1, n_terms + 1):&lt;br /&gt;
        # Calculamos los coeficientes A_n y B_n&lt;br /&gt;
        integrand_f = u0(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        A_n = 2 * np.trapz(integrand_f, x)&lt;br /&gt;
 &lt;br /&gt;
        integrand_g = u1(x) * np.sin(n * np.pi * x / L)&lt;br /&gt;
        B_n = 2 / (n * np.pi * c) * np.trapz(integrand_g, x)&lt;br /&gt;
 &lt;br /&gt;
        # Suma de términos en la serie de Fourier&lt;br /&gt;
        u_t += (A_n * np.cos(n * np.pi * c * tj) + B_n * np.sin(n * np.pi * c * tj)) * np.sin(n * np.pi * x / L)&lt;br /&gt;
    u_xt[:, j] = u_t&lt;br /&gt;
 &lt;br /&gt;
# Graficamos la solución en diferentes tiempos&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
for j in range(0, t_steps, t_steps // 10):&lt;br /&gt;
    plt.plot(x, u_xt[:, j], label=f't={t[j]:.2f}')&lt;br /&gt;
 &lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('u(x,t)')&lt;br /&gt;
plt.title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
 &lt;br /&gt;
# Comprobamos la periodicidad en el tiempo&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
for i in range(0, N, N // 10):&lt;br /&gt;
    plt.plot(t, u_xt[i, :], label=f'x={x[i]:.2f}')&lt;br /&gt;
 &lt;br /&gt;
plt.xlabel('t')&lt;br /&gt;
plt.ylabel('u(x,t)')&lt;br /&gt;
plt.title('Periodicidad de la solución en el tiempo')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Representándolo en tres dimensiones obtenemos&lt;br /&gt;
[[Archivo:ejer3c_edp.png|350px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation, PillowWriter&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
# Graficamos la solución en 3D&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
 &lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
 &lt;br /&gt;
# Transponemos u_xt para que las dimensiones coincidan con las de X y T&lt;br /&gt;
ax.plot_surface(X, T, u_xt.T, cmap='viridis')&lt;br /&gt;
 &lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('t')&lt;br /&gt;
ax.set_zlabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Archivo:Wave_equation.gif|350px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Configuración de la animación&lt;br /&gt;
fig, ax = plt.subplots()&lt;br /&gt;
line, = ax.plot(x, u_xt[:, 0])&lt;br /&gt;
ax.set_xlim(0, L)&lt;br /&gt;
ax.set_ylim(-1.10, 1.10)&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('u(x,t)')&lt;br /&gt;
ax.set_title('Desplazamientos transversales de la cuerda')&lt;br /&gt;
 &lt;br /&gt;
# Agregar un texto que muestre el instante de tiempo&lt;br /&gt;
time_text = ax.text(0.02, 0.95, '', transform=ax.transAxes)&lt;br /&gt;
 &lt;br /&gt;
def update(frame):&lt;br /&gt;
    line.set_ydata(u_xt[:, frame])&lt;br /&gt;
    time_text.set_text(f't = {t[frame]:.2f}s')&lt;br /&gt;
    return line, time_text&lt;br /&gt;
 &lt;br /&gt;
ani = FuncAnimation(fig, update, frames=t_steps, blit=True)&lt;br /&gt;
 &lt;br /&gt;
# Guardar la animación como GIF&lt;br /&gt;
writer = PillowWriter(fps=20)&lt;br /&gt;
ani.save(&amp;quot;wave_equation.gif&amp;quot;, writer=writer)&lt;br /&gt;
 &lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La gráfica muestra la periodicidad en el tiempo de la solución &amp;lt;math&amp;gt;u(x,t) &amp;lt;/math&amp;gt;. La función claramente repite su patrón a medida que &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; varía, lo que confirma que la solución es periódica en el tiempo con un período de 2. Este período corresponde al término más lento &amp;lt;math&amp;gt; n=1 &amp;lt;/math&amp;gt;, ya que &amp;lt;math&amp;gt;\cos(\pi t)&amp;lt;/math&amp;gt; tiene un período de 2.&lt;br /&gt;
&lt;br /&gt;
La periodicidad observada es coherente con la naturaleza periódica de las funciones seno y coseno involucradas en la solución de la ecuación de la cuerda vibrante.&lt;br /&gt;
&lt;br /&gt;
==Onda en un solo sentido==&lt;br /&gt;
Veamos ahora lo que ocurre cuando estudiamos una onda que viaja en un solo sentido, es decir, &amp;lt;math&amp;gt; u(x, t) = f (x − t)&amp;lt;/math&amp;gt;. Que particularizaremos tomando como datos iniciales &amp;lt;math&amp;gt;u_0(x) = f(x)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u_1(x) = -f'(x)&amp;lt;/math&amp;gt;, con &amp;lt;math&amp;gt;f(x)=e^{-100(x-1/2)^2}&amp;lt;/math&amp;gt;. Por tanto el sistema con el que trabajamos es&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = u(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =e^{-100(x-1/2)^2} \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = 200(x-1/2)e^{-100(x-1/2)^2},&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Su solución viene dada mediante el método de separación de variables en términos de los coeficientes de Fourier:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_0^1 u_0(x) \sin(n \pi x) \, dx = 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n \pi} \int_0^1 u_1(x) \sin(n \pi x) \, dx =\frac{2}{n \pi} \int_0^1 (200(x-1/2)e^{-100(x-1/2)^2})\sin(n \pi x) \, dx&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo que la solución completa de la ecuación de ondas para la cuerda vibrante con las condiciones iniciales dadas es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty}[ ( 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx) \cos(n \pi t) + (\frac{2}{n \pi} \int_0^1 (200(x-1/2)e^{-100(x-1/2)^2})\sin(n \pi x) \, dx)\sin(n\pi t)] \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La representación gráfica de esta solución es:&lt;br /&gt;
&lt;br /&gt;
GRÁFICAAAAAAAA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Cambio en condición frontera==&lt;br /&gt;
Para comprender la diferencia entre las condiciones de frontera Dirichlet y Neumann en la ecuación de ondas, repetiremos el análisis del apartado anterior, esta vez aplicando condiciones de Neumann. En lugar de fijar los valores de la función en los extremos (condiciones de Dirichlet), estableceremos que las derivadas parciales respecto a &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; en los extremos sean cero. Es decir, consideramos las condiciones &amp;lt;math&amp;gt; u_x(0,t)=u_x(1,t)=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
Por tanto nuestro nuevo problema es&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u_x(0, t) = u_x(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =e^{-100(x-1/2)^2} \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = 200(x-1/2)e^{-100(x-1/2)^2}&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas II=&lt;br /&gt;
En esta sección, abordaremos la resolución de la ecuación de ondas en dimensiones 1, 2 y 3, una tarea que nos permitirá explorar la solución fundamental y, a su vez, comprender el principio de Huygens.&lt;br /&gt;
&lt;br /&gt;
==Soluciones fundamentales para diferentes dimensiones==&lt;br /&gt;
Comenzamos estudiando la solución fundamental, que surge como respuesta a un impulso inicial localizado en \( x = 0 \). Formalmente, se define mediante límites y funciones características. El objetivo es observar y graficar las soluciones fundamentales en su forma radial para cada dimensión, lo que nos ayudará a comprender mejor la naturaleza de las ondas en diferentes entornos dimensionales.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 1===&lt;br /&gt;
La solución fundamental en dimensión 1, \( K_1(x, t) \), se define como:&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_1(x, t) = \frac{1}{2c} \left[ H(x + ct) - H(x - ct) \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde \( H(s) \) es la función de Heaviside, dada por:&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H(s) = \begin{cases}&lt;br /&gt;
0, &amp;amp; \text{si } s &amp;lt; 0 \\&lt;br /&gt;
1, &amp;amp; \text{si } s \geq 0&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dicha función, \( K_1(x, t) \), se compone de dos funciones de Heaviside desplazadas horizontalmente a lo largo del eje \( x \) en \( ct \) y \( -ct \) y luego divididas por \( 2c \). Esto significa que en el intervalo \( (-\infty, -ct) \), \( K_1(x, t) \) es 0, luego aumenta a 1 en el intervalo \( (-ct, ct) \), y finalmente vuelve a 0 en el intervalo \( (ct, \infty) \). La constante \( c \) controla la velocidad de propagación de la onda, que hemos exigido \(1\). Graficamos la función para tener una primera idea intuitiva de la solución fundamental:&lt;br /&gt;
&lt;br /&gt;
[CODIGO-IMAGEN]&lt;br /&gt;
&lt;br /&gt;
Visualmente, la gráfica de \( K_1(x, t) \) parece una función escalón, donde hay un cambio abrupto en el valor de la función en \( x = \pm ct \). Esto refleja la propagación de una onda con velocidad \( c \) a lo largo del eje \( x \).  Además, debido a que su valor depende únicamente de la distancia radial desde el origen, es decir, de la magnitud de \( x \), podemos decir que se trata de una función radial y, por tanto, graficarla de esta forma. En la expresión de \( K_1(x, t) \), la variable \( x \) aparece únicamente como \( x \pm ct \), lo que permite su reescritura como \( K_1(r, t) \), donde \( r = |x| \) es la distancia radial.&lt;br /&gt;
&lt;br /&gt;
[CODIGO-GIF]&lt;br /&gt;
&lt;br /&gt;
Al graficar \( K_1(r, t) \) como función de \( r \) para diferentes valores de \( t \), se observa que la forma de la curva es la misma independientemente de la dirección específica en la que nos movamos desde el origen, lo que confirma su carácter radial.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 2===&lt;br /&gt;
La solución fundamental en dimensión 2, \( K_2(x, t) \), se define como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K2(x, t) = \frac{1}{2\pi c p} \frac{1}{c^2 t^2 - |x|^2} \chi_B(0,ct)(x),&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
donde \(\chi_B(0,ct)(x)\) es la función característica de la bola de centro (\ 0 \) y radio (\ c \cdot t \). Esta función describe cómo una perturbación inicial, localizada en el centro de una bola de radio \( ct \), se propaga a lo largo del plano. La función característica \( \chi_B(0, ct)(x) \) asegura que la perturbación solo se propague dentro de esta bola. La presencia del término \( \frac{1}{c^2 t^2 - |x|^2} \) indica cómo la amplitud de la onda varía con la distancia desde el centro de la bola y el tiempo. Mostraremos gráficamente esta función para tener una primera idea intuitiva. Se mostrará un video que varía en función del tiempo:&lt;br /&gt;
&lt;br /&gt;
[CODIGO-GIF]&lt;br /&gt;
&lt;br /&gt;
Claramente se trata de una función radial, de manera que podemos representar una sección transversal de la función. Esto es, representarla en la variable radial:&lt;br /&gt;
&lt;br /&gt;
[CODIGO-GIF]&lt;br /&gt;
&lt;br /&gt;
Observamos la presencia de una asíntota en \( K_2(x, t) \). Esta asíntota refleja cómo la amplitud de la onda se acerca a cero cuando el denominador se aproxima a cero. Sin embargo, a medida que el tiempo avanza y el radio \( |x| \) aumenta, la amplitud de la onda disminuye. Esta disminución en la amplitud se interpreta como una disminución en la intensidad o &amp;quot;altura&amp;quot; de la onda (del agua, por ejemplo) a medida que se propaga a través del espacio en dos dimensiones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 3===&lt;br /&gt;
La solución fundamental en dimensión 2, \( K_3(x, t) \), se define como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
K_3(x, t) = \frac{\delta(|x| - ct)}{4\pi c|x|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
donde \( \delta(|x| - ct) \) representa la función delta de Dirac. Esta función modela cómo una perturbación inicial, localizada en un radio \( ct \) del origen, se propaga en el espacio tridimensional. La presencia de la función delta de Dirac garantiza que la perturbación solo se propague en un radio \( ct \) del origen. Comenzamos, como en los dos apartados anteriores, graficando la función. En este caso, no se puede representar en un mismo video cómo varía en función de \( x,y,z \) y \(t\) de manera clara. De modo que se ha optado por representar en un primer lugar un video de la relación entre  \( x,y,z \) fijando \( t=1 \):&lt;br /&gt;
&lt;br /&gt;
[CODIGO-GIF]&lt;br /&gt;
&lt;br /&gt;
Observamos que se trata de una sección de esfera hueca,  debido a la presencia de la función delta de Dirac en el numerador. ¿Qué pasa si fijamos \(z\) y variamos \(t\)?&lt;br /&gt;
&lt;br /&gt;
[CODIGO-GIF]&lt;br /&gt;
&lt;br /&gt;
Obtenemos también una circunferencia que se va expandiendo con el tiempo. Uniendo ambas ideas podemos ver que en dimensión 3, la solución fundamental es una esfera hueca que con el tiempo va aumentando de radio y disminuyendo la intensidad del primer impulso.&lt;br /&gt;
&lt;br /&gt;
Claramente es una función que depende únicamente del radio, así pues, de manera análoga, la representamos en su variable radial.&lt;br /&gt;
&lt;br /&gt;
[CODIGO-GIF]&lt;br /&gt;
&lt;br /&gt;
Este video puede intuir que un impulso solo es percibido por el individuo en el momento en que la esfera ''lo alcanza'', y con una intensidad que va disminuyendo. Esto es fundamental en la comprensión de la propagación de ondas, conocido como el principio de Huygens.&lt;br /&gt;
&lt;br /&gt;
== Solución fundamental del problema en dimensión 2==&lt;br /&gt;
En particular, nos enfocaremos en la solución del problema en dos dimensiones. Esta solución, obtenida a través de la convolución, nos ofrece una interesante propiedad radial en &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;. ¿Qué significa esto y cómo se traduce visualmente? A lo largo de esta resolución, analizaremos cómo varía esta solución en puntos específicos, aprovechando su naturaleza radial y centrándonos en &amp;lt;math&amp;gt;x_1 &amp;gt; 0&amp;lt;/math&amp;gt;. Además, exploraremos el concepto de la solución fundamental, que surge al considerar un impulso inicial concentrado en &amp;lt;math&amp;gt;x = 0&amp;lt;/math&amp;gt;, delineando su definición matemática y su relevancia en el contexto físico. Con esta premisa, procedamos a abordar la resolución de este fascinante problema.&lt;br /&gt;
&lt;br /&gt;
Para resolver la integral de la función \( u(x,t) \) en coordenadas polares, primero necesitamos reformular la integral en términos de coordenadas polares. La integral original es:&lt;br /&gt;
&lt;br /&gt;
\( u(x,t) = \int_{\mathbb{R}^2} K_2(x-y, t) h(y) \, dy. \)&lt;br /&gt;
&lt;br /&gt;
En coordenadas polares, donde \( x = (r_x \cos \theta_x, r_x \sin \theta_x) \) y \( y = (r_y \cos \theta_y, r_y \sin \theta_y) \), la integral se transforma usando el jacobiano de la transformación polar \( r \, dr \, d\theta \):&lt;br /&gt;
&lt;br /&gt;
\( u(r_x, t) = \int_0^{2\pi} \int_0^{\infty} K_2(r, t, c) h(r \cos(\theta)) r \, dr \, d\theta, \)&lt;br /&gt;
&lt;br /&gt;
donde&lt;br /&gt;
&lt;br /&gt;
\( r = \sqrt{r_x^2 + r_y^2 - 2r_x r_y \cos(\theta)}. \)&lt;br /&gt;
&lt;br /&gt;
=== Pasos para Transformar la Integral ===&lt;br /&gt;
&lt;br /&gt;
'''1. Transformación de Coordenadas:'''&lt;br /&gt;
* Elemento de lista de viñetas: Cambiar las coordenadas cartesianas \( (x,y) \) a coordenadas polares \( (r, \theta) \).&lt;br /&gt;
* Las coordenadas \( x \) y \( y \) en polares se expresan como \( x = (r_x \cos \theta_x, r_x \sin \theta_x) \) y \( y = (r_y \cos \theta_y, r_y \sin \theta_y) \).&lt;br /&gt;
&lt;br /&gt;
'''2. Calcular el Jacobiano:'''&lt;br /&gt;
* La transformación a coordenadas polares introduce un factor adicional \( r \) en el diferencial del área, es decir, \( dx \, dy = r \, dr \, d\theta \).&lt;br /&gt;
&lt;br /&gt;
'''3. Reformular la Integral:'''&lt;br /&gt;
* Sustituir las variables y el jacobiano en la integral original:  \( u(r_x, t) = \int_0^{2\pi} \int_0^{\infty} K_2(r, t, c) h(r \cos(\theta)) r \, dr \, d\theta. \)&lt;br /&gt;
&lt;br /&gt;
'''4. Expresar \( r \):'''&lt;br /&gt;
* Expresar la distancia \( r \) en términos de \( r_x \) y \( r_y \): \( r = \sqrt{r_x^2 + r_y^2 - 2r_x r_y \cos(\theta)}. \)&lt;br /&gt;
&lt;br /&gt;
Esta reformulación permite evaluar la integral original en coordenadas polares, facilitando el cálculo en situaciones donde la simetría radial simplifica la solución.&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72318</id>
		<title>Ecuación de ondas. Grupo Eau De Parfum(EDP)</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72318"/>
				<updated>2024-05-24T11:20:38Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Ecuación de ondas II */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación de Ondas. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
&lt;br /&gt;
=Introducción=&lt;br /&gt;
&lt;br /&gt;
=Contexto histórico=&lt;br /&gt;
&lt;br /&gt;
=Conocimientos previos=&lt;br /&gt;
En esta sección se van a describir algunos conceptos a tener en cuenta durante todo el trabajo.&lt;br /&gt;
&lt;br /&gt;
-Principio de Huygens: Afirma que cada punto en un frente de onda actúa como una fuente de ondas secundarias que se propagan hacia adelante con la misma velocidad que la propia onda. Estas ondas secundarias se combinan para formar un nuevo frente de onda, que es tangente a todas las ondas secundarias. Es decir, cada punto del frente de onda original puede considerarse como un punto de partida para nuevas ondas que se mueven en la misma dirección que la perturbación inicial. Estas ondas secundarias tienen la misma velocidad y frecuencia que la onda original.&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas I=&lt;br /&gt;
Estamos considerando una cuerda vibrante que se extiende en el intervalo [0,1], con una densidad &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; y una tensión constante &amp;lt;math&amp;gt;\tau_0&amp;lt;/math&amp;gt;, lo que resulta en una velocidad de propagación &amp;lt;math&amp;gt;c=\frac{\tau_0}{d}=1&amp;lt;/math&amp;gt;. Además suponemos que la cuerda está fija en los extremos y llamamos &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt; a su posición e impulso iniciales respectivamente.&lt;br /&gt;
&lt;br /&gt;
El sistema de ecuaciones que modeliza el comportamiento de los desplazamientos transversales de la cuerda es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = u(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =u_0(x), &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = u_1(x),&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La solución general de la ecuación de ondas empleando separación de variables se puede expresar en términos de la serie de Fourier de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;. La solución tiene la forma&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty} [A_n \cos(n\pi t)+B_n \sin(n \pi t)]sin(n \pi x)  &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde los coeficientes &amp;lt;math&amp;gt;A_n&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;B_n&amp;lt;/math&amp;gt; se determinan a partir de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;.Por lo que la solución completa de a ecuación de ondas para la cuerda vibrante con las condiciones iniciales dadas es:&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty}[ (2\int_{0}^{1} u_0(x) \sin(n \pi x) dx) \cos(n \pi t) + (\frac{2}{n\pi} \int_{0}^{1} u_0(x) \sin(n \pi x) dx)\sin(n\pi t)] \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Cambiando datos iniciales==&lt;br /&gt;
Para resolver este problema, primero debemos calcular los coeficientes de Fourier &amp;lt;math&amp;gt; A_n &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; B_n &amp;lt;/math&amp;gt; usando los datos iniciales &amp;lt;math&amp;gt; u_0(x)=e^{-100(x-1/2)^2} &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; u_1(x)=0 &amp;lt;/math&amp;gt;. Luego, usaremos estos coeficientes para construir la solución aproximada &amp;lt;math&amp;gt; u(x,t) &amp;lt;/math&amp;gt; tomando los primeros 50 términos de la serie.&lt;br /&gt;
&lt;br /&gt;
Los coeficientes de Fourier son:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_0^1 u_0(x) \sin(n \pi x) \, dx = 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n \pi} \int_0^1 u_1(x) \sin(n \pi x) \, dx = 0 \quad (\text{porque } u_1(x) = 0).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo tanto, la solución se simplifica a:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x,t) = \sum_{n=1}^{50} A_n \cos(n \pi t) \sin(n \pi x)=\sum_{n=1}^{50}[2 \int_0^1 u_0(x) \sin(n \pi x) \, dx cos(n \pi t)] \sin(n \pi x) .&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GRÁFICAAAAAAS&lt;br /&gt;
&lt;br /&gt;
La gráfica revela la periodicidad en el tiempo de la solución &amp;lt;math&amp;gt;u(x,t) &amp;lt;/math&amp;gt;. La función claramente repite su patrón a medida que &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; varía, confirmando que la solución es periódica en el tiempo con un período fundamental de 2. Este período corresponde al término más lento &amp;lt;math&amp;gt; n=1 &amp;lt;/math&amp;gt;, ya que &amp;lt;math&amp;gt;\cos(\pi t)&amp;lt;/math&amp;gt; tiene un período de 2.&lt;br /&gt;
&lt;br /&gt;
La periodicidad observada es consistente con la naturaleza periódica de las funciones seno y coseno involucradas en la solución de la ecuación de la cuerda vibrante.&lt;br /&gt;
&lt;br /&gt;
==Onda en un solo sentido==&lt;br /&gt;
Veamos ahora lo que ocurre cuando estudiamos una onda que viaja en un solo sentido, es decir, &amp;lt;math&amp;gt; u(x, t) = f (x − t)&amp;lt;/math&amp;gt;, que particularizaremos tomando como datos iniciales &amp;lt;math&amp;gt;u_0(x) = f(x)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u_1(x) = -f'(x)&amp;lt;/math&amp;gt;, con &amp;lt;math&amp;gt;f(x)=e^{-100(x-1/2)^2}&amp;lt;/math&amp;gt;.Su solución viene dada mediante el método de separación de variables en términos de los coeficientes de Fourier:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
A_n = 2 \int_0^1 u_0(x) \sin(n \pi x) \, dx = 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
B_n = \frac{2}{n \pi} \int_0^1 u_1(x) \sin(n \pi x) \, dx =\frac{2}{n \pi} \int_0^1 -(-200(x-1/2)e^{-100(x-1/2)^2})\sin(n \pi x) \, dx&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Por lo que la solución completa de la ecuación de ondas para la cuerda vibrante con las condiciones iniciales dadas es:&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty}[ ( 2 \int_0^1 e^{-100(x-1/2)^2} \sin(n \pi x) \, dx) \cos(n \pi t) + (\frac{2}{n \pi} \int_0^1 -(-200(x-1/2)e^{-100(x-1/2)^2})\sin(n \pi x) \, dx)\sin(n\pi t)] \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas II=&lt;br /&gt;
En esta sección, abordaremos la resolución de la ecuación de ondas en dimensiones 1, 2 y 3, una tarea que nos permitirá explorar la solución fundamental y, a su vez, comprender el principio de Huygens.&lt;br /&gt;
&lt;br /&gt;
==Soluciones fundamentales para diferentes dimensiones==&lt;br /&gt;
Comenzamos estudiando la solución fundamental, que surge como respuesta a un impulso inicial localizado en \( x = 0 \). Formalmente, se define mediante límites y funciones características. El objetivo es observar y graficar las soluciones fundamentales en su forma radial para cada dimensión, lo que nos ayudará a comprender mejor la naturaleza de las ondas en diferentes entornos dimensionales.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 1===&lt;br /&gt;
La solución fundamental en dimensión 1, \( K_1(x, t) \), se define como:&lt;br /&gt;
&lt;br /&gt;
\(&lt;br /&gt;
K_1(x, t) = \frac{1}{2c} \left[ H(x + ct) - H(x - ct) \right]&lt;br /&gt;
\)&lt;br /&gt;
&lt;br /&gt;
donde \( H(s) \) es la función de Heaviside, dada por:&lt;br /&gt;
&lt;br /&gt;
\(&lt;br /&gt;
H(s) = \begin{cases}&lt;br /&gt;
0, &amp;amp; \text{si } s &amp;lt; 0 \\&lt;br /&gt;
1, &amp;amp; \text{si } s \geq 0&lt;br /&gt;
\end{cases}&lt;br /&gt;
\)&lt;br /&gt;
&lt;br /&gt;
Dicha función, \( K_1(x, t) \), se compone de dos funciones de Heaviside desplazadas horizontalmente a lo largo del eje \( x \) en \( ct \) y \( -ct \) y luego divididas por \( 2c \). Esto significa que en el intervalo \( (-\infty, -ct) \), \( K_1(x, t) \) es 0, luego aumenta a 1 en el intervalo \( (-ct, ct) \), y finalmente vuelve a 0 en el intervalo \( (ct, \infty) \). La constante \( c \) controla la velocidad de propagación de la onda, que hemos exigido \(1\). Graficamos la función para tener una primera idea intuitiva de la solución fundamental:&lt;br /&gt;
&lt;br /&gt;
[CODIGO-IMAGEN]&lt;br /&gt;
&lt;br /&gt;
Visualmente, la gráfica de \( K_1(x, t) \) parece una función escalón, donde hay un cambio abrupto en el valor de la función en \( x = \pm ct \). Esto refleja la propagación de una onda con velocidad \( c \) a lo largo del eje \( x \).  Además, debido a que su valor depende únicamente de la distancia radial desde el origen, es decir, de la magnitud de \( x \), podemos decir que se trata de una función radial y, por tanto, graficarla de esta forma. En la expresión de \( K_1(x, t) \), la variable \( x \) aparece únicamente como \( x \pm ct \), lo que permite su reescritura como \( K_1(r, t) \), donde \( r = |x| \) es la distancia radial.&lt;br /&gt;
&lt;br /&gt;
[CODIGO-GIF]&lt;br /&gt;
&lt;br /&gt;
Al graficar \( K_1(r, t) \) como función de \( r \) para diferentes valores de \( t \), se observa que la forma de la curva es la misma independientemente de la dirección específica en la que nos movamos desde el origen, lo que confirma su carácter radial.&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental en dimensión 2===&lt;br /&gt;
La solución fundamental en dimensión 2, \( K_1(x, t) \), se define como:&lt;br /&gt;
&lt;br /&gt;
\(&lt;br /&gt;
K_1(x, t) = \frac{1}{2c} \left[ H(x + ct) - H(x - ct) \right]&lt;br /&gt;
\])&lt;br /&gt;
&lt;br /&gt;
donde \( H(s) \) es la función de Heaviside, dada por:&lt;br /&gt;
&lt;br /&gt;
\(&lt;br /&gt;
H(s) = \begin{cases}&lt;br /&gt;
0, &amp;amp; \text{si } s &amp;lt; 0 \\&lt;br /&gt;
1, &amp;amp; \text{si } s \geq 0&lt;br /&gt;
\end{cases}&lt;br /&gt;
\)&lt;br /&gt;
&lt;br /&gt;
== Solución fundamental del problema en dimensión 2==&lt;br /&gt;
En particular, nos enfocaremos en la solución del problema en dos dimensiones. Esta solución, obtenida a través de la convolución, nos ofrece una interesante propiedad radial en &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;. ¿Qué significa esto y cómo se traduce visualmente? A lo largo de esta resolución, analizaremos cómo varía esta solución en puntos específicos, aprovechando su naturaleza radial y centrándonos en &amp;lt;math&amp;gt;x_1 &amp;gt; 0&amp;lt;/math&amp;gt;. Además, exploraremos el concepto de la solución fundamental, que surge al considerar un impulso inicial concentrado en &amp;lt;math&amp;gt;x = 0&amp;lt;/math&amp;gt;, delineando su definición matemática y su relevancia en el contexto físico. Con esta premisa, procedamos a abordar la resolución de este fascinante problema.&lt;br /&gt;
&lt;br /&gt;
Para resolver la integral de la función \( u(x,t) \) en coordenadas polares, primero necesitamos reformular la integral en términos de coordenadas polares. La integral original es:&lt;br /&gt;
&lt;br /&gt;
\( u(x,t) = \int_{\mathbb{R}^2} K_2(x-y, t) h(y) \, dy. \)&lt;br /&gt;
&lt;br /&gt;
En coordenadas polares, donde \( x = (r_x \cos \theta_x, r_x \sin \theta_x) \) y \( y = (r_y \cos \theta_y, r_y \sin \theta_y) \), la integral se transforma usando el jacobiano de la transformación polar \( r \, dr \, d\theta \):&lt;br /&gt;
&lt;br /&gt;
\( u(r_x, t) = \int_0^{2\pi} \int_0^{\infty} K_2(r, t, c) h(r \cos(\theta)) r \, dr \, d\theta, \)&lt;br /&gt;
&lt;br /&gt;
donde&lt;br /&gt;
&lt;br /&gt;
\( r = \sqrt{r_x^2 + r_y^2 - 2r_x r_y \cos(\theta)}. \)&lt;br /&gt;
&lt;br /&gt;
=== Pasos para Transformar la Integral ===&lt;br /&gt;
&lt;br /&gt;
'''1. Transformación de Coordenadas:'''&lt;br /&gt;
* Elemento de lista de viñetas: Cambiar las coordenadas cartesianas \( (x,y) \) a coordenadas polares \( (r, \theta) \).&lt;br /&gt;
* Las coordenadas \( x \) y \( y \) en polares se expresan como \( x = (r_x \cos \theta_x, r_x \sin \theta_x) \) y \( y = (r_y \cos \theta_y, r_y \sin \theta_y) \).&lt;br /&gt;
&lt;br /&gt;
'''2. Calcular el Jacobiano:'''&lt;br /&gt;
* La transformación a coordenadas polares introduce un factor adicional \( r \) en el diferencial del área, es decir, \( dx \, dy = r \, dr \, d\theta \).&lt;br /&gt;
&lt;br /&gt;
'''3. Reformular la Integral:'''&lt;br /&gt;
* Sustituir las variables y el jacobiano en la integral original:  \( u(r_x, t) = \int_0^{2\pi} \int_0^{\infty} K_2(r, t, c) h(r \cos(\theta)) r \, dr \, d\theta. \)&lt;br /&gt;
&lt;br /&gt;
'''4. Expresar \( r \):'''&lt;br /&gt;
* Expresar la distancia \( r \) en términos de \( r_x \) y \( r_y \): \( r = \sqrt{r_x^2 + r_y^2 - 2r_x r_y \cos(\theta)}. \)&lt;br /&gt;
&lt;br /&gt;
Esta reformulación permite evaluar la integral original en coordenadas polares, facilitando el cálculo en situaciones donde la simetría radial simplifica la solución.&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72149</id>
		<title>Ecuación de ondas. Grupo Eau De Parfum(EDP)</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_ondas._Grupo_Eau_De_Parfum(EDP)&amp;diff=72149"/>
				<updated>2024-05-20T07:55:05Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Ecuación de ondas II */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación de Ondas. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
&lt;br /&gt;
=Introducción=&lt;br /&gt;
&lt;br /&gt;
=Contexto histórico=&lt;br /&gt;
&lt;br /&gt;
=Conocimientos previos=&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas I=&lt;br /&gt;
Estamos considerando una cuerda vibrante que se extiende en el intervalo [0,1], con una densidad &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; y una tensión constante &amp;lt;math&amp;gt;\tau_0&amp;lt;/math&amp;gt;, lo que resulta en una velocidad de propagación &amp;lt;math&amp;gt;c=\frac{\tau_0}{d}=1&amp;lt;/math&amp;gt;. Además suponemos que la cuerda está fija en los extremos y llamamos &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt; a su posición e impulso iniciales respectivamente.&lt;br /&gt;
&lt;br /&gt;
El sistema de ecuaciones que modeliza el comportamiento de los desplazamientos transversales de la cuerda es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_{tt}(x,t) = u_{xx}(x,t)  &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = u(1, t)=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) =u_0(x), &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u_t(x, 0) = u_1(x),&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La solución general de la ecuación de ondas empleando separación de variables se puede expresar en términos de la serie de Fourier de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;. La solución tiene la forma&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty} [A_n \cos(n\pi x)+B_n \sin(n \pi x)]sin(n \pi x)  &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde los coeficientes &amp;lt;math&amp;gt;A_n&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;B_n&amp;lt;/math&amp;gt; se determinan a partir de las condiciones iniciales &amp;lt;math&amp;gt;u_0(x)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;u_1(x)&amp;lt;/math&amp;gt;.Por lo que la solución completa de a ecuación de ondas para la cuerda vibrante con las condiciones iniciales dadas es:&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t)=\sum_{n=1}^{\infty}[ (2\int_{0}^{1} u_0(x) \sin(n \pi x) dx) \cos(n \pi x) + (\frac{2}{n\pi} \int_{0}^{1} u_0(x) \sin(n \pi x) dx)\sin(n\pi t)] \sin(n\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ecuación de ondas II=&lt;br /&gt;
&lt;br /&gt;
Para resolver la integral de la función \( u(x,t) \) en coordenadas polares, primero necesitamos reformular la integral en términos de coordenadas polares. La integral original es:&lt;br /&gt;
&lt;br /&gt;
\( u(x,t) = \int_{\mathbb{R}^2} K_2(x-y, t) h(y) \, dy. \)&lt;br /&gt;
&lt;br /&gt;
En coordenadas polares, donde \( x = (r_x \cos \theta_x, r_x \sin \theta_x) \) y \( y = (r_y \cos \theta_y, r_y \sin \theta_y) \), la integral se transforma usando el jacobiano de la transformación polar \( r \, dr \, d\theta \):&lt;br /&gt;
&lt;br /&gt;
\( u(r_x, t) = \int_0^{2\pi} \int_0^{\infty} K_2(r, t, c) h(r \cos(\theta)) r \, dr \, d\theta, \)&lt;br /&gt;
&lt;br /&gt;
donde&lt;br /&gt;
&lt;br /&gt;
\( r = \sqrt{r_x^2 + r_y^2 - 2r_x r_y \cos(\theta)}. \)&lt;br /&gt;
&lt;br /&gt;
=== Pasos para Transformar la Integral ===&lt;br /&gt;
&lt;br /&gt;
'''1. Transformación de Coordenadas:'''&lt;br /&gt;
* Elemento de lista de viñetas: Cambiar las coordenadas cartesianas \( (x,y) \) a coordenadas polares \( (r, \theta) \).&lt;br /&gt;
* Las coordenadas \( x \) y \( y \) en polares se expresan como \( x = (r_x \cos \theta_x, r_x \sin \theta_x) \) y \( y = (r_y \cos \theta_y, r_y \sin \theta_y) \).&lt;br /&gt;
&lt;br /&gt;
'''2. Calcular el Jacobiano:'''&lt;br /&gt;
* La transformación a coordenadas polares introduce un factor adicional \( r \) en el diferencial del área, es decir, \( dx \, dy = r \, dr \, d\theta \).&lt;br /&gt;
&lt;br /&gt;
'''3. Reformular la Integral:'''&lt;br /&gt;
* Sustituir las variables y el jacobiano en la integral original:  \( u(r_x, t) = \int_0^{2\pi} \int_0^{\infty} K_2(r, t, c) h(r \cos(\theta)) r \, dr \, d\theta. \)&lt;br /&gt;
&lt;br /&gt;
'''4. Expresar \( r \):'''&lt;br /&gt;
* Expresar la distancia \( r \) en términos de \( r_x \) y \( r_y \): \( r = \sqrt{r_x^2 + r_y^2 - 2r_x r_y \cos(\theta)}. \)&lt;br /&gt;
&lt;br /&gt;
Esta reformulación permite evaluar la integral original en coordenadas polares, facilitando el cálculo en situaciones donde la simetría radial simplifica la solución.&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_Laplace_y_de_Poisson._Grupo_Eau_De_Parfum_(EDP))&amp;diff=71801</id>
		<title>Ecuación de Laplace y de Poisson. Grupo Eau De Parfum (EDP))</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_Laplace_y_de_Poisson._Grupo_Eau_De_Parfum_(EDP))&amp;diff=71801"/>
				<updated>2024-04-19T21:16:06Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Desigualdad de Harnack */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación de Laplace y de Poisson. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
&lt;br /&gt;
=Introducción=&lt;br /&gt;
Este trabajo consistirá en el estudio&lt;br /&gt;
&lt;br /&gt;
=Contexto histórico=&lt;br /&gt;
[[Archivo:laplace_edp.jpg|200px|thumb|right|Pierre-Simon Laplace]]&lt;br /&gt;
Los estudios de fenómenos eléctricos y magnéticos tomaron forma a finales del siglo XVIII, estableciendo la electrostática y la magnetostática como disciplinas matemáticas al estilo newtoniano.&lt;br /&gt;
Dentro de esta rama, Poisson destacó como uno de sus pioneros, ya que entre otras contribuciones amplió y profundizó los estudios sobre el potencial gravitatorio realizados previamente por Euler, Lagrange y Laplace. En 1785, Laplace había propuesto que la variación del potencial en cualquier punto, ya sea dentro o fuera de un cuerpo que ejerce una atracción gravitatoria, se rige por la ecuación que hoy lleva su nombre.&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
\Delta u={\partial^2 u\over \partial x^2 } +&lt;br /&gt;
{\partial^2 u\over \partial y^2 } +&lt;br /&gt;
{\partial^2 u\over \partial z^2 } = 0.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
siendo u una función real.&lt;br /&gt;
Sin embargo, Poisson identificó en 1812 que esta ecuación no era aplicable a puntos (x,y,z) dentro del cuerpo atrayente. Así, reformuló la ecuación, conocida ahora como la ecuación de Poisson&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
\Delta u={\partial^2 u\over \partial x^2 } +&lt;br /&gt;
{\partial^2 u\over \partial y^2 } +&lt;br /&gt;
{\partial^2 u\over \partial z^2 } = f(x,y,z).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Conocimientos previos=&lt;br /&gt;
[[Archivo:Poisson_edp.jpg|200px|thumb|right|Siméon-Denis Poisson]]&lt;br /&gt;
Antes de comenzar será de gran ayuda introducir una serie de conceptos que utilizaremos a lo largo de este trabajo:&lt;br /&gt;
&lt;br /&gt;
'''Función armónica''':Una función &amp;lt;math&amp;gt;u \in C^{2}(\Omega)&amp;lt;/math&amp;gt;es armónica si &amp;lt;math&amp;gt;\Delta u =0&amp;lt;/math&amp;gt;, es decir, si &amp;lt;math&amp;gt;u &amp;lt;/math&amp;gt; es solución de la ecuación de Laplace.&lt;br /&gt;
&lt;br /&gt;
'''Desigualdad de Harnack''':Sea u armónica y &amp;lt;math&amp;gt;u \geq 0&amp;lt;/math&amp;gt; en &amp;lt;math&amp;gt;\Omega \subset \mathbb{R}^n &amp;lt;/math&amp;gt;. Supongamos &amp;lt;math&amp;gt;\overline{B_{R}}(z) \subset \Omega&amp;lt;/math&amp;gt;. Entonces &amp;lt;math&amp;gt;\forall x \in \overline{B_{R}}(z) \text{ con } |z-x|=r &amp;lt; R&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;{R^{n-2} (R-r)\over (R+r)^{n-1}} u(z)\le u(x)\le {R^{n-2}(R+r)\over (R-r)^{n-1}}u(z).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Solución fundamental''':La solución fundamental de la ecuación de Poisson es una función &amp;lt;math&amp;gt;\Phi&amp;lt;/math&amp;gt; tal que &amp;lt;math&amp;gt;\Delta \Phi =\delta&amp;lt;/math&amp;gt;, donde &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; representa la función de Dirichlet. Esta solución es fundamental en el sentido de que sirve como  generadora de soluciones más generales para la ecuación de Poisson bajo diversas condiciones de frontera.&lt;br /&gt;
&lt;br /&gt;
'''Fórmula de Poisson ''':La única solución  &amp;lt;math&amp;gt; u \in C^2(B_R(x_0))\cap C(\overline {B_R})&amp;lt;/math&amp;gt; del problema de Laplace  &amp;lt;math&amp;gt; \left \{ \begin{array}{ll} &lt;br /&gt;
&lt;br /&gt;
\Delta u=0, x\in B_R\\ &lt;br /&gt;
&lt;br /&gt;
u=g, x\in \partial B_R \\&lt;br /&gt;
\end{array} \right. &lt;br /&gt;
&amp;lt;/math&amp;gt;, se conoce como fórmula de Poisson, siendo su expresión :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x) = \frac{R^2 - |x - x_0|^2}{\omega_n R} \int_{\partial B_R(x_0)} \frac{g(\sigma)}{| (x - x_0)-\sigma|^n} d\sigma&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
donde &amp;lt;math&amp;gt; \omega_n &amp;lt;/math&amp;gt; representa la medida de la superficie de la esfera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cabe destacar que vamos a utilizar [[Series de Fourier (Grupo Eau De Parfum (EDP))|Series de Furier]]&lt;br /&gt;
&lt;br /&gt;
=Ecuación de Laplace=&lt;br /&gt;
Para iniciar el análisis de la ecuación de Laplace, primero es necesario plantear el problema que se desea resolver.&lt;br /&gt;
&lt;br /&gt;
Consideremos &amp;lt;math&amp;gt;B_1 \subset \mathbb{R}^2&amp;lt;/math&amp;gt; como la bola unidad centrada en el origen &amp;lt;math&amp;gt;(0, 0)&amp;lt;/math&amp;gt;. Analizaremos el siguiente problema:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\left \{ \begin{array}{ll}  &lt;br /&gt;
 \Delta u = 0, &amp;amp; x \in B_1 \\&lt;br /&gt;
 u = g, &amp;amp; x \in \partial B_1&lt;br /&gt;
\end{array} \right.  &lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nuestro objetivo es visualizar la solución de la ecuación de Laplace descrita arriba, empleando la fórmula de Poisson y las series de Fourier. Además, experimentaremos con cambios de la función frontera &amp;lt;math&amp;gt;g&amp;lt;/math&amp;gt; para observar cómo afectan la solución.&lt;br /&gt;
&lt;br /&gt;
==Solución de la ecuación de Laplace usando la fórmula de Poisson==&lt;br /&gt;
Tomaremos nuestro sistema en coordenadas polares &amp;lt;math&amp;gt;(r,\theta)&amp;lt;/math&amp;gt;, siendo la función frontera &amp;lt;math&amp;gt; g(\theta) = \max\left\{0, 1 - \frac{2}{\pi} |\theta - \pi|\right\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nos centraremos en resolver el problema descrito anteriormente utilizando la fórmula de Poisson en la bola de radio 1 centrada en el origen, que en coordenadas polares tiene la siguiente expresión:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; u(r,\theta)=\frac{1-r^2}{2\pi}\int_{\partial B_1} \frac{g(\phi)}{1+r^2-2rcos(\theta-\phi)} d\phi &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para aproximar la solución, emplearemos la fórmula del trapecio en la integración numérica, debido a su eficacia en la aproximación de integrales definidas.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:sinfronterasol.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
 &lt;br /&gt;
# Definición de la función g(theta)&lt;br /&gt;
def g(theta):&lt;br /&gt;
    return np.maximum(0, 1 - 2/np.pi * np.abs(theta - np.pi))&lt;br /&gt;
 &lt;br /&gt;
# Función para calcular la integral de Laplace-Poisson&lt;br /&gt;
def laplace_poisson(r, theta):&lt;br /&gt;
    # Valores de phi para integración&lt;br /&gt;
    phi_values = np.linspace(0, 2*np.pi, 1000)&lt;br /&gt;
    # Definición del integrando&lt;br /&gt;
    integrand = g(phi_values) * (1 - r**2) / (1 + r**2 - 2*r*np.cos(theta - phi_values))&lt;br /&gt;
    # Calcular la integral usando el método trapezoidal&lt;br /&gt;
    return np.trapz(integrand, phi_values) / (2 * np.pi)&lt;br /&gt;
 &lt;br /&gt;
# Función para calcular la solución de Laplace&lt;br /&gt;
def laplace_solution(R, Theta):&lt;br /&gt;
    # Crear un array vacío para almacenar los valores de la solución de Laplace&lt;br /&gt;
    laplace_values = np.zeros_like(R)&lt;br /&gt;
   &lt;br /&gt;
    # Iterar sobre cada punto en la malla&lt;br /&gt;
    for i in range(len(R)):&lt;br /&gt;
        for j in range(len(R[0])):&lt;br /&gt;
            r = R[i, j]&lt;br /&gt;
            theta = Theta[i, j]&lt;br /&gt;
            laplace_values[i, j] = laplace_poisson(r, theta)&lt;br /&gt;
    return laplace_values&lt;br /&gt;
 &lt;br /&gt;
# Generar malla de valores de r y theta&lt;br /&gt;
num_points = 100&lt;br /&gt;
r_values = np.linspace(0, 1, num_points)&lt;br /&gt;
theta_values = np.linspace(0, 2*np.pi, num_points)&lt;br /&gt;
R, Theta = np.meshgrid(r_values, theta_values)&lt;br /&gt;
 &lt;br /&gt;
# Calcular la solución de Laplace para cada punto en la malla&lt;br /&gt;
laplace_values = laplace_solution(R, Theta)&lt;br /&gt;
 &lt;br /&gt;
# Graficar&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.contourf(R * np.cos(Theta), R * np.sin(Theta), laplace_values, levels=50, cmap='viridis')&lt;br /&gt;
plt.colorbar(label='Solución de Laplace')&lt;br /&gt;
plt.title('Solución de Laplace en el disco unidad sin imponer g en la frontera')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('y')&lt;br /&gt;
plt.axis('equal')&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observamos que en la frontera la solución vale 0, cuando por continuidad esto no debería ser así. La razón principal por la que en la frontera no se puede utilizar directamente la fórmula de Poisson es porque la fórmula se deriva asumiendo que el punto en el que estamos calculando la solución está en el interior del dominio. Cuando estamos en la frontera, esta suposición ya no es válida, y necesitamos utilizar directamente la condición de contorno.&lt;br /&gt;
&lt;br /&gt;
Para abordar adecuadamente este problema, es imprescindible aplicar directamente la condición de contorno en la frontera. Esto implica que, en lugar de utilizar la fórmula de Poisson para esos puntos, debemos asignar los valores de la función de contorno &amp;lt;math&amp;gt;g&amp;lt;/math&amp;gt; especificados para la frontera.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:confronterasol.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Definición de la función g(theta)&lt;br /&gt;
def g(theta):&lt;br /&gt;
    return np.maximum(0, 1 - 2/np.pi * np.abs(theta - np.pi))&lt;br /&gt;
&lt;br /&gt;
# Función para calcular la integral de Laplace-Poisson&lt;br /&gt;
def laplace_poisson(r, theta):&lt;br /&gt;
    # Valores de phi para integración&lt;br /&gt;
    phi_values = np.linspace(0, 2*np.pi, 1000)&lt;br /&gt;
    # Definición del integrando&lt;br /&gt;
    integrand = g(phi_values) * (1 - r**2) / (1 + r**2 - 2*r*np.cos(theta - phi_values))&lt;br /&gt;
    # Calcular la integral usando el método trapezoidal&lt;br /&gt;
    return np.trapz(integrand, phi_values) / (2 * np.pi)&lt;br /&gt;
&lt;br /&gt;
# Función para calcular la solución de Laplace&lt;br /&gt;
def laplace_solution(R, Theta):&lt;br /&gt;
    # Crear un array vacío para almacenar los valores de la solución de Laplace&lt;br /&gt;
    laplace_values = np.zeros_like(R)&lt;br /&gt;
    &lt;br /&gt;
    # Iterar sobre cada punto en la malla&lt;br /&gt;
    for i in range(len(R)):&lt;br /&gt;
        for j in range(len(R[0])):&lt;br /&gt;
            r = R[i, j]&lt;br /&gt;
            theta = Theta[i, j]&lt;br /&gt;
            &lt;br /&gt;
            if r &amp;lt; 1:  # Dentro de la bola unitaria la calculada&lt;br /&gt;
                laplace_values[i, j] = laplace_poisson(r, theta)&lt;br /&gt;
            else:  # En el límite exigimos la funcion g&lt;br /&gt;
                laplace_values[i, j] = g(theta)&lt;br /&gt;
    &lt;br /&gt;
    return laplace_values&lt;br /&gt;
&lt;br /&gt;
# Generar malla de valores de r y theta&lt;br /&gt;
num_points = 100&lt;br /&gt;
r_values = np.linspace(0, 1, num_points)&lt;br /&gt;
theta_values = np.linspace(0, 2*np.pi, num_points)&lt;br /&gt;
R, Theta = np.meshgrid(r_values, theta_values)&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución de Laplace para cada punto en la malla&lt;br /&gt;
laplace_values = laplace_solution(R, Theta)&lt;br /&gt;
&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.contourf(R * np.cos(Theta), R * np.sin(Theta), laplace_values, levels=50, cmap='viridis')&lt;br /&gt;
plt.colorbar(label='Solución de Laplace')&lt;br /&gt;
plt.title('Solución de Laplace en el disco unidad')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('y')&lt;br /&gt;
plt.axis('equal')&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Limitaciones de la fórmula de Poisson==&lt;br /&gt;
La fórmula de Poisson enfrenta limitaciones cerca de las fronteras del dominio debido a la singularidad de la integral. Esto se manifiesta en errores de aproximación, especialmente cuando se utiliza la fórmula del trapecio para la integración. Para investigar estos errores, analizaremos la solución exacta &amp;lt;math&amp;gt;u(x,y)=xy&amp;lt;/math&amp;gt;, que es armónica y mantiene su valor en la frontera &amp;lt;math&amp;gt;g(x,y)=xy&amp;lt;/math&amp;gt;. Mediante diferentes discretizaciones de la fórmula del trapecio, evaluaremos la precisión de la fórmula de Poisson y el impacto de la discretización en la aproximación de la solución.&lt;br /&gt;
&lt;br /&gt;
Por comodidad y por lo ya realizado anteriormente, llevaremos a cabo un cambio a coordenadas polares.Siendo &amp;lt;math&amp;gt;u(r,\theta)=r^2 cos(\theta)\sin(\theta)&amp;lt;/math&amp;gt; y dado que tomaremos la bola unidad entonces la condición frontera se expresa como &amp;lt;math&amp;gt;g(\theta)= cos(\theta)\sin(\theta)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para evaluar la precisión de estas aproximaciones, analizaremos el error en un punto específico, alejado de la frontera. El punto elegido para este análisis es &amp;lt;math&amp;gt; (r, \theta) = (0.9, \frac{\pi}{4})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
El error será cuantificado en una escala logarítmica definida como &amp;lt;math&amp;gt; f(n) = \log_{10}(\text{error}(10^n))&amp;lt;/math&amp;gt;, donde &amp;lt;math&amp;gt;\text{error}(10^n)&amp;lt;/math&amp;gt; representa el error computado al utilizar &amp;lt;math&amp;gt; 10^n &amp;lt;/math&amp;gt; puntos para la evaluación integral. Posteriormente, estos errores serán representados gráficamente para proporcionar una visión clara del comportamiento del error conforme aumenta el número de puntos de la discretización.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:csp1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#Definimos Solución Exacta&lt;br /&gt;
def exact_solution(r, theta):&lt;br /&gt;
    return r**2 * np.sin(theta) * np.cos(theta)&lt;br /&gt;
#Definimos Condición Frontera&lt;br /&gt;
def g(theta):&lt;br /&gt;
    return np.sin(theta) * np.cos(theta)&lt;br /&gt;
#Solución de la ecuación laplace&lt;br /&gt;
def laplace_poisson(r, theta, num_points_trapz):&lt;br /&gt;
    phi_values = np.linspace(0, 2*np.pi, num_points_trapz)&lt;br /&gt;
    integrand = g(phi_values) * (1 - r**2) / (1 + r**2 - 2*r*np.cos(theta - phi_values))&lt;br /&gt;
    return np.trapz(integrand, phi_values) / (2 * np.pi)&lt;br /&gt;
#Calculamos la solución en todos los puntos&lt;br /&gt;
def laplace_solution(R, Theta, num_points_trapz):&lt;br /&gt;
    laplace_values = np.zeros_like(R)&lt;br /&gt;
    for i in range(len(R)):&lt;br /&gt;
        for j in range(len(R[0])):&lt;br /&gt;
            r = R[i, j]&lt;br /&gt;
            theta = Theta[i, j]&lt;br /&gt;
            laplace_values[i, j] = laplace_poisson(r, theta, num_points_trapz)&lt;br /&gt;
    return laplace_values&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Función para calcular el error de la solución de Poisson&lt;br /&gt;
def calculate_error(num_points_trapz):&lt;br /&gt;
    r = 0.9&lt;br /&gt;
    theta = np.pi / 4&lt;br /&gt;
    &lt;br /&gt;
    # Calcula el valor exacto de la solución en el punto dado&lt;br /&gt;
    exact_value = exact_solution(r, theta)&lt;br /&gt;
    &lt;br /&gt;
    # Aproxima el valor de la solución utilizando el método de la integral trapezoidal&lt;br /&gt;
    approx_value = laplace_poisson(r, theta, num_points_trapz)&lt;br /&gt;
    &lt;br /&gt;
    # Calcula el error absoluto entre la solución exacta y la aproximada&lt;br /&gt;
    error = np.abs(exact_value - approx_value)&lt;br /&gt;
    &lt;br /&gt;
    # Si el error es muy pequeño, asigna un valor pequeño para evitar errores en el logaritmo&lt;br /&gt;
    if error == 0:&lt;br /&gt;
        error = 1e-16 &lt;br /&gt;
    &lt;br /&gt;
    # Retorna el logaritmo en base 10 del error multiplicado por 10 elevado a la potencia de num_points_trapz&lt;br /&gt;
    return np.log10(error)&lt;br /&gt;
&lt;br /&gt;
# Lista de valores para el número de puntos en la integral trapezoidal&lt;br /&gt;
num_points_trapz_values = [10**n for n in range(1, 8)]&lt;br /&gt;
&lt;br /&gt;
# Calcula el error para cada valor de número de puntos&lt;br /&gt;
errors = [calculate_error(num_points) for num_points in num_points_trapz_values]&lt;br /&gt;
&lt;br /&gt;
# Grafica el error en función del logaritmo del número de puntos&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(np.log10(num_points_trapz_values), errors, color='blue',  marker='o', linestyle='-')&lt;br /&gt;
plt.title('Error vs. Numero de puntos para el trapecio')&lt;br /&gt;
plt.xlabel('$\log_{10}$(Numero de puntos para el trapecio)')&lt;br /&gt;
plt.ylabel('$\log_{10}$(error $(10^n))$')&lt;br /&gt;
plt.ylim(-16,5)&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En este punto queremos observar la relación que hay entre el error teórico de la integral al resolverla numéricamente por la regla del trapecio con el error obtenido, el fin de este estudio es ver cuan buena es la solución que reporta la fórmula de Poisson.&lt;br /&gt;
Considerando la siguiente integral&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
I  = \int_a^bf(x)dx &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Si la resolvemos mediante el método del trapecio, presentará el siguiente error&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
E_t = -\frac{1}{12n^2}f''(\xi)(b-a)^3&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde n es el número de puntos de la discretización.&lt;br /&gt;
En nuestro caso la función f sería:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \psi(r,\theta, \phi)=\frac{1-r^2}{2\pi} \frac{ cos(\phi)\sin(\phi)}{1+r^2-2rcos(\theta-\phi)} = \frac{1-r^2}{4\pi} \frac{ \sin(2\phi)}{1+r^2-2rcos(\theta-\phi)}   &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde, por ejemplo, nos interesa  calcular el error de la fórmula del trapecio en el punto &amp;lt;math&amp;gt; (r, \theta) = (0.9, \frac{\pi}{4})&amp;lt;/math&amp;gt;. Para ello primero sustituimos sendas variables en la función &amp;lt;math&amp;gt;\psi&amp;lt;/math&amp;gt;.&lt;br /&gt;
Además nuestro caso se integra en el intervalo &amp;lt;math&amp;gt;[0,2\pi]&amp;lt;/math&amp;gt; por tanto &amp;lt;math&amp;gt;a=0,b=2\pi&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Derivamos la expresión &amp;lt;math&amp;gt; \psi(0.9, \frac{\pi}{4}, \phi) &amp;lt;/math&amp;gt; dos veces respecto de &amp;lt;math&amp;gt; \phi &amp;lt;/math&amp;gt; y calculamos el máximo para de esta froma acotar el error como sigue, &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
 |E_t| = |-\frac{1}{12n^2}\psi''(0.9, \frac{\pi}{4}, \phi)(2\pi)^3| \leq \max_{\phi \in [0, 2\pi]} \left| -\frac{1}{12n^2} \psi''(0.9, \frac{\pi}{4}, \phi) (2\pi)^3 \right|&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
El máximo del valor absoluto de la segunda derivada lo calculamos de forma numérica pues, debido a la expresión, era difícil de calcularlo de manera simbólica; además se obtiene una cota más precisa del error que la que se obtendría acotando cada término. Dicho valor se alcanza aproximadamente en &amp;lt;math&amp;gt;\phi = \frac{\pi}{4}&amp;lt;/math&amp;gt;, lo cual además tiene sentido por la simetría en el denominador de &amp;lt;math&amp;gt; \psi(r,\theta, \phi) &amp;lt;/math&amp;gt; que alcanza el mínimo cuando &amp;lt;math&amp;gt; \theta = \phi &amp;lt;/math&amp;gt;.&lt;br /&gt;
Mostramos un código a continuación de como se calcula de manera simbólica la segunda derivada así como una representación del valor absoluto de la misma.&lt;br /&gt;
[[Archivo:cspsegundaderivada.jpg|300px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;maple&amp;quot;&amp;gt;&lt;br /&gt;
# Define la expresión&lt;br /&gt;
expr := ((1 - r^2)/(4*Pi))*sin(2*φ) / (1 + r^2 - 2*r*cos(θ - φ));&lt;br /&gt;
&lt;br /&gt;
# Segunda derivada respecto a φ&lt;br /&gt;
expr_phi_2 := diff(expr_phi_1, φ);&lt;br /&gt;
&lt;br /&gt;
# Simplificar la segunda derivada respecto a φ&lt;br /&gt;
a := simplify(expr_phi_2);&lt;br /&gt;
&lt;br /&gt;
# Evaluar la segunda derivada simplificada para r = 0.9 y θ = 0.785398&lt;br /&gt;
r := 0.9;&lt;br /&gt;
θ := 0.785398;&lt;br /&gt;
b := abs(evalf(a));&lt;br /&gt;
&lt;br /&gt;
# Graficar la segunda derivada evaluada para φ en el rango de [0, 2π]&lt;br /&gt;
plot([b], φ = 0 .. 2*Pi, legend = &amp;quot;Valor absoluto de la segunda derivada respecto a φ&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No obstante esto a priori no sirve para hallar el valor buscado, pues no sabemos si tomando una subdivisión mayor del intervalo la función presenta anomalías cerca de &amp;lt;math&amp;gt; \frac{\pi}{4}&amp;lt;/math&amp;gt; resultando así una valor distinto, no obstante es improbable pues &amp;lt;math&amp;gt;\psi(0.9, \frac{\pi}{4}, \phi)&amp;lt;/math&amp;gt; es diferenciable. &lt;br /&gt;
Para hallar el máximo de esta función, implementaremos el siguiente código que divide una malla en distintos números de subintervalos y calcula los valores de la segunda derivada de una función con respecto a &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt; en cada subdivisión. Luego, registra el máximo en valor absoluto de estos valores y lo representa gráficamente en función del número de subintervalos en la malla.Cuando observamos que la curva que representa el máximo de la segunda derivada parece estancarse, sugiere que la función no presenta anomalías y por tanto el valor límite obtenido está cerca del valor real.&lt;br /&gt;
[[Archivo:Máximo_de_la_segunda_derivada_en_función_del_número_de_divisiones_de_la_malla.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Definimos la segunda derivada para acotar el error del método del trapecio&lt;br /&gt;
def double_prime(phi, r, theta):&lt;br /&gt;
    return np.abs(((2*(r**2 - 1)*(-r*(4*r*np.sin(phi - theta)**2/(r**2 - 2*r*np.cos(phi - theta) + 1) - np.cos(phi - theta))*np.sin(phi)*np.cos(phi)/(r**2 - 2*r*np.cos(phi - theta) + 1) -&lt;br /&gt;
    2*r*np.sin(phi)**2*np.sin(phi - theta)/(r**2 - 2*r*np.cos(phi - theta) + 1) + 2*r*np.sin(phi - theta)*np.cos(phi)**2/(r**2 - 2*r*np.cos(phi - theta) + 1) + 2*np.sin(phi)*np.cos(phi))/(r**2 - 2*r*np.cos(phi - theta) + 1)))/ (2 * np.pi))&lt;br /&gt;
&lt;br /&gt;
# Función para encontrar el máximo de la segunda derivada en función del número de divisiones de la malla&lt;br /&gt;
def find_maximum(r, theta, num_divisions):&lt;br /&gt;
    phi_values = np.linspace(0, 2*np.pi, num_divisions)&lt;br /&gt;
    double_prime_values = double_prime(phi_values, r, theta)&lt;br /&gt;
    max_value = np.max(double_prime_values)&lt;br /&gt;
    return max_value&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
r = 0.9&lt;br /&gt;
theta = np.pi/4&lt;br /&gt;
max_values = []&lt;br /&gt;
num_divisions_values = range(10**3, 10**5, 100)&lt;br /&gt;
&lt;br /&gt;
# Calcular el máximo para cada número de divisiones&lt;br /&gt;
for num_divisions in num_divisions_values:&lt;br /&gt;
    max_value = find_maximum(r, theta, num_divisions)&lt;br /&gt;
    max_values.append(max_value)&lt;br /&gt;
&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.xscale('log')&lt;br /&gt;
plt.plot(num_divisions_values, max_values, color='blue')&lt;br /&gt;
plt.xlabel('Número de divisiones de la malla')&lt;br /&gt;
plt.ylabel('Máximo de la segunda derivada')&lt;br /&gt;
plt.title('Máximo de la segunda derivada en función del número de divisiones de la malla')&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
&lt;br /&gt;
# Encontrar el valor que maximiza la segunda derivada&lt;br /&gt;
max_value_index = np.argmax(max_values)&lt;br /&gt;
optimal_num_divisions = num_divisions_values[max_value_index]&lt;br /&gt;
optimal_max_value = max_values[max_value_index]&lt;br /&gt;
optimal_phi = np.linspace(0, 2*np.pi, optimal_num_divisions)[np.argmax(double_prime(np.linspace(0, 2*np.pi, optimal_num_divisions), r, theta))]&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;El valor de phi que maximiza la segunda derivada es aproximadamente {:.6f}, con un valor máximo de {:.6f}&amp;quot;.format(optimal_phi, optimal_max_value))&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Este código reporta que el valor de &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt; que maximiza el valor absoluto de la segunda derivada es aproximadamente &amp;lt;math&amp;gt;0.785406\approx \frac{\pi}{4}&amp;lt;/math&amp;gt;, con un valor máximo de 278.202831.&lt;br /&gt;
Mostramos el  error teórico dado por la expresión.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; g(n) = log\max_{\phi \in [0, 2\pi]}|E_t(n,\phi)|&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Error_Teórico_vs._Número_de_Puntos_en_la_Regla_del_Trapecio.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Definimos la segunda derivada para acotar el error del método del trapecio&lt;br /&gt;
def double_prime(phi, r, theta):&lt;br /&gt;
    return ((2*(r**2 - 1)*(-r*(4*r*np.sin(phi - theta)**2/(r**2 - 2*r*np.cos(phi - theta) + 1) - np.cos(phi - theta))*np.sin(phi)*np.cos(phi)/(r**2 - 2*r*np.cos(phi - theta) + 1) -&lt;br /&gt;
    2*r*np.sin(phi)**2*np.sin(phi - theta)/(r**2 - 2*r*np.cos(phi - theta) + 1) + 2*r*np.sin(phi - theta)*np.cos(phi)**2/(r**2 - 2*r*np.cos(phi - theta) + 1) + 2*np.sin(phi)*np.cos(phi))/(r**2 - 2*r*np.cos(phi - theta) + 1)))/ (2 * np.pi)&lt;br /&gt;
&lt;br /&gt;
# Calculamos el valor de double_prime(phi, 1, pi/4) para el valor de phi dado&lt;br /&gt;
phi = 0.785406 # Calculado en el ejercicio anterior&lt;br /&gt;
r = 0.9&lt;br /&gt;
theta = np.pi/4&lt;br /&gt;
valor_double_prime = double_prime(phi, r, theta)&lt;br /&gt;
&lt;br /&gt;
# Calculamos el error teórico de la regla del trapecio para n puntos&lt;br /&gt;
def theoretical_error(n):&lt;br /&gt;
    a = 0&lt;br /&gt;
    b = 2*np.pi&lt;br /&gt;
    return np.log(abs(-(b - a)**3 / (12 * n**2) * valor_double_prime ))&lt;br /&gt;
&lt;br /&gt;
# Generamos distintos valores de n&lt;br /&gt;
num_puntos_trapz_valores = [10**n for n in range(1, 8)]&lt;br /&gt;
errores_teoricos = [theoretical_error(num_puntos) for num_puntos in num_puntos_trapz_valores]&lt;br /&gt;
&lt;br /&gt;
# Imprimimos el error teórico&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(np.log10(num_puntos_trapz_valores), errores_teoricos, color='red', marker='s', linestyle='--')&lt;br /&gt;
plt.title('Error Teórico vs. Número de Puntos en la Regla del Trapecio')&lt;br /&gt;
plt.xlabel('Número de Puntos en la Regla del Trapecio')&lt;br /&gt;
plt.ylabel('Error Teórico')&lt;br /&gt;
plt.ylim(-16,5)&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Comparamos el error teórico con el error obtenido entre la solución exacta y la solución calculada.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Error_Práctico_vs._Teórico_para_Diferentes_N.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Generamos valores para diferentes números de puntos en la regla del trapecio&lt;br /&gt;
num_points_trapz_values = [10**n for n in range(1, 8)]&lt;br /&gt;
&lt;br /&gt;
# Calculamos errores para cada número de puntos utilizando la función calculate_error&lt;br /&gt;
errors = [calculate_error(num_points) for num_points in num_points_trapz_values]&lt;br /&gt;
&lt;br /&gt;
# Calculamos errores teóricos para cada número de puntos utilizando la función theoretical_error&lt;br /&gt;
theoretical_errors = [theoretical_error(num_points) for num_points in num_points_trapz_values]&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
&lt;br /&gt;
# Graficamos los errores calculados en una escala logarítmica&lt;br /&gt;
plt.plot(np.log10(num_points_trapz_values), errors, color='blue', marker='o', linestyle='-', label='Error Práctico')&lt;br /&gt;
&lt;br /&gt;
# Graficamos los errores teóricos en una escala logarítmica&lt;br /&gt;
plt.plot(np.log10(num_points_trapz_values), theoretical_errors,  color='red',marker='s', linestyle='--', label='Error Teórico')&lt;br /&gt;
plt.title('Error Práctico vs. Teórico para Diferentes N')&lt;br /&gt;
plt.xlabel('$\log_{10}$(Numero de puntos para el trapecio)')&lt;br /&gt;
plt.ylabel('$\log_{10}$(error $(10^n))$')&lt;br /&gt;
plt.ylim(-16,5)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Observamos que la solución obtenida por la fórmula de Poisson mediante la fórmula del trapecio es buena en un punto en el interior del dominio. Sin embargo, el error en el método del trapecio cerca de la frontera de la región de integración conforme nos acercamos a &amp;lt;math&amp;gt;r=1&amp;lt;/math&amp;gt; crece. Consideramos fijar el número de puntos en la fórmula del trapecio en un valor determinado 100. Luego, trazamos la gráfica del error para puntos de la forma &amp;lt;math&amp;gt;(r, \theta) = (1 - 10^{-n}, \pi/4)&amp;lt;/math&amp;gt;, donde &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; representa la precisión de la aproximación. Se espera un aumento del error.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Error_conforme_nos_acercamos_a_la_frontera.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
num_points_trapz = 100&lt;br /&gt;
&lt;br /&gt;
# Función para calcular el error de la solución de Poisson&lt;br /&gt;
def calculate_error(num_points_trapz):&lt;br /&gt;
    r = 0.9&lt;br /&gt;
    theta = np.pi / 4&lt;br /&gt;
    &lt;br /&gt;
    # Calcula el valor exacto de la solución en el punto dado&lt;br /&gt;
    exact_value = exact_solution(r, theta)&lt;br /&gt;
    &lt;br /&gt;
    # Aproxima el valor de la solución utilizando el método de la integral trapezoidal&lt;br /&gt;
    approx_value = laplace_poisson(r, theta, num_points_trapz)&lt;br /&gt;
    &lt;br /&gt;
    # Calcula el error absoluto entre la solución exacta y la aproximada&lt;br /&gt;
    error = np.abs(exact_value - approx_value)&lt;br /&gt;
    &lt;br /&gt;
    # Si el error es muy pequeño, asigna un valor pequeño para evitar errores en el logaritmo&lt;br /&gt;
    if error == 0:&lt;br /&gt;
        error = 1e-16 &lt;br /&gt;
    &lt;br /&gt;
    # Retorna el logaritmo en base 10 del error multiplicado por 10 elevado a la potencia de num_points_trapz&lt;br /&gt;
    return np.log10(error)&lt;br /&gt;
&lt;br /&gt;
# Lista de valores para el número de puntos en la integral trapezoidal&lt;br /&gt;
num_points_trapz_values = [10**n for n in range(1, 8)]&lt;br /&gt;
&lt;br /&gt;
# Calcula el error para cada valor de número de puntos&lt;br /&gt;
errors = [calculate_error(num_points) for num_points in num_points_trapz_values]&lt;br /&gt;
&lt;br /&gt;
# Función para calcular la diferencia entre la solución exacta y la aproximada mediante el método de Laplace-Poisson&lt;br /&gt;
def calculate_error(r, theta, num_points_trapz):&lt;br /&gt;
    exact_value = exact_solution(r, theta)  # Calcula la solución exacta&lt;br /&gt;
    approx_value = laplace_poisson(r, theta, num_points_trapz)  # Calcula la solución aproximada&lt;br /&gt;
    error = np.abs(exact_value - approx_value)  # Calcula el error absoluto entre las dos soluciones&lt;br /&gt;
    if error == 0:&lt;br /&gt;
        error = 1e-16  # Evita errores en el cálculo del logaritmo si el error es cero&lt;br /&gt;
    return np.log10(error)  # Retorna el logaritmo en base 10 del error absoluto&lt;br /&gt;
&lt;br /&gt;
n_values = np.arange(1, 8)  # Genera valores de n desde 1 hasta 10&lt;br /&gt;
&lt;br /&gt;
# Genera valores de r y calcula los errores para diferentes valores de n&lt;br /&gt;
num_points_trapz = 100  # Número de puntos en la regla del trapecio&lt;br /&gt;
errors = []&lt;br /&gt;
for n in n_values:&lt;br /&gt;
    r = 1 - 1 / 10**n  # Calcula el valor de r&lt;br /&gt;
    theta = np.pi / 4  # Ángulo theta fijo&lt;br /&gt;
    errors.append(calculate_error(r, theta, num_points_trapz))  # Calcula el error para el valor de r actual&lt;br /&gt;
&lt;br /&gt;
# Grafica los errores en función de n&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(n_values, errors, color = 'blue', marker='o', linestyle='-')&lt;br /&gt;
plt.title('Error conforme nos acercamos a la frontera')&lt;br /&gt;
plt.xlabel('$n$ que sitasifacen la ecuación $r=1 - 1/10^n$')  # Etiqueta del eje x&lt;br /&gt;
plt.ylabel('$\log_{10}$(error $(10^n))$')  # Etiqueta del eje y&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Efectivamente el error aumenta conforme aumenta &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, como era de esperar debido al carácter singular de la integral.&lt;br /&gt;
&lt;br /&gt;
==Solución por Series de Fourier==&lt;br /&gt;
Procedemos ahora a resolver este problema mediante el uso de las series de Fourier,siendo de nuevo la solución &amp;lt;math&amp;gt; u(x,y) =xy &amp;lt;/math&amp;gt;, siendo su valor en la frontera &amp;lt;math&amp;gt; g(x,y) =xy &amp;lt;/math&amp;gt;.&lt;br /&gt;
Tomando nuestro problema en coordenadas polares obtenemos &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \begin{cases}&lt;br /&gt;
\Delta u=u_{rr}+\frac{1}{r}u_r+\frac{1}{r^2}u_{\theta\theta}=0, r\in(0,R),\theta\in[0,2\pi]\\&lt;br /&gt;
u(R,\theta)=G(\theta)=R^2 cos(\theta)sin(\theta), \theta\in[0,2\pi].&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde su solución viene definida por&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
u(r, \theta) = \frac{\alpha_{0}}{2}  +   \sum_{k=1}^{n} \left( \alpha_{k} \left(\frac{r}{R} \right)^k cos(k\theta) + \beta_{k} \left(\frac{r}{R} \right)^k sin(k\theta)\right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Para que se cumpla la condición frontera se debe verificar  &amp;lt;math&amp;gt; u(R,\theta)=G(\theta) &amp;lt;/math&amp;gt;, donde  R=1,al estar en la bola unidad. Siendo el desarrollo en series de Fourier de &amp;lt;math&amp;gt;G(\theta) &amp;lt;/math&amp;gt; considerando la base trigonométrica usual ,&amp;lt;math&amp;gt; L^2([-\pi,\pi]) &amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
G(\theta) = \frac{a_0}{2} + \sum_{k=1}^\infty (a_k \cos(k\theta) + b_k \sin(k\theta))&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde los coeficientes de Fourier son &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
a_0=\frac{1}{\pi} \int_{-\pi}^{\pi} G(\theta) \, d\theta &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
a_k = \frac{1}{\pi} \int_{-\pi}^{\pi} G(\theta) \cos(k\theta) \, d\theta &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
b_k = \frac{1}{\pi} \int_{-\pi}^{\pi} G(\theta)\sin(k\theta) \, d\theta&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Mientras que los coeficientes de Fourier para &amp;lt;math&amp;gt; G(\theta)=\cos(\theta)\sin(\theta)=\frac{1}{2}\sin(2\theta)&amp;lt;/math&amp;gt; son &amp;lt;math&amp;gt; a_0 = 0, a_k = 0  \forall k , b_k = 0  \forall k \neq 2 &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; b_2 = \frac{1}{2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Esto significa que la serie de Fourier de &amp;lt;math&amp;gt; G(\theta)&amp;lt;/math&amp;gt; se reduce simplemente a &amp;lt;math&amp;gt;u(r,\theta) = \frac{1}{2} r^2\sin(2\theta)&amp;lt;/math&amp;gt;con &lt;br /&gt;
&amp;lt;math&amp;gt;r\in [0,1]&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;\theta \in [0,2\pi]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Debido a que la solución por serie de Fourier tiene solo un número finito de términos, no tiene mucho sentido dibujar la gráfica con el error en función del número de términos, ya que el error desaparece completamente al alcanzar el segundo término, y no hay variación posterior del error al aumentar el número de términos.&lt;br /&gt;
&lt;br /&gt;
==Desigualdad de Harnack==&lt;br /&gt;
En esta sección, examinaremos la desigualdad de Harnack. Para ello, buscaremos la región la que deben estar todas las soluciones armónicas en la bola \( B_R \), que coinciden con \( u \), en \( (0,0) \)&lt;br /&gt;
&lt;br /&gt;
La ''desigualdad de Harnack'' se aplica a una función \( f \) no negativa definida en una bola cerrada en \( \mathbb{R}^n \) con radio \( R \) y centro \( x_0 \). Luego, no podemos aplicarla directamente a la función \( u(x,y) = xy \), ya que toma valores negativos. Por lo tanto, generaremos una nueva función, traslación de la anterior, \( v = u - M \), donde \( M \) es el mínimo de la función \( u(x,y) \). Esta función es tanto positiva como armónica, ya que \( \Delta u = \Delta v = 0 \), lo que implica que cumple las hipótesis de Harnack y nos permite aplicar la desigualdad.&lt;br /&gt;
&lt;br /&gt;
Comenzamos hallando el mínimo de la función \( g(x,y) = xy \) definida en \( \partial B_R(0) \). Pues vemos que la función \( u(x,y) = xy \), que expresada en polares responde a\( u(r,\theta) = r^2\sin(\theta)\cos(\theta) = \frac{r^2}{2}\sin(2\theta) \), alcanza su valor más bajo en la frontera cuando \( r \) tiende a \( R \) y el seno de \( \theta \) alcanza su mínimo, que es \( -1 \).  De modo que&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
: \(M=\min_{\partial B_R(0)}g(r,\theta) =\min_{\partial B_R(0)} R^2\sin(\theta)\cos(\theta)= \min_{\partial B_R(0)}\frac{R^2}{2}\sin(2\theta) =-\frac{R^2}{2}\)&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Luego, la función a la que se le va a aplicar Harnack será  \( v(r,\theta) = u(r,\theta) - M=\frac{r^2}{2}\sin(2\theta)+\frac{R^2}{2} \geq 0\)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A continuación, se mostrará la expresión para dimensión 2 en la bola de radio \(R\) centrada en el origen. Teniendo en cuenta que \( v(0,\theta) = u(0,\theta)-M=-M \)&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:\( \frac{(R-r)}{(R+r)} \frac{R^2}{2} \leq v(r,\theta) \leq \frac{(R+r)}{(R-r)}\frac{R^2}{2}, \forall (r,\theta) \in B_{R} \)&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Dado que buscamos las cotas para \(u \), deshacemos el cambio de variable \(u(r,\theta)=v(r,\theta)+M  \) y obtenemos, sumando a ambos lados \(-\frac{R^2}{2} \), la siguiente desigualdad &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:\( -\frac{(R^2r)}{(R+r)} \leq u(r,\theta) \leq \frac{(R^2r)}{(R-r)}, \forall (r,\theta) \in B_{R} \)&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Finalmente, buscamos graficar estas dos cotas para representar la región en que deben estar todas las soluciones. Se harán tres gráficas para apreciar las diferencias a mediada que el radio aumenta&lt;br /&gt;
[[Archivo:Dim 2.png|1000px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Radios de las bolas y colores asociados&lt;br /&gt;
Radios = [1, 2, 10]&lt;br /&gt;
Colores = ['blue', 'red', 'purple']&lt;br /&gt;
&lt;br /&gt;
# Establecer el número de filas y columnas para los subgráficos&lt;br /&gt;
num_filas = 1&lt;br /&gt;
num_columnas = len(Radios)&lt;br /&gt;
&lt;br /&gt;
# Tamaño de las figuras&lt;br /&gt;
figsize = (15, 5)  # Ancho x Alto&lt;br /&gt;
&lt;br /&gt;
# Crear una figura que contenga todas las subgráficas&lt;br /&gt;
plt.figure(figsize=figsize)&lt;br /&gt;
&lt;br /&gt;
# Iterar sobre cada radio y color&lt;br /&gt;
for indice, (R, color) in enumerate(zip(Radios, Colores)):&lt;br /&gt;
    # Vector de la discretización para los radios&lt;br /&gt;
    radios_discretizacion = np.linspace(0, R - 0.01, 100)&lt;br /&gt;
    &lt;br /&gt;
    # Calcular las cotas inferiores y superiores utilizando comprensiones de listas&lt;br /&gt;
    cota_inf = [-(R**2 * r) / (R + r) for r in radios_discretizacion]  # Cota inferior&lt;br /&gt;
    cota_sup = [(R**2 * r) / (R - r) for r in radios_discretizacion]  # Cota superior&lt;br /&gt;
    &lt;br /&gt;
    # Desplazar los valores obtenidos para aplicar la escala logarítmica&lt;br /&gt;
    m = min(min(cota_inf), min(cota_sup)) - 1  # Encontrar el valor mínimo entre ambas cotas y restamos uno pues log(0) no está definido&lt;br /&gt;
    cota_inf = np.array(cota_inf) - m  # Ajustar la cota inferior&lt;br /&gt;
    cota_sup = np.array(cota_sup) - m  # Ajustar la cota superior&lt;br /&gt;
    &lt;br /&gt;
    # Crear subgráfico en la posición adecuada&lt;br /&gt;
    plt.subplot(num_filas, num_columnas, indice + 1)&lt;br /&gt;
    &lt;br /&gt;
    # Trazar las cotas inferior y superior&lt;br /&gt;
    plt.plot(radios_discretizacion, cota_inf, '--', color=color, label='Cota inferior (R={})'.format(R))&lt;br /&gt;
    plt.plot(radios_discretizacion, cota_sup, color=color, label='Cota superior (R={})'.format(R))&lt;br /&gt;
    &lt;br /&gt;
    # Rellenar el área entre las cotas&lt;br /&gt;
    plt.fill_between(radios_discretizacion, cota_inf, cota_sup, color=color, alpha=0.1)&lt;br /&gt;
    &lt;br /&gt;
    # Etiquetas y título&lt;br /&gt;
    plt.xlabel('Radios(r)')&lt;br /&gt;
    plt.ylabel('Cota')&lt;br /&gt;
    plt.legend(loc='upper left')&lt;br /&gt;
    plt.title(&amp;quot;Bola de Radio {}&amp;quot;.format(R))&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
&lt;br /&gt;
# Ajustar el espaciado entre subgráficas para evitar superposiciones&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
&lt;br /&gt;
# Mostrar todas las figuras&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observamos como el comportamiento a medida que aumenta el radio es similar. Para poder extraer otras conclusiones más notables tomaremos el eje y en escala logarítmica. De modo que no podremos graficar la cota dada por la función \(u\) pues el logaritmo de un valor negativo no está definido. Tomaremos la función \(v\) que ha sido construida como una función positiva. Mostraremos una gráfica dependiente del radio y en escala logarítmica para diferentes radios de la bola: \(R={1,2,10} \)&lt;br /&gt;
[[Archivo:dim 2 log.png|1000px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Radios de las bolas y colores asociados&lt;br /&gt;
Radios = [1, 2, 10]&lt;br /&gt;
Colores = ['blue', 'red', 'purple']&lt;br /&gt;
&lt;br /&gt;
# Establecer el número de filas y columnas para los subgráficos&lt;br /&gt;
num_filas = 1&lt;br /&gt;
num_columnas = len(Radios)&lt;br /&gt;
&lt;br /&gt;
# Tamaño de las figuras&lt;br /&gt;
figsize = (15, 5)  # Ancho x Alto&lt;br /&gt;
&lt;br /&gt;
# Crear una figura que contenga todas las subgráficas&lt;br /&gt;
plt.figure(figsize=figsize)&lt;br /&gt;
&lt;br /&gt;
# Iterar sobre cada radio y color&lt;br /&gt;
for indice, (R, color) in enumerate(zip(Radios, Colores)):&lt;br /&gt;
    # Vector de la discretización para los radios&lt;br /&gt;
    radios_discretizacion = np.linspace(0, R - 0.01, 100)&lt;br /&gt;
    &lt;br /&gt;
    # Calcular las cotas inferiores y superiores utilizando comprensiones de listas&lt;br /&gt;
    cota_inf = [R**2*(R - r)/(2*(R + r)) for r in radios_discretizacion]  # Cota inferior&lt;br /&gt;
    cota_sup = [R**2*(R + r)/(2*(R - r)) for r in radios_discretizacion]  # Cota superior&lt;br /&gt;
    &lt;br /&gt;
    # Crear subgráfico en la posición adecuada&lt;br /&gt;
    plt.subplot(num_filas, num_columnas, indice + 1)&lt;br /&gt;
    &lt;br /&gt;
    # Trazar las cotas inferior y superior&lt;br /&gt;
    plt.plot(radios_discretizacion, cota_inf, '--', color=color, label='Cota inferior (R={})'.format(R))&lt;br /&gt;
    plt.plot(radios_discretizacion, cota_sup, color=color, label='Cota superior (R={})'.format(R))&lt;br /&gt;
    &lt;br /&gt;
    # Rellenar el área entre las cotas&lt;br /&gt;
    plt.fill_between(radios_discretizacion, cota_inf, cota_sup, color=color, alpha=0.1)&lt;br /&gt;
    &lt;br /&gt;
    # Etiquetas y título&lt;br /&gt;
    plt.xlabel('Radios(r)')&lt;br /&gt;
    plt.ylabel('Cota')&lt;br /&gt;
    plt.yscale('log')&lt;br /&gt;
    plt.legend(loc='upper left')&lt;br /&gt;
    plt.title(&amp;quot;Bola de Radio {}&amp;quot;.format(R))&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
&lt;br /&gt;
# Ajustar el espaciado entre subgráficas para evitar superposiciones&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
&lt;br /&gt;
# Mostrar todas las figuras&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dado que las escalas son diferentes, mostraremos una foto solapada con todas ellas para que sea más visible este resultado.&lt;br /&gt;
&amp;lt;center&amp;gt;[[Archivo:jd2.png|400px|thumb|center|]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora podemos apreciar con mayor exactitud que aquellas funciones armónicas que pasen por la intersección entre la cota superior e inferior para un radio preciso, se van a quedar ''encerradas'' entre sendas funciones. &lt;br /&gt;
&lt;br /&gt;
Estudiemos ahora qué pasaría si cambiamos la dimensión del espacio, en vez de en una circunferencia, en una esfera. Empleamos de nuevo la función \(v(r,\theta, \phi) \) que posee la no negatividad para aplicar Harnack donde el mínimo responde a la misma forma, \(\frac{R^2}{2} \), pues su función no ha cambiado. Análogamente, obtenemos&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:\( R\frac{(R-r)}{(R+r)^2} \frac{R^2}{2} \leq v(r,\theta, \phi) \leq R\frac{(R+r)}{(R-r)^2}\frac{R^2}{2}, \forall (r,\theta, \phi) \in B_{R} \)&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Y dado que buscamos las cotas de  \(u(r,\theta, \phi)=v(r,\theta, \phi)-M \) sumando a ambos lados de las desigualdades M llegamos a la siguiente acotación:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:\( \frac{(R-r)}{(R+r)^2}\frac{R^3}{2}- \frac{R^2}{2} \leq v(r,\theta, \phi) \leq R\frac{(R+r)}{(R-r)^2}\frac{R^3}{2}- \frac{R^2}{2}, \forall (r,\theta, \phi) \in B_{R} \)&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Representado de nuevo las funciones que definen la cota superior e inferior en función del radio para valores \(R={1,2,10} \), obtenemos las siguientes imágenes:&lt;br /&gt;
[[Archivo:dim 3.png|1000px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Radios de las bolas y colores asociados&lt;br /&gt;
Radios = [1, 2, 10]&lt;br /&gt;
Colores = ['blue', 'red', 'purple']&lt;br /&gt;
&lt;br /&gt;
# Establecer el número de filas y columnas para los subgráficos&lt;br /&gt;
num_filas = 1&lt;br /&gt;
num_columnas = len(Radios)&lt;br /&gt;
&lt;br /&gt;
# Tamaño de las figuras&lt;br /&gt;
figsize = (15, 5)  # Ancho x Alto&lt;br /&gt;
&lt;br /&gt;
# Crear una figura que contenga todas las subgráficas&lt;br /&gt;
plt.figure(figsize=figsize)&lt;br /&gt;
&lt;br /&gt;
# Iterar sobre cada radio y color&lt;br /&gt;
for indice, (R, color) in enumerate(zip(Radios, Colores)):&lt;br /&gt;
    # Vector de la discretización para los radios&lt;br /&gt;
    radios_discretizacion = np.linspace(0, R - 0.01, 100)&lt;br /&gt;
&lt;br /&gt;
    # Calcular las cotas inferiores y superiores utilizando comprensiones de listas&lt;br /&gt;
    cota_inf = [R**2*(R*(R - r) - (R + r)**2)/(2*(R + r)**2) for r in radios_discretizacion]  # Cota inferior&lt;br /&gt;
    cota_sup = [R**2*(R*(R + r) - (R - r)**2)/(2*(R - r)**2)  for r in radios_discretizacion]  # Cota superior&lt;br /&gt;
    &lt;br /&gt;
    # Crear subgráfico en la posición adecuada&lt;br /&gt;
    plt.subplot(num_filas, num_columnas, indice + 1)&lt;br /&gt;
    &lt;br /&gt;
    # Trazar las cotas inferior y superior&lt;br /&gt;
    plt.plot(radios_discretizacion, cota_inf, '--', color=color, label='Cota inferior (R={})'.format(R))&lt;br /&gt;
    plt.plot(radios_discretizacion, cota_sup, color=color, label='Cota superior (R={})'.format(R))&lt;br /&gt;
    &lt;br /&gt;
    # Rellenar el área entre las cotas&lt;br /&gt;
    plt.fill_between(radios_discretizacion, cota_inf, cota_sup, color=color, alpha=0.1)&lt;br /&gt;
    &lt;br /&gt;
    # Etiquetas y título&lt;br /&gt;
    plt.xlabel('Radios(r)')&lt;br /&gt;
    plt.ylabel('Cota')&lt;br /&gt;
    plt.legend(loc='upper left')&lt;br /&gt;
    plt.title(&amp;quot;Bola de Radio {}&amp;quot;.format(R))&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
&lt;br /&gt;
# Ajustar el espaciado entre subgráficas para evitar superposiciones&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
&lt;br /&gt;
# Mostrar todas las figuras&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
De nuevo, realizaremos el cambio a escala logarítmica del eje y para apreciar mejor los resultados, de modo que la gráfica corresponderá a la función positiva \(v\).&lt;br /&gt;
&lt;br /&gt;
[[Archivo:dim 3 log.png|1000px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Radios de las bolas y colores asociados&lt;br /&gt;
Radios = [1, 2, 10]&lt;br /&gt;
Colores = ['blue', 'red', 'purple']&lt;br /&gt;
&lt;br /&gt;
# Establecer el número de filas y columnas para los subgráficos&lt;br /&gt;
num_filas = 1&lt;br /&gt;
num_columnas = len(Radios)&lt;br /&gt;
&lt;br /&gt;
# Tamaño de las figuras&lt;br /&gt;
figsize = (15, 5)  # Ancho x Alto&lt;br /&gt;
&lt;br /&gt;
# Crear una figura que contenga todas las subgráficas&lt;br /&gt;
plt.figure(figsize=figsize)&lt;br /&gt;
&lt;br /&gt;
# Iterar sobre cada radio y color&lt;br /&gt;
for indice, (R, color) in enumerate(zip(Radios, Colores)):&lt;br /&gt;
    # Vector de la discretización para los radios&lt;br /&gt;
    radios_discretizacion = np.linspace(0, R - 0.01, 100)&lt;br /&gt;
&lt;br /&gt;
    # Calcular las cotas inferiores y superiores utilizando comprensiones de listas&lt;br /&gt;
    cota_inf = [R**3*(R - r)/(2*(R + r)**2) for r in radios_discretizacion]  # Cota inferior&lt;br /&gt;
    cota_sup = [R**3*(R + r)/(2*(R - r)**2)  for r in radios_discretizacion]  # Cota superior&lt;br /&gt;
    &lt;br /&gt;
    # Crear subgráfico en la posición adecuada&lt;br /&gt;
    plt.subplot(num_filas, num_columnas, indice + 1)&lt;br /&gt;
    &lt;br /&gt;
    # Trazar las cotas inferior y superior&lt;br /&gt;
    plt.plot(radios_discretizacion, cota_inf, '--', color=color, label='Cota inferior (R={})'.format(R))&lt;br /&gt;
    plt.plot(radios_discretizacion, cota_sup, color=color, label='Cota superior (R={})'.format(R))&lt;br /&gt;
    &lt;br /&gt;
    # Rellenar el área entre las cotas&lt;br /&gt;
    plt.fill_between(radios_discretizacion, cota_inf, cota_sup, color=color, alpha=0.1)&lt;br /&gt;
    &lt;br /&gt;
    # Etiquetas y título&lt;br /&gt;
    plt.xlabel('Radios(r)')&lt;br /&gt;
    plt.ylabel('Cota')&lt;br /&gt;
    plt.yscale('log')  # Escala logarítmica en el eje y&lt;br /&gt;
    plt.legend(loc='upper left')&lt;br /&gt;
    plt.title(&amp;quot;Bola de Radio {}&amp;quot;.format(R))&lt;br /&gt;
    plt.grid(True)&lt;br /&gt;
&lt;br /&gt;
# Ajustar el espaciado entre subgráficas para evitar superposiciones&lt;br /&gt;
plt.tight_layout()&lt;br /&gt;
&lt;br /&gt;
# Mostrar todas las figuras&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siendo la gráfica conjunta la siguiente&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Archivo:jd3.png|400px|thumb|center|]]&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde los resultados que apreciamos no difieren en gran medida a los anteriores.&lt;br /&gt;
&lt;br /&gt;
Finalmente, resulta significativo examinar las diferencias que surgen al cambiar la dimensión de análisis. Con el propósito de facilitar una comparación, hemos integrado las dos representaciones gráficas previamente presentadas, en las cuales se empleaba una escala logarítmica, en una sola imagen. Al emplear la escala logarítmica, se resaltan las diferencias de manera más equilibrada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Archivo:juntos dim 2 3.png|900px|thumb|center|]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podemos apreciar como las cotas van aumentando a medida que la dimensión crece y viceversa. Esto implica que la región de existencia de soluciones armónicas en una bola aumenta a medida que lo hace la dimensión.&lt;br /&gt;
&lt;br /&gt;
=Ecuación de Poisson bidimensional=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para calcular la solución de la ecuación de Poisson &amp;lt;math&amp;gt; \Delta u = f &amp;lt;/math&amp;gt;, donde &amp;lt;math&amp;gt;\textbf{x} \in \mathbb{R}^2&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; es la función característica de la bola de radio 1, podemos utilizar el potencial logarítmico.&lt;br /&gt;
A partir del potencial logarítmico podemos utilizar la solución fundamental para obtener la solución de la ecuación.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; u(\textbf{x}) =-\frac{1}{2\pi} \int_{ \mathbb{R^2}} \log|\textbf{x}-\textbf{y}| f(y) \, dy &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por comodidad y la simetría de la función característica utilizaremos coordenadas polares. Por tanto las expresiones equivalentes son&lt;br /&gt;
&lt;br /&gt;
Potencial logarítmico en polares &amp;lt;math&amp;gt; (x_1,x_2)=(r\cos(\theta), r\sin(\theta))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \Phi(\textbf{x}) = \Phi(r,\theta)= -\frac{1}{2\pi} \log |(r\cos(\theta), r\sin(\theta))| = -\frac{1}{2\pi} \log r &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si además tomamos otro valor &amp;lt;math&amp;gt; \textbf{y} = (s\cos(\phi), s\sin(\phi))  &amp;lt;/math&amp;gt;. Entonces podemos expresar el potencial logarítmico en función de tres variables&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \Phi(\textbf{x}-\textbf{y}) = \Phi(r,\theta, s, \phi)=-\frac{1}{2\pi} \log |(r\cos(\theta), r\sin(\theta))-(s\cos(\phi), s\sin(\phi))| = -\frac{1}{2\pi} \log \left( \sqrt{r^2 - 2rs \cos(\theta - \phi) + s^2} \right) &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por otro lado función  &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; la escribimos como &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
f(\textbf{y})=f(s)=&lt;br /&gt;
\begin{cases} &lt;br /&gt;
1 &amp;amp; \text{si } s \leq 1 \\&lt;br /&gt;
0 &amp;amp; \text{si } s &amp;gt; 1 &lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Por tanto la integral en coordenadas polares tiene la siguiente expresión:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; u(\textbf{x}) = u(r,\theta)= -\frac{1}{2\pi} \int_{0}^{2\pi} \int_{0}^{1}  \log \left( \sqrt{r^2 - 2rs \cos(\theta - \phi) + s^2} \right)  s \, ds \, d\phi &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Resolvemos la integral de manera numérica mediante la integración por el método del trapecio dos veces (para la varible &amp;lt;math&amp;gt; s &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; \phi &amp;lt;/math&amp;gt;), mostramos además la solución de forma tridimensional  &amp;lt;math&amp;gt; (r\cos(\theta),r\sin(\theta),  u(r,\theta)) &amp;lt;/math&amp;gt; para así ver la propiedad asintótica de la misma.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:abloestonto.jpg|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
 &lt;br /&gt;
# Definimos la función característica&lt;br /&gt;
def characteristic_function(s, phi):&lt;br /&gt;
    # Devuelve 1 si s &amp;lt;= 1, 0 en caso contrario&lt;br /&gt;
    if s &amp;lt;= 1:&lt;br /&gt;
        return 1&lt;br /&gt;
    else:&lt;br /&gt;
        return 0&lt;br /&gt;
 &lt;br /&gt;
# Definimos el potencial logarítmico&lt;br /&gt;
def log_potential(r, theta, s, phi):&lt;br /&gt;
    # Calcula el potencial logarítmico para una posición (r, theta) y un punto (s, phi)&lt;br /&gt;
    return -1/(2*np.pi) * np.log(np.sqrt(r**2 - 2*r*s*np.cos(theta - phi) + s**2))*s&lt;br /&gt;
 &lt;br /&gt;
# Definimos la función para aproximar la integral doble&lt;br /&gt;
def double_integral_approximation(r, theta, num_segments_s, num_segments_phi):&lt;br /&gt;
    # Generamos los valores de s y phi&lt;br /&gt;
    s_values = np.linspace(0, 1, num_segments_s)&lt;br /&gt;
    phi_values = np.linspace(0, 2*np.pi, num_segments_phi)&lt;br /&gt;
   &lt;br /&gt;
    # Inicializamos una matriz para almacenar los valores de la función integrando&lt;br /&gt;
    integrand_values = np.zeros((num_segments_s, num_segments_phi))&lt;br /&gt;
   &lt;br /&gt;
    # Calculamos los valores de la función integrando para cada punto (s, phi)&lt;br /&gt;
    for i, s in enumerate(s_values):&lt;br /&gt;
        for j, phi in enumerate(phi_values):&lt;br /&gt;
            integrand_values[i, j] =  log_potential(r, theta, s, phi)*characteristic_function(s, phi)&lt;br /&gt;
   &lt;br /&gt;
    # Aproximamos la integral doble utilizando la regla del trapecio&lt;br /&gt;
    approximation = np.trapz(np.trapz(integrand_values, axis=1, dx=(2*np.pi)/num_segments_phi), axis=0, dx=1/num_segments_s)&lt;br /&gt;
    return approximation&lt;br /&gt;
 &lt;br /&gt;
# Generar una malla de puntos (r, theta)&lt;br /&gt;
num_points_r = 50&lt;br /&gt;
num_points_theta = 50&lt;br /&gt;
r_values = np.linspace(0.01, 10**3, num_points_r)&lt;br /&gt;
theta_values = np.linspace(0, 2*np.pi, num_points_theta)&lt;br /&gt;
R, Theta = np.meshgrid(r_values, theta_values)&lt;br /&gt;
 &lt;br /&gt;
# Calcular la aproximación de la integral doble en cada punto de la malla&lt;br /&gt;
num_segments_s = 50&lt;br /&gt;
num_segments_phi = 50&lt;br /&gt;
approximations = np.zeros_like(R)&lt;br /&gt;
for i in range(num_points_r):&lt;br /&gt;
    for j in range(num_points_theta):&lt;br /&gt;
        approximations[i, j] = double_integral_approximation(R[i, j], Theta[i, j], num_segments_s, num_segments_phi)&lt;br /&gt;
 &lt;br /&gt;
# Graficar&lt;br /&gt;
fig = plt.figure(figsize=(10, 6))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf = ax.plot_surface(R * np.cos(Theta), R * np.sin(Theta), approximations, cmap='viridis', edgecolor='none')&lt;br /&gt;
ax.set_title('Solución ecuación de Poisson')&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('y')&lt;br /&gt;
ax.set_zlabel('Aproximación')&lt;br /&gt;
plt.colorbar(surf, ax=ax, label='Aproximación')&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Para verificar que la solución tiene el comportamiento esperado en el infinito, podemos estudiar cómo se comporta &amp;lt;math&amp;gt;u(\mathbf{x})&amp;lt;/math&amp;gt; cuando &amp;lt;math&amp;gt;|\mathbf{x}| \to \infty&amp;lt;/math&amp;gt;. O dicho de otra forma estudiar &amp;lt;math&amp;gt;\lim_{{r \to \infty}} u(r, \theta)&amp;lt;/math&amp;gt;. Asintóticamente la solución debería comportarse como  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
u(\mathbf{x}) = -\frac{M}{2\pi} \log |\mathbf{x}| + O\left(\frac{1}{|\mathbf{x}|}\right) \quad |\mathbf{x}| \to +\infty &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\text{Donde} \quad  M = \int_{\mathbb{R}^2} f(\mathbf{y}) \, d\mathbf{y} .&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Que escrito en coordenadas polares y con nuestros datos,&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
u(r,\theta) = -\frac{M}{2\pi} \log r + O\left(\frac{1}{r}\right) \quad r \to +\infty &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\text{Donde} \quad M = \int_{\mathbb{R}^2} \mathbb{1}_{\mathbb{B}(0,1)} (y) dy = \int_{0}^{1} \int_{0}^{2\pi} s \, ds = \pi.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para realizar esta verificación, evaluaremos la solución en valores de &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; cada vez más grandes dado un &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; fijo, y compararemos estos valores con la función &amp;lt;math&amp;gt;u_{\infty}(r,\theta)=-\frac{1}{2} \log(r)&amp;lt;/math&amp;gt;. Si la solución se comporta correctamente, esperaríamos que los valores calculados se aproximen a los valores de la función &amp;lt;math&amp;gt;u_{\infty}(r,\theta)&amp;lt;/math&amp;gt; a medida que &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; aumenta. Para ello calcularemos el error entre la solución obtenida y la función.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por lo tanto, al utilizar el potencial logarítmico para aproximar la ecuación de Poisson con &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; como la función característica de la bola de radio 1, podemos confirmar que la solución tiene el comportamiento esperado en el infinito, lo que valida la aproximación realizada.&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Juntos_dim_2_3.png&amp;diff=71784</id>
		<title>Archivo:Juntos dim 2 3.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Juntos_dim_2_3.png&amp;diff=71784"/>
				<updated>2024-04-19T20:26:26Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Dim_3.png&amp;diff=71783</id>
		<title>Archivo:Dim 3.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Dim_3.png&amp;diff=71783"/>
				<updated>2024-04-19T20:26:03Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Dim_3_log.png&amp;diff=71782</id>
		<title>Archivo:Dim 3 log.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Dim_3_log.png&amp;diff=71782"/>
				<updated>2024-04-19T20:25:34Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Dim_2_log.png&amp;diff=71781</id>
		<title>Archivo:Dim 2 log.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Dim_2_log.png&amp;diff=71781"/>
				<updated>2024-04-19T20:24:59Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_Laplace_y_de_Poisson._Grupo_Eau_De_Parfum_(EDP))&amp;diff=71780</id>
		<title>Ecuación de Laplace y de Poisson. Grupo Eau De Parfum (EDP))</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_Laplace_y_de_Poisson._Grupo_Eau_De_Parfum_(EDP))&amp;diff=71780"/>
				<updated>2024-04-19T20:24:01Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* 4.4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación de Laplace y de Poisson. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
&lt;br /&gt;
=Introducción=&lt;br /&gt;
Este trabajo consistirá en el estudio&lt;br /&gt;
&lt;br /&gt;
=Contexto histórico=&lt;br /&gt;
[[Archivo:laplace_edp.jpg|200px|thumb|right|Pierre-Simon Laplace]]&lt;br /&gt;
Los estudios de fenómenos eléctricos y magnéticos tomaron forma a finales del siglo XVIII, estableciendo la electrostática y la magnetostática como disciplinas matemáticas al estilo newtoniano.&lt;br /&gt;
Dentro de esta rama, Poisson destacó como uno de sus pioneros, ya que entre otras contribuciones amplió y profundizó los estudios sobre el potencial gravitatorio realizados previamente por Euler, Lagrange y Laplace. En 1785, Laplace había propuesto que la variación del potencial en cualquier punto, ya sea dentro o fuera de un cuerpo que ejerce una atracción gravitatoria, se rige por la ecuación que hoy lleva su nombre.&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
\Delta u={\partial^2 u\over \partial x^2 } +&lt;br /&gt;
{\partial^2 u\over \partial y^2 } +&lt;br /&gt;
{\partial^2 u\over \partial z^2 } = 0.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
siendo u una función real.&lt;br /&gt;
Sin embargo, Poisson identificó en 1812 que esta ecuación no era aplicable a puntos (x,y,z) dentro del cuerpo atrayente. Así, reformuló la ecuación, conocida ahora como la ecuación de Poisson&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
\Delta u={\partial^2 u\over \partial x^2 } +&lt;br /&gt;
{\partial^2 u\over \partial y^2 } +&lt;br /&gt;
{\partial^2 u\over \partial z^2 } = f(x,y,z).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Conocimientos previos=&lt;br /&gt;
[[Archivo:Poisson_edp.jpg|200px|thumb|right|Siméon-Denis Poisson]]&lt;br /&gt;
Antes de comenzar será de gran ayuda introducir una serie de conceptos que utilizaremos a lo largo de este trabajo:&lt;br /&gt;
&lt;br /&gt;
'''Función armónica''':Una función &amp;lt;math&amp;gt;u \in C^{2}(\Omega)&amp;lt;/math&amp;gt;es armónica si &amp;lt;math&amp;gt;\Delta u =0&amp;lt;/math&amp;gt;, es decir, si &amp;lt;math&amp;gt;u &amp;lt;/math&amp;gt; es solución de la ecuación de Laplace.&lt;br /&gt;
&lt;br /&gt;
'''Desigualdad de Harnack''':Sea u armónica y &amp;lt;math&amp;gt;u \geq 0&amp;lt;/math&amp;gt; en &amp;lt;math&amp;gt;\Omega \subset \mathbb{R}^n &amp;lt;/math&amp;gt;. Supongamos &amp;lt;math&amp;gt;\overline{B_{R}}(z) \subset \Omega&amp;lt;/math&amp;gt;. Entonces &amp;lt;math&amp;gt;\forall x \in \overline{B_{R}}(z) \text{ con } |z-x|=r &amp;lt; R&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;{R^{n-2} (R-r)\over (R+r)^{n-1}} u(z)\le u(x)\le {R^{n-2}(R+r)\over (R-r)^{n-1}}u(z).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Solución fundamental''':La solución fundamental de la ecuación de Poisson es una función &amp;lt;math&amp;gt;\Phi&amp;lt;/math&amp;gt; tal que &amp;lt;math&amp;gt;\Delta \Phi =\delta&amp;lt;/math&amp;gt;, donde &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; representa la función de Dirichlet. Esta solución es fundamental en el sentido de que sirve como  generadora de soluciones más generales para la ecuación de Poisson bajo diversas condiciones de frontera.&lt;br /&gt;
&lt;br /&gt;
'''Fórmula de Poisson ''':La única solución  &amp;lt;math&amp;gt; u \in C^2(B_R(x_0))\cap C(\overline {B_R})&amp;lt;/math&amp;gt; del problema de Laplace  &amp;lt;math&amp;gt; \left \{ \begin{array}{ll} &lt;br /&gt;
&lt;br /&gt;
\Delta u=0, x\in B_R\\ &lt;br /&gt;
&lt;br /&gt;
u=g, x\in \partial B_R \\&lt;br /&gt;
\end{array} \right. &lt;br /&gt;
&amp;lt;/math&amp;gt;, se conoce como fórmula de Poisson, siendo su expresión :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x) = \frac{R^2 - |x - x_0|^2}{\omega_n R} \int_{\partial B_R(x_0)} \frac{g(\sigma)}{| (x - x_0)-\sigma|^n} d\sigma&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
donde &amp;lt;math&amp;gt; \omega_n &amp;lt;/math&amp;gt; representa la medida de la superficie de la esfera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cabe destacar que vamos a utilizar [[Series de Fourier (Grupo Eau De Parfum (EDP))|Series de Furier]]&lt;br /&gt;
&lt;br /&gt;
=Ecuación de Laplace=&lt;br /&gt;
Para iniciar el análisis de la ecuación de Laplace, primero es necesario plantear el problema que se desea resolver.&lt;br /&gt;
&lt;br /&gt;
Consideremos &amp;lt;math&amp;gt;B_1 \subset \mathbb{R}^2&amp;lt;/math&amp;gt; como la bola unidad centrada en el origen &amp;lt;math&amp;gt;(0, 0)&amp;lt;/math&amp;gt;. Analizaremos el siguiente problema:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\left \{ \begin{array}{ll}  &lt;br /&gt;
 \Delta u = 0, &amp;amp; x \in B_1 \\&lt;br /&gt;
 u = g, &amp;amp; x \in \partial B_1&lt;br /&gt;
\end{array} \right.  &lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nuestro objetivo es visualizar la solución de la ecuación de Laplace descrita arriba, empleando la fórmula de Poisson y las series de Fourier. Además, experimentaremos con cambios de la función frontera &amp;lt;math&amp;gt;g&amp;lt;/math&amp;gt; para observar cómo afectan la solución.&lt;br /&gt;
&lt;br /&gt;
==Solución de la ecuación de Laplace usando la fórmula de Poisson==&lt;br /&gt;
Tomaremos nuestro sistema en coordenadas polares &amp;lt;math&amp;gt;(r,\theta)&amp;lt;/math&amp;gt;, siendo la función frontera &amp;lt;math&amp;gt; g(\theta) = \max\left\{0, 1 - \frac{2}{\pi} |\theta - \pi|\right\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nos centraremos en resolver el problema descrito anteriormente utilizando la fórmula de Poisson en la bola de radio 1 centrada en el origen, que en coordenadas polares tiene la siguiente expresión:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; u(r,\theta)=\frac{1-r^2}{2\pi}\int_{\partial B_1} \frac{g(\phi)}{1+r^2-2rcos(\theta-\phi)} d\phi &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para aproximar la solución, emplearemos la fórmula del trapecio en la integración numérica, debido a su eficacia en la aproximación de integrales definidas.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:sinfronterasol.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
 &lt;br /&gt;
# Definición de la función g(theta)&lt;br /&gt;
def g(theta):&lt;br /&gt;
    return np.maximum(0, 1 - 2/np.pi * np.abs(theta - np.pi))&lt;br /&gt;
 &lt;br /&gt;
# Función para calcular la integral de Laplace-Poisson&lt;br /&gt;
def laplace_poisson(r, theta):&lt;br /&gt;
    # Valores de phi para integración&lt;br /&gt;
    phi_values = np.linspace(0, 2*np.pi, 1000)&lt;br /&gt;
    # Definición del integrando&lt;br /&gt;
    integrand = g(phi_values) * (1 - r**2) / (1 + r**2 - 2*r*np.cos(theta - phi_values))&lt;br /&gt;
    # Calcular la integral usando el método trapezoidal&lt;br /&gt;
    return np.trapz(integrand, phi_values) / (2 * np.pi)&lt;br /&gt;
 &lt;br /&gt;
# Función para calcular la solución de Laplace&lt;br /&gt;
def laplace_solution(R, Theta):&lt;br /&gt;
    # Crear un array vacío para almacenar los valores de la solución de Laplace&lt;br /&gt;
    laplace_values = np.zeros_like(R)&lt;br /&gt;
   &lt;br /&gt;
    # Iterar sobre cada punto en la malla&lt;br /&gt;
    for i in range(len(R)):&lt;br /&gt;
        for j in range(len(R[0])):&lt;br /&gt;
            r = R[i, j]&lt;br /&gt;
            theta = Theta[i, j]&lt;br /&gt;
            laplace_values[i, j] = laplace_poisson(r, theta)&lt;br /&gt;
    return laplace_values&lt;br /&gt;
 &lt;br /&gt;
# Generar malla de valores de r y theta&lt;br /&gt;
num_points = 100&lt;br /&gt;
r_values = np.linspace(0, 1, num_points)&lt;br /&gt;
theta_values = np.linspace(0, 2*np.pi, num_points)&lt;br /&gt;
R, Theta = np.meshgrid(r_values, theta_values)&lt;br /&gt;
 &lt;br /&gt;
# Calcular la solución de Laplace para cada punto en la malla&lt;br /&gt;
laplace_values = laplace_solution(R, Theta)&lt;br /&gt;
 &lt;br /&gt;
# Graficar&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.contourf(R * np.cos(Theta), R * np.sin(Theta), laplace_values, levels=50, cmap='viridis')&lt;br /&gt;
plt.colorbar(label='Solución de Laplace')&lt;br /&gt;
plt.title('Solución de Laplace en el disco unidad sin imponer g en la frontera')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('y')&lt;br /&gt;
plt.axis('equal')&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observamos que en la frontera la solución vale 0, cuando por continuidad esto no debería ser así. La razón principal por la que en la frontera no se puede utilizar directamente la fórmula de Poisson es porque la fórmula se deriva asumiendo que el punto en el que estamos calculando la solución está en el interior del dominio. Cuando estamos en la frontera, esta suposición ya no es válida, y necesitamos utilizar directamente la condición de contorno.&lt;br /&gt;
&lt;br /&gt;
Para abordar adecuadamente este problema, es imprescindible aplicar directamente la condición de contorno en la frontera. Esto implica que, en lugar de utilizar la fórmula de Poisson para esos puntos, debemos asignar los valores de la función de contorno &amp;lt;math&amp;gt;g&amp;lt;/math&amp;gt; especificados para la frontera.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:confronterasol.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Definición de la función g(theta)&lt;br /&gt;
def g(theta):&lt;br /&gt;
    return np.maximum(0, 1 - 2/np.pi * np.abs(theta - np.pi))&lt;br /&gt;
&lt;br /&gt;
# Función para calcular la integral de Laplace-Poisson&lt;br /&gt;
def laplace_poisson(r, theta):&lt;br /&gt;
    # Valores de phi para integración&lt;br /&gt;
    phi_values = np.linspace(0, 2*np.pi, 1000)&lt;br /&gt;
    # Definición del integrando&lt;br /&gt;
    integrand = g(phi_values) * (1 - r**2) / (1 + r**2 - 2*r*np.cos(theta - phi_values))&lt;br /&gt;
    # Calcular la integral usando el método trapezoidal&lt;br /&gt;
    return np.trapz(integrand, phi_values) / (2 * np.pi)&lt;br /&gt;
&lt;br /&gt;
# Función para calcular la solución de Laplace&lt;br /&gt;
def laplace_solution(R, Theta):&lt;br /&gt;
    # Crear un array vacío para almacenar los valores de la solución de Laplace&lt;br /&gt;
    laplace_values = np.zeros_like(R)&lt;br /&gt;
    &lt;br /&gt;
    # Iterar sobre cada punto en la malla&lt;br /&gt;
    for i in range(len(R)):&lt;br /&gt;
        for j in range(len(R[0])):&lt;br /&gt;
            r = R[i, j]&lt;br /&gt;
            theta = Theta[i, j]&lt;br /&gt;
            &lt;br /&gt;
            if r &amp;lt; 1:  # Dentro de la bola unitaria la calculada&lt;br /&gt;
                laplace_values[i, j] = laplace_poisson(r, theta)&lt;br /&gt;
            else:  # En el límite exigimos la funcion g&lt;br /&gt;
                laplace_values[i, j] = g(theta)&lt;br /&gt;
    &lt;br /&gt;
    return laplace_values&lt;br /&gt;
&lt;br /&gt;
# Generar malla de valores de r y theta&lt;br /&gt;
num_points = 100&lt;br /&gt;
r_values = np.linspace(0, 1, num_points)&lt;br /&gt;
theta_values = np.linspace(0, 2*np.pi, num_points)&lt;br /&gt;
R, Theta = np.meshgrid(r_values, theta_values)&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución de Laplace para cada punto en la malla&lt;br /&gt;
laplace_values = laplace_solution(R, Theta)&lt;br /&gt;
&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.contourf(R * np.cos(Theta), R * np.sin(Theta), laplace_values, levels=50, cmap='viridis')&lt;br /&gt;
plt.colorbar(label='Solución de Laplace')&lt;br /&gt;
plt.title('Solución de Laplace en el disco unidad')&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('y')&lt;br /&gt;
plt.axis('equal')&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Limitaciones de la fórmula de Poisson==&lt;br /&gt;
La fórmula de Poisson enfrenta limitaciones cerca de las fronteras del dominio debido a la singularidad de la integral. Esto se manifiesta en errores de aproximación, especialmente cuando se utiliza la fórmula del trapecio para la integración. Para investigar estos errores, analizaremos la solución exacta &amp;lt;math&amp;gt;u(x,y)=xy&amp;lt;/math&amp;gt;, que es armónica y mantiene su valor en la frontera &amp;lt;math&amp;gt;g(x,y)=xy&amp;lt;/math&amp;gt;. Mediante diferentes discretizaciones de la fórmula del trapecio, evaluaremos la precisión de la fórmula de Poisson y el impacto de la discretización en la aproximación de la solución.&lt;br /&gt;
&lt;br /&gt;
Por comodidad y por lo ya realizado anteriormente, llevaremos a cabo un cambio a coordenadas polares.Siendo &amp;lt;math&amp;gt;u(r,\theta)=r^2 cos(\theta)\sin(\theta)&amp;lt;/math&amp;gt; y dado que tomaremos la bola unidad entonces la condición frontera se expresa como &amp;lt;math&amp;gt;g(\theta)= cos(\theta)\sin(\theta)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para evaluar la precisión de estas aproximaciones, analizaremos el error en un punto específico, alejado de la frontera. El punto elegido para este análisis es &amp;lt;math&amp;gt; (r, \theta) = (0.9, \frac{\pi}{4})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
El error será cuantificado en una escala logarítmica definida como &amp;lt;math&amp;gt; f(n) = \log_{10}(\text{error}(10^n))&amp;lt;/math&amp;gt;, donde &amp;lt;math&amp;gt;\text{error}(10^n)&amp;lt;/math&amp;gt; representa el error computado al utilizar &amp;lt;math&amp;gt; 10^n &amp;lt;/math&amp;gt; puntos para la evaluación integral. Posteriormente, estos errores serán representados gráficamente para proporcionar una visión clara del comportamiento del error conforme aumenta el número de puntos de la discretización.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:csp1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#Definimos Solución Exacta&lt;br /&gt;
def exact_solution(r, theta):&lt;br /&gt;
    return r**2 * np.sin(theta) * np.cos(theta)&lt;br /&gt;
#Definimos Condición Frontera&lt;br /&gt;
def g(theta):&lt;br /&gt;
    return np.sin(theta) * np.cos(theta)&lt;br /&gt;
#Solución de la ecuación laplace&lt;br /&gt;
def laplace_poisson(r, theta, num_points_trapz):&lt;br /&gt;
    phi_values = np.linspace(0, 2*np.pi, num_points_trapz)&lt;br /&gt;
    integrand = g(phi_values) * (1 - r**2) / (1 + r**2 - 2*r*np.cos(theta - phi_values))&lt;br /&gt;
    return np.trapz(integrand, phi_values) / (2 * np.pi)&lt;br /&gt;
#Calculamos la solución en todos los puntos&lt;br /&gt;
def laplace_solution(R, Theta, num_points_trapz):&lt;br /&gt;
    laplace_values = np.zeros_like(R)&lt;br /&gt;
    for i in range(len(R)):&lt;br /&gt;
        for j in range(len(R[0])):&lt;br /&gt;
            r = R[i, j]&lt;br /&gt;
            theta = Theta[i, j]&lt;br /&gt;
            laplace_values[i, j] = laplace_poisson(r, theta, num_points_trapz)&lt;br /&gt;
    return laplace_values&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Función para calcular el error de la solución de Poisson&lt;br /&gt;
def calculate_error(num_points_trapz):&lt;br /&gt;
    r = 0.9&lt;br /&gt;
    theta = np.pi / 4&lt;br /&gt;
    &lt;br /&gt;
    # Calcula el valor exacto de la solución en el punto dado&lt;br /&gt;
    exact_value = exact_solution(r, theta)&lt;br /&gt;
    &lt;br /&gt;
    # Aproxima el valor de la solución utilizando el método de la integral trapezoidal&lt;br /&gt;
    approx_value = laplace_poisson(r, theta, num_points_trapz)&lt;br /&gt;
    &lt;br /&gt;
    # Calcula el error absoluto entre la solución exacta y la aproximada&lt;br /&gt;
    error = np.abs(exact_value - approx_value)&lt;br /&gt;
    &lt;br /&gt;
    # Si el error es muy pequeño, asigna un valor pequeño para evitar errores en el logaritmo&lt;br /&gt;
    if error == 0:&lt;br /&gt;
        error = 1e-16 &lt;br /&gt;
    &lt;br /&gt;
    # Retorna el logaritmo en base 10 del error multiplicado por 10 elevado a la potencia de num_points_trapz&lt;br /&gt;
    return np.log10(error)&lt;br /&gt;
&lt;br /&gt;
# Lista de valores para el número de puntos en la integral trapezoidal&lt;br /&gt;
num_points_trapz_values = [10**n for n in range(1, 8)]&lt;br /&gt;
&lt;br /&gt;
# Calcula el error para cada valor de número de puntos&lt;br /&gt;
errors = [calculate_error(num_points) for num_points in num_points_trapz_values]&lt;br /&gt;
&lt;br /&gt;
# Grafica el error en función del logaritmo del número de puntos&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(np.log10(num_points_trapz_values), errors, color='blue',  marker='o', linestyle='-')&lt;br /&gt;
plt.title('Error vs. Numero de puntos para el trapecio')&lt;br /&gt;
plt.xlabel('$\log_{10}$(Numero de puntos para el trapecio)')&lt;br /&gt;
plt.ylabel('$\log_{10}$(error $(10^n))$')&lt;br /&gt;
plt.ylim(-16,5)&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En este punto queremos observar la relación que hay entre el error teórico de la integral al resolverla numéricamente por la regla del trapecio con el error obtenido, el fin de este estudio es ver cuan buena es la solución que reporta la fórmula de Poisson.&lt;br /&gt;
Considerando la siguiente integral&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
I  = \int_a^bf(x)dx &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Si la resolvemos mediante el método del trapecio, presentará el siguiente error&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
E_t = -\frac{1}{12n^2}f''(\xi)(b-a)^3&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde n es el número de puntos de la discretización.&lt;br /&gt;
En nuestro caso la función f sería:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \psi(r,\theta, \phi)=\frac{1-r^2}{2\pi} \frac{ cos(\phi)\sin(\phi)}{1+r^2-2rcos(\theta-\phi)} = \frac{1-r^2}{4\pi} \frac{ \sin(2\phi)}{1+r^2-2rcos(\theta-\phi)}   &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde, por ejemplo, nos interesa  calcular el error de la fórmula del trapecio en el punto &amp;lt;math&amp;gt; (r, \theta) = (0.9, \frac{\pi}{4})&amp;lt;/math&amp;gt;. Para ello primero sustituimos sendas variables en la función &amp;lt;math&amp;gt;\psi&amp;lt;/math&amp;gt;.&lt;br /&gt;
Además nuestro caso se integra en el intervalo &amp;lt;math&amp;gt;[0,2\pi]&amp;lt;/math&amp;gt; por tanto &amp;lt;math&amp;gt;a=0,b=2\pi&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Derivamos la expresión &amp;lt;math&amp;gt; \psi(0.9, \frac{\pi}{4}, \phi) &amp;lt;/math&amp;gt; dos veces respecto de &amp;lt;math&amp;gt; \phi &amp;lt;/math&amp;gt; y calculamos el máximo para de esta froma acotar el error como sigue, &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
 |E_t| = |-\frac{1}{12n^2}\psi''(0.9, \frac{\pi}{4}, \phi)(2\pi)^3| \leq \max_{\phi \in [0, 2\pi]} \left| -\frac{1}{12n^2} \psi''(0.9, \frac{\pi}{4}, \phi) (2\pi)^3 \right|&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
El máximo del valor absoluto de la segunda derivada lo calculamos de forma numérica pues, debido a la expresión, era difícil de calcularlo de manera simbólica; además se obtiene una cota más precisa del error que la que se obtendría acotando cada término. Dicho valor se alcanza aproximadamente en &amp;lt;math&amp;gt;\phi = \frac{\pi}{4}&amp;lt;/math&amp;gt;, lo cual además tiene sentido por la simetría en el denominador de &amp;lt;math&amp;gt; \psi(r,\theta, \phi) &amp;lt;/math&amp;gt; que alcanza el mínimo cuando &amp;lt;math&amp;gt; \theta = \phi &amp;lt;/math&amp;gt;.&lt;br /&gt;
Mostramos un código a continuación de como se calcula de manera simbólica la segunda derivada así como una representación del valor absoluto de la misma.&lt;br /&gt;
[[Archivo:cspsegundaderivada.jpg|300px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;maple&amp;quot;&amp;gt;&lt;br /&gt;
# Define la expresión&lt;br /&gt;
expr := ((1 - r^2)/(4*Pi))*sin(2*φ) / (1 + r^2 - 2*r*cos(θ - φ));&lt;br /&gt;
&lt;br /&gt;
# Segunda derivada respecto a φ&lt;br /&gt;
expr_phi_2 := diff(expr_phi_1, φ);&lt;br /&gt;
&lt;br /&gt;
# Simplificar la segunda derivada respecto a φ&lt;br /&gt;
a := simplify(expr_phi_2);&lt;br /&gt;
&lt;br /&gt;
# Evaluar la segunda derivada simplificada para r = 0.9 y θ = 0.785398&lt;br /&gt;
r := 0.9;&lt;br /&gt;
θ := 0.785398;&lt;br /&gt;
b := abs(evalf(a));&lt;br /&gt;
&lt;br /&gt;
# Graficar la segunda derivada evaluada para φ en el rango de [0, 2π]&lt;br /&gt;
plot([b], φ = 0 .. 2*Pi, legend = &amp;quot;Valor absoluto de la segunda derivada respecto a φ&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No obstante esto a priori no sirve para hallar el valor buscado, pues no sabemos si tomando una subdivisión mayor del intervalo la función presenta anomalías cerca de &amp;lt;math&amp;gt; \frac{\pi}{4}&amp;lt;/math&amp;gt; resultando así una valor distinto, no obstante es improbable pues &amp;lt;math&amp;gt;\psi(0.9, \frac{\pi}{4}, \phi)&amp;lt;/math&amp;gt; es diferenciable. &lt;br /&gt;
Para hallar el máximo de esta función, implementaremos el siguiente código que divide una malla en distintos números de subintervalos y calcula los valores de la segunda derivada de una función con respecto a &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt; en cada subdivisión. Luego, registra el máximo en valor absoluto de estos valores y lo representa gráficamente en función del número de subintervalos en la malla.Cuando observamos que la curva que representa el máximo de la segunda derivada parece estancarse, sugiere que la función no presenta anomalías y por tanto el valor límite obtenido está cerca del valor real.&lt;br /&gt;
[[Archivo:Máximo_de_la_segunda_derivada_en_función_del_número_de_divisiones_de_la_malla.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Definimos la segunda derivada para acotar el error del método del trapecio&lt;br /&gt;
def double_prime(phi, r, theta):&lt;br /&gt;
    return np.abs(((2*(r**2 - 1)*(-r*(4*r*np.sin(phi - theta)**2/(r**2 - 2*r*np.cos(phi - theta) + 1) - np.cos(phi - theta))*np.sin(phi)*np.cos(phi)/(r**2 - 2*r*np.cos(phi - theta) + 1) -&lt;br /&gt;
    2*r*np.sin(phi)**2*np.sin(phi - theta)/(r**2 - 2*r*np.cos(phi - theta) + 1) + 2*r*np.sin(phi - theta)*np.cos(phi)**2/(r**2 - 2*r*np.cos(phi - theta) + 1) + 2*np.sin(phi)*np.cos(phi))/(r**2 - 2*r*np.cos(phi - theta) + 1)))/ (2 * np.pi))&lt;br /&gt;
&lt;br /&gt;
# Función para encontrar el máximo de la segunda derivada en función del número de divisiones de la malla&lt;br /&gt;
def find_maximum(r, theta, num_divisions):&lt;br /&gt;
    phi_values = np.linspace(0, 2*np.pi, num_divisions)&lt;br /&gt;
    double_prime_values = double_prime(phi_values, r, theta)&lt;br /&gt;
    max_value = np.max(double_prime_values)&lt;br /&gt;
    return max_value&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
r = 0.9&lt;br /&gt;
theta = np.pi/4&lt;br /&gt;
max_values = []&lt;br /&gt;
num_divisions_values = range(10**3, 10**5, 100)&lt;br /&gt;
&lt;br /&gt;
# Calcular el máximo para cada número de divisiones&lt;br /&gt;
for num_divisions in num_divisions_values:&lt;br /&gt;
    max_value = find_maximum(r, theta, num_divisions)&lt;br /&gt;
    max_values.append(max_value)&lt;br /&gt;
&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.xscale('log')&lt;br /&gt;
plt.plot(num_divisions_values, max_values, color='blue')&lt;br /&gt;
plt.xlabel('Número de divisiones de la malla')&lt;br /&gt;
plt.ylabel('Máximo de la segunda derivada')&lt;br /&gt;
plt.title('Máximo de la segunda derivada en función del número de divisiones de la malla')&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
&lt;br /&gt;
# Encontrar el valor que maximiza la segunda derivada&lt;br /&gt;
max_value_index = np.argmax(max_values)&lt;br /&gt;
optimal_num_divisions = num_divisions_values[max_value_index]&lt;br /&gt;
optimal_max_value = max_values[max_value_index]&lt;br /&gt;
optimal_phi = np.linspace(0, 2*np.pi, optimal_num_divisions)[np.argmax(double_prime(np.linspace(0, 2*np.pi, optimal_num_divisions), r, theta))]&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;El valor de phi que maximiza la segunda derivada es aproximadamente {:.6f}, con un valor máximo de {:.6f}&amp;quot;.format(optimal_phi, optimal_max_value))&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Este código reporta que el valor de &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt; que maximiza el valor absoluto de la segunda derivada es aproximadamente &amp;lt;math&amp;gt;0.785406\approx \frac{\pi}{4}&amp;lt;/math&amp;gt;, con un valor máximo de 278.202831.&lt;br /&gt;
Mostramos el  error teórico dado por la expresión.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; g(n) = log\max_{\phi \in [0, 2\pi]}|E_t(n,\phi)|&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Error_Teórico_vs._Número_de_Puntos_en_la_Regla_del_Trapecio.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Definimos la segunda derivada para acotar el error del método del trapecio&lt;br /&gt;
def double_prime(phi, r, theta):&lt;br /&gt;
    return ((2*(r**2 - 1)*(-r*(4*r*np.sin(phi - theta)**2/(r**2 - 2*r*np.cos(phi - theta) + 1) - np.cos(phi - theta))*np.sin(phi)*np.cos(phi)/(r**2 - 2*r*np.cos(phi - theta) + 1) -&lt;br /&gt;
    2*r*np.sin(phi)**2*np.sin(phi - theta)/(r**2 - 2*r*np.cos(phi - theta) + 1) + 2*r*np.sin(phi - theta)*np.cos(phi)**2/(r**2 - 2*r*np.cos(phi - theta) + 1) + 2*np.sin(phi)*np.cos(phi))/(r**2 - 2*r*np.cos(phi - theta) + 1)))/ (2 * np.pi)&lt;br /&gt;
&lt;br /&gt;
# Calculamos el valor de double_prime(phi, 1, pi/4) para el valor de phi dado&lt;br /&gt;
phi = 0.785406 # Calculado en el ejercicio anterior&lt;br /&gt;
r = 0.9&lt;br /&gt;
theta = np.pi/4&lt;br /&gt;
valor_double_prime = double_prime(phi, r, theta)&lt;br /&gt;
&lt;br /&gt;
# Calculamos el error teórico de la regla del trapecio para n puntos&lt;br /&gt;
def theoretical_error(n):&lt;br /&gt;
    a = 0&lt;br /&gt;
    b = 2*np.pi&lt;br /&gt;
    return np.log(abs(-(b - a)**3 / (12 * n**2) * valor_double_prime ))&lt;br /&gt;
&lt;br /&gt;
# Generamos distintos valores de n&lt;br /&gt;
num_puntos_trapz_valores = [10**n for n in range(1, 8)]&lt;br /&gt;
errores_teoricos = [theoretical_error(num_puntos) for num_puntos in num_puntos_trapz_valores]&lt;br /&gt;
&lt;br /&gt;
# Imprimimos el error teórico&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(np.log10(num_puntos_trapz_valores), errores_teoricos, color='red', marker='s', linestyle='--')&lt;br /&gt;
plt.title('Error Teórico vs. Número de Puntos en la Regla del Trapecio')&lt;br /&gt;
plt.xlabel('Número de Puntos en la Regla del Trapecio')&lt;br /&gt;
plt.ylabel('Error Teórico')&lt;br /&gt;
plt.ylim(-16,5)&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Comparamos el error teórico con el error obtenido entre la solución exacta y la solución calculada.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Error_Práctico_vs._Teórico_para_Diferentes_N.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Generamos valores para diferentes números de puntos en la regla del trapecio&lt;br /&gt;
num_points_trapz_values = [10**n for n in range(1, 8)]&lt;br /&gt;
&lt;br /&gt;
# Calculamos errores para cada número de puntos utilizando la función calculate_error&lt;br /&gt;
errors = [calculate_error(num_points) for num_points in num_points_trapz_values]&lt;br /&gt;
&lt;br /&gt;
# Calculamos errores teóricos para cada número de puntos utilizando la función theoretical_error&lt;br /&gt;
theoretical_errors = [theoretical_error(num_points) for num_points in num_points_trapz_values]&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
&lt;br /&gt;
# Graficamos los errores calculados en una escala logarítmica&lt;br /&gt;
plt.plot(np.log10(num_points_trapz_values), errors, color='blue', marker='o', linestyle='-', label='Error Práctico')&lt;br /&gt;
&lt;br /&gt;
# Graficamos los errores teóricos en una escala logarítmica&lt;br /&gt;
plt.plot(np.log10(num_points_trapz_values), theoretical_errors,  color='red',marker='s', linestyle='--', label='Error Teórico')&lt;br /&gt;
plt.title('Error Práctico vs. Teórico para Diferentes N')&lt;br /&gt;
plt.xlabel('$\log_{10}$(Numero de puntos para el trapecio)')&lt;br /&gt;
plt.ylabel('$\log_{10}$(error $(10^n))$')&lt;br /&gt;
plt.ylim(-16,5)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Observamos que la solución obtenida por la fórmula de Poisson mediante la fórmula del trapecio es buena en un punto en el interior del dominio. Sin embargo, el error en el método del trapecio cerca de la frontera de la región de integración conforme nos acercamos a &amp;lt;math&amp;gt;r=1&amp;lt;/math&amp;gt; crece. Consideramos fijar el número de puntos en la fórmula del trapecio en un valor determinado 100. Luego, trazamos la gráfica del error para puntos de la forma &amp;lt;math&amp;gt;(r, \theta) = (1 - 10^{-n}, \pi/4)&amp;lt;/math&amp;gt;, donde &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; representa la precisión de la aproximación. Se espera un aumento del error.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Error_conforme_nos_acercamos_a_la_frontera.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
num_points_trapz = 100&lt;br /&gt;
&lt;br /&gt;
# Función para calcular el error de la solución de Poisson&lt;br /&gt;
def calculate_error(num_points_trapz):&lt;br /&gt;
    r = 0.9&lt;br /&gt;
    theta = np.pi / 4&lt;br /&gt;
    &lt;br /&gt;
    # Calcula el valor exacto de la solución en el punto dado&lt;br /&gt;
    exact_value = exact_solution(r, theta)&lt;br /&gt;
    &lt;br /&gt;
    # Aproxima el valor de la solución utilizando el método de la integral trapezoidal&lt;br /&gt;
    approx_value = laplace_poisson(r, theta, num_points_trapz)&lt;br /&gt;
    &lt;br /&gt;
    # Calcula el error absoluto entre la solución exacta y la aproximada&lt;br /&gt;
    error = np.abs(exact_value - approx_value)&lt;br /&gt;
    &lt;br /&gt;
    # Si el error es muy pequeño, asigna un valor pequeño para evitar errores en el logaritmo&lt;br /&gt;
    if error == 0:&lt;br /&gt;
        error = 1e-16 &lt;br /&gt;
    &lt;br /&gt;
    # Retorna el logaritmo en base 10 del error multiplicado por 10 elevado a la potencia de num_points_trapz&lt;br /&gt;
    return np.log10(error)&lt;br /&gt;
&lt;br /&gt;
# Lista de valores para el número de puntos en la integral trapezoidal&lt;br /&gt;
num_points_trapz_values = [10**n for n in range(1, 8)]&lt;br /&gt;
&lt;br /&gt;
# Calcula el error para cada valor de número de puntos&lt;br /&gt;
errors = [calculate_error(num_points) for num_points in num_points_trapz_values]&lt;br /&gt;
&lt;br /&gt;
# Función para calcular la diferencia entre la solución exacta y la aproximada mediante el método de Laplace-Poisson&lt;br /&gt;
def calculate_error(r, theta, num_points_trapz):&lt;br /&gt;
    exact_value = exact_solution(r, theta)  # Calcula la solución exacta&lt;br /&gt;
    approx_value = laplace_poisson(r, theta, num_points_trapz)  # Calcula la solución aproximada&lt;br /&gt;
    error = np.abs(exact_value - approx_value)  # Calcula el error absoluto entre las dos soluciones&lt;br /&gt;
    if error == 0:&lt;br /&gt;
        error = 1e-16  # Evita errores en el cálculo del logaritmo si el error es cero&lt;br /&gt;
    return np.log10(error)  # Retorna el logaritmo en base 10 del error absoluto&lt;br /&gt;
&lt;br /&gt;
n_values = np.arange(1, 8)  # Genera valores de n desde 1 hasta 10&lt;br /&gt;
&lt;br /&gt;
# Genera valores de r y calcula los errores para diferentes valores de n&lt;br /&gt;
num_points_trapz = 100  # Número de puntos en la regla del trapecio&lt;br /&gt;
errors = []&lt;br /&gt;
for n in n_values:&lt;br /&gt;
    r = 1 - 1 / 10**n  # Calcula el valor de r&lt;br /&gt;
    theta = np.pi / 4  # Ángulo theta fijo&lt;br /&gt;
    errors.append(calculate_error(r, theta, num_points_trapz))  # Calcula el error para el valor de r actual&lt;br /&gt;
&lt;br /&gt;
# Grafica los errores en función de n&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(n_values, errors, color = 'blue', marker='o', linestyle='-')&lt;br /&gt;
plt.title('Error conforme nos acercamos a la frontera')&lt;br /&gt;
plt.xlabel('$n$ que sitasifacen la ecuación $r=1 - 1/10^n$')  # Etiqueta del eje x&lt;br /&gt;
plt.ylabel('$\log_{10}$(error $(10^n))$')  # Etiqueta del eje y&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Efectivamente el error aumenta conforme aumenta &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, como era de esperar debido al carácter singular de la integral.&lt;br /&gt;
&lt;br /&gt;
==Solución por Series de Fourier==&lt;br /&gt;
Procedemos ahora a resolver este problema mediante el uso de las series de Fourier,siendo de nuevo la solución &amp;lt;math&amp;gt; u(x,y) =xy &amp;lt;/math&amp;gt;, siendo su valor en la frontera &amp;lt;math&amp;gt; g(x,y) =xy &amp;lt;/math&amp;gt;.&lt;br /&gt;
Tomando nuestro problema en coordenadas polares obtenemos &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \begin{cases}&lt;br /&gt;
\Delta u=u_{rr}+\frac{1}{r}u_r+\frac{1}{r^2}u_{\theta\theta}=0, r\in(0,R),\theta\in[0,2\pi]\\&lt;br /&gt;
u(R,\theta)=G(\theta)=R^2 cos(\theta)sin(\theta), \theta\in[0,2\pi].&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde su solución viene definida por&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
u(r, \theta) = \frac{\alpha_{0}}{2}  +   \sum_{k=1}^{n} \left( \alpha_{k} \left(\frac{r}{R} \right)^k cos(k\theta) + \beta_{k} \left(\frac{r}{R} \right)^k sin(k\theta)\right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Para que se cumpla la condición frontera se debe verificar  &amp;lt;math&amp;gt; u(R,\theta)=G(\theta) &amp;lt;/math&amp;gt;, donde  R=1,al estar en la bola unidad. Siendo el desarrollo en series de Fourier de &amp;lt;math&amp;gt;G(\theta) &amp;lt;/math&amp;gt; considerando la base trigonométrica usual ,&amp;lt;math&amp;gt; L^2([-\pi,\pi]) &amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
G(\theta) = \frac{a_0}{2} + \sum_{k=1}^\infty (a_k \cos(k\theta) + b_k \sin(k\theta))&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde los coeficientes de Fourier son &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
a_0=\frac{1}{\pi} \int_{-\pi}^{\pi} G(\theta) \, d\theta &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
a_k = \frac{1}{\pi} \int_{-\pi}^{\pi} G(\theta) \cos(k\theta) \, d\theta &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
b_k = \frac{1}{\pi} \int_{-\pi}^{\pi} G(\theta)\sin(k\theta) \, d\theta&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Mientras que los coeficientes de Fourier para &amp;lt;math&amp;gt; G(\theta)=\cos(\theta)\sin(\theta)=\frac{1}{2}\sin(2\theta)&amp;lt;/math&amp;gt; son &amp;lt;math&amp;gt; a_0 = 0, a_k = 0  \forall k , b_k = 0  \forall k \neq 2 &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; b_2 = \frac{1}{2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Esto significa que la serie de Fourier de &amp;lt;math&amp;gt; G(\theta)&amp;lt;/math&amp;gt; se reduce simplemente a &amp;lt;math&amp;gt;u(r,\theta) = \frac{1}{2} r^2\sin(2\theta)&amp;lt;/math&amp;gt;con &lt;br /&gt;
&amp;lt;math&amp;gt;r\in [0,1]&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;\theta \in [0,2\pi]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Debido a que la solución por serie de Fourier tiene solo un número finito de términos, no tiene mucho sentido dibujar la gráfica con el error en función del número de términos, ya que el error desaparece completamente al alcanzar el segundo término, y no hay variación posterior del error al aumentar el número de términos.&lt;br /&gt;
&lt;br /&gt;
==4.4 Desigualdad de Harnack==&lt;br /&gt;
En esta sección, examinaremos la desigualdad de Harnack. Para ello, buscaremos la región la que deben estar todas las soluciones armónicas en la bola \( B_R \), que coinciden con \( u \), en \( (0,0) \)&lt;br /&gt;
&lt;br /&gt;
La ''desigualdad de Harnack'' se aplica a una función \( f \) no negativa definida en una bola cerrada en \( \mathbb{R}^n \) con radio \( R \) y centro \( x_0 \). Luego, no podemos aplicarla directamente a la función \( u(x,y) = xy \), ya que toma valores negativos. Por lo tanto, generaremos una nueva función, traslación de la anterior, \( v = u - M \), donde \( M \) es el mínimo de la función \( u(x,y) \). Esta función es tanto positiva como armónica, ya que \( \Delta u = \Delta v = 0 \), lo que implica que cumple las hipótesis de Harnack y nos permite aplicar la desigualdad.&lt;br /&gt;
&lt;br /&gt;
Comenzamos hallando el mínimo de la función \( g(x,y) = xy \) definida en \( \partial B_R(0) \). Pues vemos que la función \( u(x,y) = xy \), que expresada en polares responde a\( u(r,\theta) = r^2\sin(\theta)\cos(\theta) = \frac{r^2}{2}\sin(2\theta) \), alcanza su valor más bajo en la frontera cuando \( r \) tiende a \( R \) y el seno de \( \theta \) alcanza su mínimo, que es \( -1 \).  De modo que&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
: \(M=\min_{\partial B_R(0)}g(r,\theta) =\min_{\partial B_R(0)} R^2\sin(\theta)\cos(\theta)= \min_{\partial B_R(0)}\frac{R^2}{2}\sin(2\theta) =-\frac{R^2}{2}\)&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Luego, la función a la que se le va a aplicar Harnack será  \( v(r,\theta) = u(r,\theta) - M=\frac{r^2}{2}\sin(2\theta)+\frac{R^2}{2} \). Mostraremos a continuación las gráficas tanto de \(u(r,\theta) \) como de \(v(r,\theta) \) para asegurarnos de la positividad:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A continuación, se mostrará la expresión para dimensión 2 en la bola de radio \(R\) centrada en el origen. Teniendo en cuenta que \( v(0,\theta) = u(0,\theta)-M=-M \)&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:\( \frac{(R-r)}{(R+r)} \frac{R^2}{2} \leq v(r,\theta) \leq \frac{(R+r)}{(R-r)}\frac{R^2}{2}, \forall (r,\theta) \in B_{R} \)&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Dado que buscamos las cotas para \(u \), deshacemos el cambio de variable \(u(r,\theta)=v(r,\theta)+M  \) y obtenemos, sumando a ambos lados \(-\frac{R^2}{2} \), la siguiente desigualdad &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:\( -\frac{(R^2r)}{(R+r)} \leq u(r,\theta) \leq \frac{(R^2r)}{(R-r)}, \forall (r,\theta) \in B_{R} \)&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Finalmente, buscamos graficar estas dos cotas para representar la región en que deben estar todas las soluciones. Se harán tres gráficas para apreciar las diferencias a mediada que el radio aumenta&lt;br /&gt;
&lt;br /&gt;
-codigo,foto-&lt;br /&gt;
Observamos como el comportamiento a medida que aumenta el radio es similar. Para poder extraer otras conclusiones más notables tomaremos el eje y en escala logarítmica. De modo que no podremos graficar la cota dada por la función \(u\) pues el logaritmo de un valor negativo no está definido. Tomaremos la función \(v\) que ha sido construida como una función positiva. Mostraremos una gráfica dependiente del radio y en escala logarítmica para diferentes radios de la bola: \(R={1,2,10} \)&lt;br /&gt;
-codigo,foto-&lt;br /&gt;
Podemos apreciar como las cotas van aumentando a medida que el radio crece y viceversa. Esto quizá implica que la cantidad de soluciones armónicas en una bola aumenta a medida que lo hace el radio. Sin embargo, dado que las escalas son diferentes, mostraremos una foto solapada con todas ellas para que sea más visible este resultado.&lt;br /&gt;
-codigo,foto-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Estudiemos ahora qué pasaría si cambiamos la dimensión del espacio, en vez de en una circunferencia, en una esfera. Empleamos de nuevo la función \(v(r,\theta, \phi) \) que posee la no negatividad para aplicar Harnack donde el mínimo responde a la misma forma, \(\frac{R^2}{2} \), pues su función no ha cambiado. Análogamente, obtenemos&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:\( R\frac{(R-r)}{(R+r)^2} \frac{R^2}{2} \leq v(r,\theta, \phi) \leq R\frac{(R+r)}{(R-r)^2}\frac{R^2}{2}, \forall (r,\theta, \phi) \in B_{R} \)&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Y dado que buscamos las cotas de  \(u(r,\theta, \phi)=v(r,\theta, \phi)-M \) sumando a ambos lados de las desigualdades M llegamos a la siguiente acotación:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:\( \frac{(R-r)}{(R+r)^2}\frac{R^3}{2}- \frac{R^2}{2} \leq v(r,\theta, \phi) \leq R\frac{(R+r)}{(R-r)^2}\frac{R^3}{2}- \frac{R^2}{2}, \forall (r,\theta, \phi) \in B_{R} \)&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Representado de nuevo las funciones que definen la cota superior e inferior en función del radio para valores \(R={1,2,10} \), obtenemos las siguientes imágenes:&lt;br /&gt;
-codigo,foto-&lt;br /&gt;
De nuevo, realizaremos el cambio a escala logarítmica del eje y para apreciar mejor los resultados, de modo que la gráfica corresponderá a la función positiva \(v\).&lt;br /&gt;
-codigo,foto-&lt;br /&gt;
Siendo la gráfica conjunta la siguiente+&lt;br /&gt;
-codigo,foto-&lt;br /&gt;
&lt;br /&gt;
Finalmente, es de interés apreciar las diferencias con el cambio de dimensión. Para poder compararlas se han representado las dos gráficas adjuntadas anteriormente en escala logarítmica en una misma.&lt;br /&gt;
Resulta significativo examinar las diferencias que surgen al cambiar la dimensión de análisis. Con el propósito de facilitar una comparación, hemos integrado las dos representaciones gráficas previamente presentadas, en las cuales se empleaba una escala logarítmica, en una sola imagen. Esto nos permite visualizar de manera más clara y detallada cómo varían los datos en diferentes rangos y cómo se relacionan entre sí. Al emplear la escala logarítmica, se resaltan las diferencias de manera más equilibrada.&lt;br /&gt;
&lt;br /&gt;
=Ecuación de Poisson bidimensional=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para calcular la solución de la ecuación de Poisson &amp;lt;math&amp;gt; \Delta u = f &amp;lt;/math&amp;gt;, donde &amp;lt;math&amp;gt;\textbf{x} \in \mathbb{R}^2&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; es la función característica de la bola de radio 1, podemos utilizar el potencial logarítmico.&lt;br /&gt;
A partir del potencial logarítmico podemos utilizar la solución fundamental para obtener la solución de la ecuación.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; u(\textbf{x}) =-\frac{1}{2\pi} \int_{ \mathbb{R^2}} \log|\textbf{x}-\textbf{y}| f(y) \, dy &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por comodidad y la simetría de la función característica utilizaremos coordenadas polares. Por tanto las expresiones equivalentes son&lt;br /&gt;
&lt;br /&gt;
Potencial logarítmico en polares &amp;lt;math&amp;gt; (x_1,x_2)=(r\cos(\theta), r\sin(\theta))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \Phi(\textbf{x}) = \Phi(r,\theta)= -\frac{1}{2\pi} \log |(r\cos(\theta), r\sin(\theta))| = -\frac{1}{2\pi} \log r &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si además tomamos otro valor &amp;lt;math&amp;gt; \textbf{y} = (s\cos(\phi), s\sin(\phi))  &amp;lt;/math&amp;gt;. Entonces podemos expresar el potencial logarítmico en función de tres variables&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \Phi(\textbf{x}-\textbf{y}) = \Phi(r,\theta, s, \phi)=-\frac{1}{2\pi} \log |(r\cos(\theta), r\sin(\theta))-(s\cos(\phi), s\sin(\phi))| = -\frac{1}{2\pi} \log \left( \sqrt{r^2 - 2rs \cos(\theta - \phi) + s^2} \right) &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por otro lado función  &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; la escribimos como &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
f(\textbf{y})=f(s)=&lt;br /&gt;
\begin{cases} &lt;br /&gt;
1 &amp;amp; \text{si } s \leq 1 \\&lt;br /&gt;
0 &amp;amp; \text{si } s &amp;gt; 1 &lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Por tanto la integral en coordenadas polares tiene la siguiente expresión:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; u(\textbf{x}) = u(r,\theta)= -\frac{1}{2\pi} \int_{0}^{2\pi} \int_{0}^{1}  \log \left( \sqrt{r^2 - 2rs \cos(\theta - \phi) + s^2} \right)  s \, ds \, d\phi &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Resolvemos la integral de manera numérica mediante la integración por el método del trapecio dos veces (para la varible &amp;lt;math&amp;gt; s &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; \phi &amp;lt;/math&amp;gt;), mostramos además la solución de forma tridimensional  &amp;lt;math&amp;gt; (r,\theta,  u(r,\theta)) &amp;lt;/math&amp;gt; para así ver la propiedad asintótica de la misma.&lt;br /&gt;
 &lt;br /&gt;
Para verificar que la solución tiene el comportamiento esperado en el infinito, podemos estudiar cómo se comporta &amp;lt;math&amp;gt;u(\mathbf{x})&amp;lt;/math&amp;gt; cuando &amp;lt;math&amp;gt;|\mathbf{x}| \to \infty&amp;lt;/math&amp;gt;. O dicho de otra forma estudiar &amp;lt;math&amp;gt;\lim_{{r \to \infty}} u(r, \theta)&amp;lt;/math&amp;gt;. Asintóticamente la solución debería comportarse como  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
u(\mathbf{x}) = -\frac{M}{2\pi} \log |\mathbf{x}| + O\left(\frac{1}{|\mathbf{x}|}\right) \quad |\mathbf{x}| \to +\infty &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\text{Donde} \quad  M = \int_{\mathbb{R}^2} f(\mathbf{y}) \, d\mathbf{y} .&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Que escrito en coordenadas polares y con nuestros datos,&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
u(r,\theta) = -\frac{M}{2\pi} \log r + O\left(\frac{1}{r}\right) \quad r \to +\infty &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\text{Donde} \quad M = \int_{\mathbb{R}^2} \mathbb{1}_{\mathbb{B}(0,1)} (y) dy = \int_{0}^{1} \int_{0}^{2\pi} s \, ds = \pi.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para realizar esta verificación, evaluaremos la solución en valores de &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; cada vez más grandes dado un &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; fijo, y compararemos estos valores con la función &amp;lt;math&amp;gt;u_{\infty}(r,\theta)=-\frac{1}{2} \log(r)&amp;lt;/math&amp;gt;. Si la solución se comporta correctamente, esperaríamos que los valores calculados se aproximen a los valores de la función &amp;lt;math&amp;gt;u_{\infty}(r,\theta)&amp;lt;/math&amp;gt; a medida que &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; aumenta. Para ello calcularemos el error entre la solución obtenida y la función.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por lo tanto, al utilizar el potencial logarítmico para aproximar la ecuación de Poisson con &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; como la función característica de la bola de radio 1, podemos confirmar que la solución tiene el comportamiento esperado en el infinito, lo que valida la aproximación realizada.&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Dim_2.png&amp;diff=71763</id>
		<title>Archivo:Dim 2.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Dim_2.png&amp;diff=71763"/>
				<updated>2024-04-19T20:08:16Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_Laplace_y_de_Poisson._Grupo_Eau_De_Parfum_(EDP))&amp;diff=71516</id>
		<title>Ecuación de Laplace y de Poisson. Grupo Eau De Parfum (EDP))</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_Laplace_y_de_Poisson._Grupo_Eau_De_Parfum_(EDP))&amp;diff=71516"/>
				<updated>2024-04-19T16:28:48Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Conocimientos previos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación de Laplace y de Poisson. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
&lt;br /&gt;
=Introducción=&lt;br /&gt;
Este trabajo consistirá en el estudio&lt;br /&gt;
&lt;br /&gt;
=Contexto histórico=&lt;br /&gt;
[[Archivo:laplace_edp.jpg|200px|thumb|right|Pierre-Simon Laplace]]&lt;br /&gt;
Los estudios de fenómenos eléctricos y magnéticos tomaron forma a finales del siglo XVIII, estableciendo la electrostática y la magnetostática como disciplinas matemáticas al estilo newtoniano.&lt;br /&gt;
Dentro de esta rama, Poisson destacó como uno de sus pioneros, ya que entre otras contribuciones amplió y profundizó los estudios sobre el potencial gravitatorio realizados previamente por Euler, Lagrange y Laplace. En 1785, Laplace había propuesto que la variación del potencial en cualquier punto, ya sea dentro o fuera de un cuerpo que ejerce una atracción gravitatoria, se rige por la ecuación que hoy lleva su nombre.&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
\Delta u={\partial^2 u\over \partial x^2 } +&lt;br /&gt;
{\partial^2 u\over \partial y^2 } +&lt;br /&gt;
{\partial^2 u\over \partial z^2 } = 0.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
siendo u una función real.&lt;br /&gt;
Sin embargo, Poisson identificó en 1812 que esta ecuación no era aplicable a puntos (x,y,z) dentro del cuerpo atrayente. Así, reformuló la ecuación, conocida ahora como la ecuación de Poisson&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
\Delta u={\partial^2 u\over \partial x^2 } +&lt;br /&gt;
{\partial^2 u\over \partial y^2 } +&lt;br /&gt;
{\partial^2 u\over \partial z^2 } = f(x,y,z).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Conocimientos previos=&lt;br /&gt;
[[Archivo:Poisson_edp.jpg|200px|thumb|right|Siméon-Denis Poisson]]&lt;br /&gt;
Antes de comenzar será de gran ayuda introducir una serie de conceptos que utilizaremos a lo largo de este trabajo:&lt;br /&gt;
&lt;br /&gt;
'''Función armónica''':Una función &amp;lt;math&amp;gt;u \in C^{2}(\Omega)&amp;lt;/math&amp;gt;es armónica si &amp;lt;math&amp;gt;\Delta u =0&amp;lt;/math&amp;gt;, es decir, si &amp;lt;math&amp;gt;u &amp;lt;/math&amp;gt; es solución de la ecuación de Laplace.&lt;br /&gt;
&lt;br /&gt;
'''Desigualdad de Harnack''':Sea u armónica y &amp;lt;math&amp;gt;u \geq 0&amp;lt;/math&amp;gt; en &amp;lt;math&amp;gt;\Omega \subset \mathbb{R}^n &amp;lt;/math&amp;gt;. Supongamos &amp;lt;math&amp;gt;\overline{B_{R}}(z) \subset \Omega&amp;lt;/math&amp;gt;. Entonces &amp;lt;math&amp;gt;\forall x \in \overline{B_{R}}(z) \text{ con } |z-x|=r &amp;lt; R&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;{R^{n-2} (R-r)\over (R+r)^{n-1}} u(z)\le u(x)\le {R^{n-2}(R+r)\over (R-r)^{n-1}}u(z).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Solución fundamental''':La solución fundamental de la ecuación de Poisson es una función &amp;lt;math&amp;gt;\Phi&amp;lt;/math&amp;gt; tal que &amp;lt;math&amp;gt;\Delta \Phi =\delta&amp;lt;/math&amp;gt;, donde &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; representa la función de Dirichlet. Esta solución es fundamental en el sentido de que sirve como  generadora de soluciones más generales para la ecuación de Poisson bajo diversas condiciones de frontera.&lt;br /&gt;
&lt;br /&gt;
'''Fórmula de Poisson ''':La única solución  &amp;lt;math&amp;gt; u \in C^2(B_R(x_0))\cap C(\overline {B_R})&amp;lt;/math&amp;gt; del problema de Laplace  &amp;lt;math&amp;gt; \left \{ \begin{array}{ll} &lt;br /&gt;
&lt;br /&gt;
\Delta u=0, x\in B_R\\ &lt;br /&gt;
&lt;br /&gt;
u=g, x\in \partial B_R \\&lt;br /&gt;
\end{array} \right. &lt;br /&gt;
&amp;lt;/math&amp;gt;, se conoce como fórmula de Poisson, siendo su expresión :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x) = \frac{R^2 - |x - x_0|^2}{\omega_n R} \int_{\partial B_R(x_0)} \frac{g(\sigma)}{| (x - x_0)-\sigma|^n} d\sigma&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
donde &amp;lt;math&amp;gt; \omega_n &amp;lt;/math&amp;gt; representa la medida de la superficie de la esfera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cabe destacar que vamos a utilizar [[Series de Fourier (Grupo Eau De Parfum (EDP))|Series de Furier]]&lt;br /&gt;
&lt;br /&gt;
=Ecuación de Laplace=&lt;br /&gt;
Para iniciar el análisis de la ecuación de Laplace, primero es necesario plantear el problema que se desea resolver.&lt;br /&gt;
&lt;br /&gt;
Consideremos &amp;lt;math&amp;gt;B_1 \subset \mathbb{R}^2&amp;lt;/math&amp;gt; como la bola unidad centrada en el origen &amp;lt;math&amp;gt;(0, 0)&amp;lt;/math&amp;gt;. Analizaremos el siguiente problema:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\left \{ \begin{array}{ll}  &lt;br /&gt;
 \Delta u = 0, &amp;amp; x \in B_1 \\&lt;br /&gt;
 u = g, &amp;amp; x \in \partial B_1&lt;br /&gt;
\end{array} \right.  &lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nuestro objetivo es visualizar la solución de la ecuación de Laplace descrita arriba, empleando la fórmula de Poisson y las series de Fourier. Además, experimentaremos con cambios de la función frontera &amp;lt;math&amp;gt;g&amp;lt;/math&amp;gt; para observar cómo afectan la solución.&lt;br /&gt;
&lt;br /&gt;
==Solución de la ecuación de Laplace usando la fórmula de Poisson==&lt;br /&gt;
Tomaremos nuestro sistema en coordenadas polares &amp;lt;math&amp;gt;(r,\theta)&amp;lt;/math&amp;gt;, siendo la función frontera &amp;lt;math&amp;gt; g(\theta) = \max\left\{0, 1 - \frac{2}{\pi} |\theta - \pi|\right\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nos centraremos en resolver el problema descrito anteriormente utilizando la fórmula de Poisson en la bola de radio 1 centrada en el origen, que en coordenadas polares tiene la siguiente expresión:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; u(r,\theta)=\frac{1-r^2}{2\pi}\int_{\partial B_1} \frac{g(\phi)}{1+r^2-2rcos(\theta-\phi)} d\phi &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para aproximar la solución, emplearemos la fórmula del trapecio en la integración numérica, debido a su eficacia en la aproximación de integrales definidas.&lt;br /&gt;
&lt;br /&gt;
CODIGO+SOLUCION SIN FRONTERA&lt;br /&gt;
&lt;br /&gt;
Observamos que en la frontera la solución vale 0, cuando por continuidad esto no debería ser así. La razón principal por la que en la frontera no se puede utilizar directamente la fórmula de Poisson es porque la fórmula se deriva asumiendo que el punto en el que estamos calculando la solución está en el interior del dominio. Cuando estamos en la frontera, esta suposición ya no es válida, y necesitamos utilizar directamente la condición de contorno.&lt;br /&gt;
&lt;br /&gt;
Para abordar adecuadamente este problema, es imprescindible aplicar directamente la condición de contorno en la frontera. Esto implica que, en lugar de utilizar la fórmula de Poisson para esos puntos, debemos asignar los valores de la función de contorno g especificados para la frontera.&lt;br /&gt;
&lt;br /&gt;
CODIGO + SOLUCIÓN CON FRONTERA&lt;br /&gt;
&lt;br /&gt;
==Limitaciones de la fórmula de Poisson==&lt;br /&gt;
La fórmula de Poisson enfrenta limitaciones cerca de las fronteras del dominio debido a la singularidad de la integral. Esto se manifiesta en errores de aproximación, especialmente cuando se utiliza la fórmula del trapecio para la integración. Para investigar estos errores, analizaremos la solución exacta &amp;lt;math&amp;gt;u(x,y)=xy&amp;lt;/math&amp;gt;, que es armónica y mantiene su valor en la frontera &amp;lt;math&amp;gt;g(x,y)=xy&amp;lt;/math&amp;gt;. Mediante diferentes discretizaciones de la fórmula del trapecio, evaluaremos la precisión de la fórmula de Poisson y el impacto de la discretización en la aproximación de la solución.&lt;br /&gt;
&lt;br /&gt;
Por comodidad y por lo ya realizado anteriormente, llevaremos a cabo un cambio a coordenadas polares.Siendo &amp;lt;math&amp;gt;u(r,\theta)=r^2 cos(\theta)\sin(\theta)&amp;lt;/math&amp;gt; y dado que tomaremos la bola unidad entonces la condición frontera se expresa como &amp;lt;math&amp;gt;g(\theta)= cos(\theta)\sin(\theta)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Representamos las solución exacta&lt;br /&gt;
CODIGO+GRAFICA&lt;br /&gt;
&lt;br /&gt;
Para evaluar la precisión de estas aproximaciones, analizaremos el error en un punto específico, alejado de la frontera. El punto elegido para este análisis es &amp;lt;math&amp;gt; (r, \theta) = (0.9, \frac{\pi}{4})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
El error será cuantificado en una escala logarítmica definida como &amp;lt;math&amp;gt; f(n) = \log_{10}(\text{error}(10^n))&amp;lt;/math&amp;gt;, donde &amp;lt;math&amp;gt;\text{error}(10^n)&amp;lt;/math&amp;gt; representa el error computado al utilizar &amp;lt;math&amp;gt; 10^n &amp;lt;/math&amp;gt; puntos para la evaluación integral. Posteriormente, estos errores serán representados gráficamente para proporcionar una visión clara del comportamiento del error conforme aumenta el número de puntos de la discretización.&lt;br /&gt;
&lt;br /&gt;
CÓDIGO + GRÁFICA&lt;br /&gt;
&lt;br /&gt;
Además observamos que el error es del mismo orden que el de la regla del trapecio (como debería ser) para ello lo veremos en una gráfica posteriormente.&lt;br /&gt;
Considerando la siguiente integral&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
I  = \int_a^bf(x)dx &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Si la resolvemos mediante el método del trapecio, presentará el siguiente error&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
E_t = -\frac{1}{12n^2}f''(\xi)(b-a)^3&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde n es el número de puntos de la discretización.&lt;br /&gt;
En nuestro caso la función f sería:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \psi(r,\theta, \phi)=\frac{1-r^2}{2\pi} \frac{ cos(\phi)\sin(\phi)}{1+r^2-2rcos(\theta-\phi)} = \frac{1-r^2}{4\pi} \frac{ \sin(2\phi)}{1+r^2-2rcos(\theta-\phi)}   &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde, por ejemplo, nos interesa  calcular el error de la fórmula del trapecio en el punto &amp;lt;math&amp;gt; (r, \theta) = (0.9, \frac{\pi}{4})&amp;lt;/math&amp;gt;. Para ello primero sustituimos sendas variables en la función &amp;lt;math&amp;gt;\psi&amp;lt;/math&amp;gt;.&lt;br /&gt;
Además nuestro caso se integra en el intervalo &amp;lt;math&amp;gt;[0,2\pi]&amp;lt;/math&amp;gt; por tanto &amp;lt;math&amp;gt;a=0,b=2\pi&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Derivamos la expresión &amp;lt;math&amp;gt; \psi(0.9, \frac{\pi}{4}, \phi) &amp;lt;/math&amp;gt; dos veces respecto de &amp;lt;math&amp;gt; \phi &amp;lt;/math&amp;gt; y calculamos el máximo para de esta froma acotar el error como sigue, &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
 |E_t| = |-\frac{1}{12n^2}\psi''(0.9, \frac{\pi}{4}, \phi)(2\pi)^3| \leq \max_{\phi \in [0, 2\pi]} \left| -\frac{1}{12n^2} \psi''(0.9, \frac{\pi}{4}, \phi) (2\pi)^3 \right|&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
El máximo de la segunda derivada lo calculamos de forma numérica pues la expresión era difícil de calcular de manera simbólica y además se obtiene una cota más precisa del error que la que se obtendría acotando cada término. Dicho valor se alcanza aproximadamente en &amp;lt;math&amp;gt;\phi = \frac{\pi}{4}&amp;lt;/math&amp;gt;, lo cual además tiene sentido por la simetría en el denominador de &amp;lt;math&amp;gt; \psi(r,\theta, \phi) &amp;lt;/math&amp;gt; que alcanza el mínimo cuando &amp;lt;math&amp;gt; \theta = \phi &amp;lt;/math&amp;gt;.&lt;br /&gt;
Mostramos el  error teórico dado por la expresión.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; g(n) = log\max_{\phi \in [0, 2\pi]}|E_t(n,\phi)|&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
GRÁFICA ERROR TEÓRICO DEL TRAPECIO&lt;br /&gt;
Comparamos el error teórico con el error obtenido entre la solución exacta y la solución calculada.&lt;br /&gt;
GRÁFICA DE AMBOS ERRORES&lt;br /&gt;
&lt;br /&gt;
Observamos que la solución obtenida por la fórmula de Poisson mediante la fórmula del trapecio es buena en un punto en el interior del dominio. Sin embargo, el error en el método del trapecio cerca de la frontera de la región de integración con forme nos acercamos a &amp;lt;math&amp;gt;r=1&amp;lt;/math&amp;gt; crece. Consideramos fijar el número de puntos en la fórmula del trapecio en un valor determinado 100. Luego, trazamos la gráfica del error para puntos de la forma &amp;lt;math&amp;gt;(r, \theta) = (1 - 10^{-n}, \pi/4)&amp;lt;/math&amp;gt;, donde &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; representa la precisión de la aproximación. Se espera un aumento del error.&lt;br /&gt;
&lt;br /&gt;
GRÁFICA DE ERRORES CERCA DE LA FRONTERA&lt;br /&gt;
Efectivamente el error aumenta conforme aumenta &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, como era de esperar debido al carácter singular de la integral.&lt;br /&gt;
&lt;br /&gt;
==Solución por Series de Fourier==&lt;br /&gt;
Procedemos ahora a resolver este problema mediante el uso de las series de Fourier,siendo de nuevo la solución &amp;lt;math&amp;gt; u(x,y) =xy &amp;lt;/math&amp;gt;, siendo su valor en la frontera &amp;lt;math&amp;gt; g(x,y) =xy &amp;lt;/math&amp;gt;.&lt;br /&gt;
Tomando nuestro problema en coordenadas polares obtenemos &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \begin{cases}&lt;br /&gt;
\Delta u=u_{rr}+\frac{1}{r}u_r+\frac{1}{r^2}u_{\theta\theta}=0, r\in(0,R),\theta\in[0,2\pi]\\&lt;br /&gt;
u(R,\theta)=G(\theta)=R^2 cos(\theta)sin(\theta), \theta\in[0,2\pi].&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde su solución viene definida por&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
u(r, \theta) = \frac{\alpha_{0}}{2}  +   \sum_{k=1}^{n} \left( \alpha_{k} \left(\frac{r}{R} \right)^k cos(k\theta) + \beta_{k} \left(\frac{r}{R} \right)^k sin(k\theta)\right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Para que se cumpla la condición frontera se debe verificar  &amp;lt;math&amp;gt; u(R,\theta)=G(\theta) &amp;lt;/math&amp;gt;, donde  R=1,al estar en la bola unidad. Siendo el desarrollo en series de Fourier de &amp;lt;math&amp;gt;G(\theta) &amp;lt;/math&amp;gt; considerando la base trigonométrica usual ,&amp;lt;math&amp;gt; L^2([-\pi,\pi]) &amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
G(\theta) = \frac{a_0}{2} + \sum_{k=1}^\infty (a_k \cos(k\theta) + b_k \sin(k\theta))&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde los coeficientes de Fourier son &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
a_0=\frac{1}{\pi} \int_{-\pi}^{\pi} G(\theta) \, d\theta &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
a_k = \frac{1}{\pi} \int_{-\pi}^{\pi} G(\theta) \cos(k\theta) \, d\theta &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
b_k = \frac{1}{\pi} \int_{-\pi}^{\pi} G(\theta)\sin(k\theta) \, d\theta&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Mientras que los coeficientes de Fourier para &amp;lt;math&amp;gt; G(\theta)=\cos(\theta)\sin(\theta)=\frac{1}{2}\sin(2\theta)&amp;lt;/math&amp;gt; son &amp;lt;math&amp;gt; a_0 = 0, a_k = 0  \forall k , b_k = 0  \forall k \neq 2 &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; b_2 = \frac{1}{2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Esto significa que la serie de Fourier de &amp;lt;math&amp;gt; G(\theta)&amp;lt;/math&amp;gt; se reduce simplemente a &amp;lt;math&amp;gt;u(r,\theta) = \frac{1}{2} r^2\sin(2\theta)&amp;lt;/math&amp;gt;con &lt;br /&gt;
&amp;lt;math&amp;gt;r\in [0,1]&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;\theta \in [0,2\pi]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Debido a que la solución por serie de Fourier tiene solo un número finito de términos, no tiene mucho sentido dibujar la gráfica con el error en función del número de términos, ya que el error desaparece completamente al alcanzar el segundo término, y no hay variación posterior del error al aumentar el número de términos.&lt;br /&gt;
&lt;br /&gt;
==4.4==&lt;br /&gt;
&lt;br /&gt;
=Ecuación de Poisson bidimensional=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para calcular la solución de la ecuación de Poisson &amp;lt;math&amp;gt; \Delta u = f &amp;lt;/math&amp;gt;, donde &amp;lt;math&amp;gt;x \in \mathbb{R}^2&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; es la función característica de la bola de radio 1, podemos utilizar el potencial logarítmico.&lt;br /&gt;
A partir del potencial logarítmico podemos utilizar la solución fundamental para obtener la solución de la ecuación.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; u(x) =-\frac{1}{2\pi} \int_{ \mathbb{R^2}} \log|x-y| f(y) \, dy &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por comodidad y la simetría de la función característica utilizaremos coordenadas polares. Por tanto las expresiones equivalentes son.&lt;br /&gt;
&lt;br /&gt;
Potencial logarítmico en polares &amp;lt;math&amp;gt; (x_1,x_2)=(r\cos(\theta), r\sin(\theta))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \Phi(\textbf{x}) = \Phi(r,\theta)= -\frac{1}{2\pi} \log |(r\cos(\theta), r\sin(\theta))| = log \frac{1}{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si además tomamos otro valor &amp;lt;math&amp;gt; \textbf{y} = (s\cos(\phi), s\sin(\phi))  &amp;lt;/math&amp;gt;. Entonces podemos expresar el potencial logarítmico en función de tres variables.&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \Phi(\textbf{x}-\textbf{y}) = \Phi(r,\theta, s, \phi)=-\frac{1}{2\pi} \log |(r\cos(\theta), r\sin(\theta))-(s\cos(\phi), s\sin(\phi))| = -\frac{1}{2\pi} \log \left( \sqrt{r^2 - 2rs \cos(\theta - \phi) + s^2} \right) &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por otro lado función  &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; la escribimos como, &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
f(\textbf{y})=f(s)=&lt;br /&gt;
\begin{cases} &lt;br /&gt;
1 &amp;amp; \text{si } s \leq 1 \\&lt;br /&gt;
0 &amp;amp; \text{si } s &amp;gt; 1 &lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Por tanto la integral en coordenadas polares tiene la siguiente expresión:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; u(\textbf{x}) = u(r,\theta)= -\frac{1}{2\pi} \int_{0}^{2\pi} \int_{0}^{1}  \log \left( \sqrt{r^2 - 2rs \cos(\theta - \phi) + s^2} \right)  s \, ds \, d\phi &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para verificar que la solución tiene el comportamiento esperado en el infinito, podemos estudiar cómo se comporta &amp;lt;math&amp;gt;u(x)&amp;lt;/math&amp;gt; cuando &amp;lt;math&amp;gt;|x| \to \infty&amp;lt;/math&amp;gt;. Esto implica analizar cómo se reduce la contribución del logaritmo cuando &amp;lt;math&amp;gt;|x - y|&amp;lt;/math&amp;gt; es grande. En el infinito, esperamos que la contribución del logaritmo se vuelva despreciable, lo que nos llevaría a concluir que &amp;lt;math&amp;gt;u(x)&amp;lt;/math&amp;gt; converge a una constante.&lt;br /&gt;
&lt;br /&gt;
Por lo tanto, al utilizar el potencial logarítmico para aproximar la ecuación de Poisson con $f$ como la función característica de la bola de radio 1, podemos confirmar que la solución tiene el comportamiento esperado en el infinito, lo que valida la aproximación realizada.&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_Laplace_y_de_Poisson._Grupo_Eau_De_Parfum_(EDP))&amp;diff=71515</id>
		<title>Ecuación de Laplace y de Poisson. Grupo Eau De Parfum (EDP))</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_de_Laplace_y_de_Poisson._Grupo_Eau_De_Parfum_(EDP))&amp;diff=71515"/>
				<updated>2024-04-19T16:27:33Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Conocimientos previos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación de Laplace y de Poisson. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
&lt;br /&gt;
=Introducción=&lt;br /&gt;
Este trabajo consistirá en el estudio&lt;br /&gt;
&lt;br /&gt;
=Contexto histórico=&lt;br /&gt;
[[Archivo:laplace_edp.jpg|200px|thumb|right|Pierre-Simon Laplace]]&lt;br /&gt;
Los estudios de fenómenos eléctricos y magnéticos tomaron forma a finales del siglo XVIII, estableciendo la electrostática y la magnetostática como disciplinas matemáticas al estilo newtoniano.&lt;br /&gt;
Dentro de esta rama, Poisson destacó como uno de sus pioneros, ya que entre otras contribuciones amplió y profundizó los estudios sobre el potencial gravitatorio realizados previamente por Euler, Lagrange y Laplace. En 1785, Laplace había propuesto que la variación del potencial en cualquier punto, ya sea dentro o fuera de un cuerpo que ejerce una atracción gravitatoria, se rige por la ecuación que hoy lleva su nombre.&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
\Delta u={\partial^2 u\over \partial x^2 } +&lt;br /&gt;
{\partial^2 u\over \partial y^2 } +&lt;br /&gt;
{\partial^2 u\over \partial z^2 } = 0.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
siendo u una función real.&lt;br /&gt;
Sin embargo, Poisson identificó en 1812 que esta ecuación no era aplicable a puntos (x,y,z) dentro del cuerpo atrayente. Así, reformuló la ecuación, conocida ahora como la ecuación de Poisson&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
\Delta u={\partial^2 u\over \partial x^2 } +&lt;br /&gt;
{\partial^2 u\over \partial y^2 } +&lt;br /&gt;
{\partial^2 u\over \partial z^2 } = f(x,y,z).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Conocimientos previos=&lt;br /&gt;
[[Archivo:Poisson_edp.jpg|200px|thumb|right|Siméon-Denis Poisson]]&lt;br /&gt;
Antes de comenzar será de gran ayuda introducir una serie de conceptos que utilizaremos a lo largo de este trabajo:&lt;br /&gt;
&lt;br /&gt;
'''Función armónica''':Una función &amp;lt;math&amp;gt;u \in C^{2}(\Omega)&amp;lt;/math&amp;gt;es armónica si &amp;lt;math&amp;gt;\Delta u =0&amp;lt;/math&amp;gt;, es decir, si &amp;lt;math&amp;gt;u &amp;lt;/math&amp;gt; es solución de la ecuación de Laplace.&lt;br /&gt;
&lt;br /&gt;
'''Desigualdad de Harnack''':Sea u armónica y &amp;lt;math&amp;gt;u \geq 0&amp;lt;/math&amp;gt; en &amp;lt;math&amp;gt;\Omega \subset \mathbb{R}^n &amp;lt;/math&amp;gt;. Supongamos &amp;lt;math&amp;gt;\overline{B_{R}}(z) \subset \Omega&amp;lt;/math&amp;gt;. Entonces &amp;lt;math&amp;gt;\forall x \in \overline{B_{R}}(z),r=|z-x| &amp;lt; R&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;{R^{n-2} (R-r)\over (R+r)^{n-1}} u(z)\le u(x)\le {R^{n-2}(R+r)\over (R-r)^{n-1}}u(z).&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Solución fundamental''':La solución fundamental de la ecuación de Poisson es una función &amp;lt;math&amp;gt;\Phi&amp;lt;/math&amp;gt; tal que &amp;lt;math&amp;gt;\Delta \Phi =\delta&amp;lt;/math&amp;gt;, donde &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; representa la función de Dirichlet. Esta solución es fundamental en el sentido de que sirve como  generadora de soluciones más generales para la ecuación de Poisson bajo diversas condiciones de frontera.&lt;br /&gt;
&lt;br /&gt;
'''Fórmula de Poisson ''':La única solución  &amp;lt;math&amp;gt; u \in C^2(B_R(x_0))\cap C(\overline {B_R})&amp;lt;/math&amp;gt; del problema de Laplace  &amp;lt;math&amp;gt; \left \{ \begin{array}{ll} &lt;br /&gt;
&lt;br /&gt;
\Delta u=0, x\in B_R\\ &lt;br /&gt;
&lt;br /&gt;
u=g, x\in \partial B_R \\&lt;br /&gt;
\end{array} \right. &lt;br /&gt;
&amp;lt;/math&amp;gt;, se conoce como fórmula de Poisson, siendo su expresión :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x) = \frac{R^2 - |x - x_0|^2}{\omega_n R} \int_{\partial B_R(x_0)} \frac{g(\sigma)}{| (x - x_0)-\sigma|^n} d\sigma&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
donde &amp;lt;math&amp;gt; \omega_n &amp;lt;/math&amp;gt; representa la medida de la superficie de la esfera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cabe destacar que vamos a utilizar [[Series de Fourier (Grupo Eau De Parfum (EDP))|Series de Furier]]&lt;br /&gt;
&lt;br /&gt;
=Ecuación de Laplace=&lt;br /&gt;
Para iniciar el análisis de la ecuación de Laplace, primero es necesario plantear el problema que se desea resolver.&lt;br /&gt;
&lt;br /&gt;
Consideremos &amp;lt;math&amp;gt;B_1 \subset \mathbb{R}^2&amp;lt;/math&amp;gt; como la bola unidad centrada en el origen &amp;lt;math&amp;gt;(0, 0)&amp;lt;/math&amp;gt;. Analizaremos el siguiente problema:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\left \{ \begin{array}{ll}  &lt;br /&gt;
 \Delta u = 0, &amp;amp; x \in B_1 \\&lt;br /&gt;
 u = g, &amp;amp; x \in \partial B_1&lt;br /&gt;
\end{array} \right.  &lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nuestro objetivo es visualizar la solución de la ecuación de Laplace descrita arriba, empleando la fórmula de Poisson y las series de Fourier. Además, experimentaremos con cambios de la función frontera &amp;lt;math&amp;gt;g&amp;lt;/math&amp;gt; para observar cómo afectan la solución.&lt;br /&gt;
&lt;br /&gt;
==Solución de la ecuación de Laplace usando la fórmula de Poisson==&lt;br /&gt;
Tomaremos nuestro sistema en coordenadas polares &amp;lt;math&amp;gt;(r,\theta)&amp;lt;/math&amp;gt;, siendo la función frontera &amp;lt;math&amp;gt; g(\theta) = \max\left\{0, 1 - \frac{2}{\pi} |\theta - \pi|\right\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nos centraremos en resolver el problema descrito anteriormente utilizando la fórmula de Poisson en la bola de radio 1 centrada en el origen, que en coordenadas polares tiene la siguiente expresión:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; u(r,\theta)=\frac{1-r^2}{2\pi}\int_{\partial B_1} \frac{g(\phi)}{1+r^2-2rcos(\theta-\phi)} d\phi &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para aproximar la solución, emplearemos la fórmula del trapecio en la integración numérica, debido a su eficacia en la aproximación de integrales definidas.&lt;br /&gt;
&lt;br /&gt;
CODIGO+SOLUCION SIN FRONTERA&lt;br /&gt;
&lt;br /&gt;
Observamos que en la frontera la solución vale 0, cuando por continuidad esto no debería ser así. La razón principal por la que en la frontera no se puede utilizar directamente la fórmula de Poisson es porque la fórmula se deriva asumiendo que el punto en el que estamos calculando la solución está en el interior del dominio. Cuando estamos en la frontera, esta suposición ya no es válida, y necesitamos utilizar directamente la condición de contorno.&lt;br /&gt;
&lt;br /&gt;
Para abordar adecuadamente este problema, es imprescindible aplicar directamente la condición de contorno en la frontera. Esto implica que, en lugar de utilizar la fórmula de Poisson para esos puntos, debemos asignar los valores de la función de contorno g especificados para la frontera.&lt;br /&gt;
&lt;br /&gt;
CODIGO + SOLUCIÓN CON FRONTERA&lt;br /&gt;
&lt;br /&gt;
==Limitaciones de la fórmula de Poisson==&lt;br /&gt;
La fórmula de Poisson enfrenta limitaciones cerca de las fronteras del dominio debido a la singularidad de la integral. Esto se manifiesta en errores de aproximación, especialmente cuando se utiliza la fórmula del trapecio para la integración. Para investigar estos errores, analizaremos la solución exacta &amp;lt;math&amp;gt;u(x,y)=xy&amp;lt;/math&amp;gt;, que es armónica y mantiene su valor en la frontera &amp;lt;math&amp;gt;g(x,y)=xy&amp;lt;/math&amp;gt;. Mediante diferentes discretizaciones de la fórmula del trapecio, evaluaremos la precisión de la fórmula de Poisson y el impacto de la discretización en la aproximación de la solución.&lt;br /&gt;
&lt;br /&gt;
Por comodidad y por lo ya realizado anteriormente, llevaremos a cabo un cambio a coordenadas polares.Siendo &amp;lt;math&amp;gt;u(r,\theta)=r^2 cos(\theta)\sin(\theta)&amp;lt;/math&amp;gt; y dado que tomaremos la bola unidad entonces la condición frontera se expresa como &amp;lt;math&amp;gt;g(\theta)= cos(\theta)\sin(\theta)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Representamos las solución exacta&lt;br /&gt;
CODIGO+GRAFICA&lt;br /&gt;
&lt;br /&gt;
Para evaluar la precisión de estas aproximaciones, analizaremos el error en un punto específico, alejado de la frontera. El punto elegido para este análisis es &amp;lt;math&amp;gt; (r, \theta) = (0.9, \frac{\pi}{4})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
El error será cuantificado en una escala logarítmica definida como &amp;lt;math&amp;gt; f(n) = \log_{10}(\text{error}(10^n))&amp;lt;/math&amp;gt;, donde &amp;lt;math&amp;gt;\text{error}(10^n)&amp;lt;/math&amp;gt; representa el error computado al utilizar &amp;lt;math&amp;gt; 10^n &amp;lt;/math&amp;gt; puntos para la evaluación integral. Posteriormente, estos errores serán representados gráficamente para proporcionar una visión clara del comportamiento del error conforme aumenta el número de puntos de la discretización.&lt;br /&gt;
&lt;br /&gt;
CÓDIGO + GRÁFICA&lt;br /&gt;
&lt;br /&gt;
Además observamos que el error es del mismo orden que el de la regla del trapecio (como debería ser) para ello lo veremos en una gráfica posteriormente.&lt;br /&gt;
Considerando la siguiente integral&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
I  = \int_a^bf(x)dx &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Si la resolvemos mediante el método del trapecio, presentará el siguiente error&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
E_t = -\frac{1}{12n^2}f''(\xi)(b-a)^3&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde n es el número de puntos de la discretización.&lt;br /&gt;
En nuestro caso la función f sería:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \psi(r,\theta, \phi)=\frac{1-r^2}{2\pi} \frac{ cos(\phi)\sin(\phi)}{1+r^2-2rcos(\theta-\phi)} = \frac{1-r^2}{4\pi} \frac{ \sin(2\phi)}{1+r^2-2rcos(\theta-\phi)}   &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde, por ejemplo, nos interesa  calcular el error de la fórmula del trapecio en el punto &amp;lt;math&amp;gt; (r, \theta) = (0.9, \frac{\pi}{4})&amp;lt;/math&amp;gt;. Para ello primero sustituimos sendas variables en la función &amp;lt;math&amp;gt;\psi&amp;lt;/math&amp;gt;.&lt;br /&gt;
Además nuestro caso se integra en el intervalo &amp;lt;math&amp;gt;[0,2\pi]&amp;lt;/math&amp;gt; por tanto &amp;lt;math&amp;gt;a=0,b=2\pi&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Derivamos la expresión &amp;lt;math&amp;gt; \psi(0.9, \frac{\pi}{4}, \phi) &amp;lt;/math&amp;gt; dos veces respecto de &amp;lt;math&amp;gt; \phi &amp;lt;/math&amp;gt; y calculamos el máximo para de esta froma acotar el error como sigue, &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
 |E_t| = |-\frac{1}{12n^2}\psi''(0.9, \frac{\pi}{4}, \phi)(2\pi)^3| \leq \max_{\phi \in [0, 2\pi]} \left| -\frac{1}{12n^2} \psi''(0.9, \frac{\pi}{4}, \phi) (2\pi)^3 \right|&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
El máximo de la segunda derivada lo calculamos de forma numérica pues la expresión era difícil de calcular de manera simbólica y además se obtiene una cota más precisa del error que la que se obtendría acotando cada término. Dicho valor se alcanza aproximadamente en &amp;lt;math&amp;gt;\phi = \frac{\pi}{4}&amp;lt;/math&amp;gt;, lo cual además tiene sentido por la simetría en el denominador de &amp;lt;math&amp;gt; \psi(r,\theta, \phi) &amp;lt;/math&amp;gt; que alcanza el mínimo cuando &amp;lt;math&amp;gt; \theta = \phi &amp;lt;/math&amp;gt;.&lt;br /&gt;
Mostramos el  error teórico dado por la expresión.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; g(n) = log\max_{\phi \in [0, 2\pi]}|E_t(n,\phi)|&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
GRÁFICA ERROR TEÓRICO DEL TRAPECIO&lt;br /&gt;
Comparamos el error teórico con el error obtenido entre la solución exacta y la solución calculada.&lt;br /&gt;
GRÁFICA DE AMBOS ERRORES&lt;br /&gt;
&lt;br /&gt;
Observamos que la solución obtenida por la fórmula de Poisson mediante la fórmula del trapecio es buena en un punto en el interior del dominio. Sin embargo, el error en el método del trapecio cerca de la frontera de la región de integración con forme nos acercamos a &amp;lt;math&amp;gt;r=1&amp;lt;/math&amp;gt; crece. Consideramos fijar el número de puntos en la fórmula del trapecio en un valor determinado 100. Luego, trazamos la gráfica del error para puntos de la forma &amp;lt;math&amp;gt;(r, \theta) = (1 - 10^{-n}, \pi/4)&amp;lt;/math&amp;gt;, donde &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; representa la precisión de la aproximación. Se espera un aumento del error.&lt;br /&gt;
&lt;br /&gt;
GRÁFICA DE ERRORES CERCA DE LA FRONTERA&lt;br /&gt;
Efectivamente el error aumenta conforme aumenta &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, como era de esperar debido al carácter singular de la integral.&lt;br /&gt;
&lt;br /&gt;
==Solución por Series de Fourier==&lt;br /&gt;
Procedemos ahora a resolver este problema mediante el uso de las series de Fourier,siendo de nuevo la solución &amp;lt;math&amp;gt; u(x,y) =xy &amp;lt;/math&amp;gt;, siendo su valor en la frontera &amp;lt;math&amp;gt; g(x,y) =xy &amp;lt;/math&amp;gt;.&lt;br /&gt;
Tomando nuestro problema en coordenadas polares obtenemos &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \begin{cases}&lt;br /&gt;
\Delta u=u_{rr}+\frac{1}{r}u_r+\frac{1}{r^2}u_{\theta\theta}=0, r\in(0,R),\theta\in[0,2\pi]\\&lt;br /&gt;
u(R,\theta)=G(\theta)=R^2 cos(\theta)sin(\theta), \theta\in[0,2\pi].&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde su solución viene definida por&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&lt;br /&gt;
u(r, \theta) = \frac{\alpha_{0}}{2}  +   \sum_{k=1}^{n} \left( \alpha_{k} \left(\frac{r}{R} \right)^k cos(k\theta) + \beta_{k} \left(\frac{r}{R} \right)^k sin(k\theta)\right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Para que se cumpla la condición frontera se debe verificar  &amp;lt;math&amp;gt; u(R,\theta)=G(\theta) &amp;lt;/math&amp;gt;, donde  R=1,al estar en la bola unidad. Siendo el desarrollo en series de Fourier de &amp;lt;math&amp;gt;G(\theta) &amp;lt;/math&amp;gt; considerando la base trigonométrica usual ,&amp;lt;math&amp;gt; L^2([-\pi,\pi]) &amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
G(\theta) = \frac{a_0}{2} + \sum_{k=1}^\infty (a_k \cos(k\theta) + b_k \sin(k\theta))&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Donde los coeficientes de Fourier son &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
a_0=\frac{1}{\pi} \int_{-\pi}^{\pi} G(\theta) \, d\theta &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
a_k = \frac{1}{\pi} \int_{-\pi}^{\pi} G(\theta) \cos(k\theta) \, d\theta &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
b_k = \frac{1}{\pi} \int_{-\pi}^{\pi} G(\theta)\sin(k\theta) \, d\theta&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Mientras que los coeficientes de Fourier para &amp;lt;math&amp;gt; G(\theta)=\cos(\theta)\sin(\theta)=\frac{1}{2}\sin(2\theta)&amp;lt;/math&amp;gt; son &amp;lt;math&amp;gt; a_0 = 0, a_k = 0  \forall k , b_k = 0  \forall k \neq 2 &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt; b_2 = \frac{1}{2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Esto significa que la serie de Fourier de &amp;lt;math&amp;gt; G(\theta)&amp;lt;/math&amp;gt; se reduce simplemente a &amp;lt;math&amp;gt;u(r,\theta) = \frac{1}{2} r^2\sin(2\theta)&amp;lt;/math&amp;gt;con &lt;br /&gt;
&amp;lt;math&amp;gt;r\in [0,1]&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;\theta \in [0,2\pi]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Debido a que la solución por serie de Fourier tiene solo un número finito de términos, no tiene mucho sentido dibujar la gráfica con el error en función del número de términos, ya que el error desaparece completamente al alcanzar el segundo término, y no hay variación posterior del error al aumentar el número de términos.&lt;br /&gt;
&lt;br /&gt;
==4.4==&lt;br /&gt;
&lt;br /&gt;
=Ecuación de Poisson bidimensional=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para calcular la solución de la ecuación de Poisson &amp;lt;math&amp;gt; \Delta u = f &amp;lt;/math&amp;gt;, donde &amp;lt;math&amp;gt;x \in \mathbb{R}^2&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; es la función característica de la bola de radio 1, podemos utilizar el potencial logarítmico.&lt;br /&gt;
A partir del potencial logarítmico podemos utilizar la solución fundamental para obtener la solución de la ecuación.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; u(x) =-\frac{1}{2\pi} \int_{ \mathbb{R^2}} \log|x-y| f(y) \, dy &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por comodidad y la simetría de la función característica utilizaremos coordenadas polares. Por tanto las expresiones equivalentes son.&lt;br /&gt;
&lt;br /&gt;
Potencial logarítmico en polares &amp;lt;math&amp;gt; (x_1,x_2)=(r\cos(\theta), r\sin(\theta))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \Phi(\textbf{x}) = \Phi(r,\theta)= -\frac{1}{2\pi} \log |(r\cos(\theta), r\sin(\theta))| = log \frac{1}{r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si además tomamos otro valor &amp;lt;math&amp;gt; \textbf{y} = (s\cos(\phi), s\sin(\phi))  &amp;lt;/math&amp;gt;. Entonces podemos expresar el potencial logarítmico en función de tres variables.&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \Phi(\textbf{x}-\textbf{y}) = \Phi(r,\theta, s, \phi)=-\frac{1}{2\pi} \log |(r\cos(\theta), r\sin(\theta))-(s\cos(\phi), s\sin(\phi))| = -\frac{1}{2\pi} \log \left( \sqrt{r^2 - 2rs \cos(\theta - \phi) + s^2} \right) &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por otro lado función  &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; la escribimos como, &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
f(\textbf{y})=f(s)=&lt;br /&gt;
\begin{cases} &lt;br /&gt;
1 &amp;amp; \text{si } s \leq 1 \\&lt;br /&gt;
0 &amp;amp; \text{si } s &amp;gt; 1 &lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Por tanto la integral en coordenadas polares tiene la siguiente expresión:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; u(\textbf{x}) = u(r,\theta)= -\frac{1}{2\pi} \int_{0}^{2\pi} \int_{0}^{1}  \log \left( \sqrt{r^2 - 2rs \cos(\theta - \phi) + s^2} \right)  s \, ds \, d\phi &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para verificar que la solución tiene el comportamiento esperado en el infinito, podemos estudiar cómo se comporta &amp;lt;math&amp;gt;u(x)&amp;lt;/math&amp;gt; cuando &amp;lt;math&amp;gt;|x| \to \infty&amp;lt;/math&amp;gt;. Esto implica analizar cómo se reduce la contribución del logaritmo cuando &amp;lt;math&amp;gt;|x - y|&amp;lt;/math&amp;gt; es grande. En el infinito, esperamos que la contribución del logaritmo se vuelva despreciable, lo que nos llevaría a concluir que &amp;lt;math&amp;gt;u(x)&amp;lt;/math&amp;gt; converge a una constante.&lt;br /&gt;
&lt;br /&gt;
Por lo tanto, al utilizar el potencial logarítmico para aproximar la ecuación de Poisson con $f$ como la función característica de la bola de radio 1, podemos confirmar que la solución tiene el comportamiento esperado en el infinito, lo que valida la aproximación realizada.&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Cotas_Harnack_R%3D1.png&amp;diff=71467</id>
		<title>Archivo:Cotas Harnack R=1.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Cotas_Harnack_R%3D1.png&amp;diff=71467"/>
				<updated>2024-04-19T14:57:18Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:M%C3%A1ximo_de_la_segunda_derivada_en_funci%C3%B3n_del_n%C3%BAmero_de_divisiones_de_la_malla.png&amp;diff=71465</id>
		<title>Archivo:Máximo de la segunda derivada en función del número de divisiones de la malla.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:M%C3%A1ximo_de_la_segunda_derivada_en_funci%C3%B3n_del_n%C3%BAmero_de_divisiones_de_la_malla.png&amp;diff=71465"/>
				<updated>2024-04-19T14:56:16Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Error_Te%C3%B3rico_vs._N%C3%BAmero_de_Puntos_en_la_Regla_del_Trapecio.png&amp;diff=71463</id>
		<title>Archivo:Error Teórico vs. Número de Puntos en la Regla del Trapecio.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Error_Te%C3%B3rico_vs._N%C3%BAmero_de_Puntos_en_la_Regla_del_Trapecio.png&amp;diff=71463"/>
				<updated>2024-04-19T14:56:01Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Error_Pr%C3%A1ctico_vs._Te%C3%B3rico_para_Diferentes_N.png&amp;diff=71462</id>
		<title>Archivo:Error Práctico vs. Teórico para Diferentes N.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Error_Pr%C3%A1ctico_vs._Te%C3%B3rico_para_Diferentes_N.png&amp;diff=71462"/>
				<updated>2024-04-19T14:55:46Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Cotas_Harnack_R%3D10.png&amp;diff=71212</id>
		<title>Archivo:Cotas Harnack R=10.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Cotas_Harnack_R%3D10.png&amp;diff=71212"/>
				<updated>2024-04-19T09:37:18Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Cotas_Harnack_R%3D2.png&amp;diff=71210</id>
		<title>Archivo:Cotas Harnack R=2.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Cotas_Harnack_R%3D2.png&amp;diff=71210"/>
				<updated>2024-04-19T09:36:50Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Soluci%C3%B3n_de_Laplace_en_el_disco_unidad.png&amp;diff=71200</id>
		<title>Archivo:Solución de Laplace en el disco unidad.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Soluci%C3%B3n_de_Laplace_en_el_disco_unidad.png&amp;diff=71200"/>
				<updated>2024-04-19T09:28:37Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Soluci%C3%B3n_de_Fourier_de_la_Ecuaci%C3%B3n_de_Laplace_en_el_disco_unidad.png&amp;diff=71199</id>
		<title>Archivo:Solución de Fourier de la Ecuación de Laplace en el disco unidad.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Soluci%C3%B3n_de_Fourier_de_la_Ecuaci%C3%B3n_de_Laplace_en_el_disco_unidad.png&amp;diff=71199"/>
				<updated>2024-04-19T09:28:06Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Error_conforme_nos_acercamos_a_la_frontera.png&amp;diff=71196</id>
		<title>Archivo:Error conforme nos acercamos a la frontera.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Error_conforme_nos_acercamos_a_la_frontera.png&amp;diff=71196"/>
				<updated>2024-04-19T09:25:44Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Error_Logar%C3%ADtmico_cerca_del_Borde_vs._Soluci%C3%B3n_de_Fourier.png&amp;diff=71194</id>
		<title>Archivo:Error Logarítmico cerca del Borde vs. Solución de Fourier.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Error_Logar%C3%ADtmico_cerca_del_Borde_vs._Soluci%C3%B3n_de_Fourier.png&amp;diff=71194"/>
				<updated>2024-04-19T09:23:25Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Cotas_Harnack_R%3D1,2,10.png&amp;diff=71193</id>
		<title>Archivo:Cotas Harnack R=1,2,10.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Cotas_Harnack_R%3D1,2,10.png&amp;diff=71193"/>
				<updated>2024-04-19T09:22:53Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Cotas_Harnack_n%3D2,3.png&amp;diff=71192</id>
		<title>Archivo:Cotas Harnack n=2,3.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Cotas_Harnack_n%3D2,3.png&amp;diff=71192"/>
				<updated>2024-04-19T09:22:39Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Cotas_Harnack_n%3D2,_R%3D1.png&amp;diff=71191</id>
		<title>Archivo:Cotas Harnack n=2, R=1.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Cotas_Harnack_n%3D2,_R%3D1.png&amp;diff=71191"/>
				<updated>2024-04-19T09:22:24Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor(Grupo_Eau_De_Parfum(EDP)))&amp;diff=70171</id>
		<title>Ecuación del calor(Grupo Eau De Parfum(EDP)))</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor(Grupo_Eau_De_Parfum(EDP)))&amp;diff=70171"/>
				<updated>2024-03-07T19:51:03Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Solución fundamental dimensión 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del Calor. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
==Introducción==&lt;br /&gt;
En este trabajo, exploramos el comportamiento térmico de una varilla metálica aislada lateralmente y sometida a condiciones de temperatura prescritas en sus extremos. Comenzamos planteando el sistema de ecuaciones diferenciales parciales que describe este fenómeno, considerando constantes de conducción térmica y calor específico unitarias para simplificar el análisis.&lt;br /&gt;
&lt;br /&gt;
Luego, investigamos la solución del estado estacionario y su interpretación, así como la obtención de la solución mediante el método de separación de variables. Posteriormente, representamos gráficamente la evolución temporal de la temperatura en la varilla, observando cómo varía en diferentes instantes de tiempo y analizando el flujo de calor entrante y saliente en ambos extremos.&lt;br /&gt;
&lt;br /&gt;
Exploramos también variaciones en el coeficiente de conductividad térmica y en las condiciones de contorno, investigando cómo estas modificaciones afectan la solución del problema. Finalmente, analizamos cómo cambia el comportamiento térmico de la varilla cuando se aísla uno de sus extremos y verificaremos el principio del máximo en el problema modificado. &lt;br /&gt;
&lt;br /&gt;
Por último hemos explorado la utilidad de la solución fundamental en la resolución del problema de Cauchy asociado a la ecuación del calor.&lt;br /&gt;
&lt;br /&gt;
==Conocimientos previos==&lt;br /&gt;
Antes de comenzar será de gran ayuda introducir una serie de conceptos que utilizaremos a lo largo este trabajo:&lt;br /&gt;
&lt;br /&gt;
*'''Ley del calor de Newton''': describe la tasa de pérdida o ganancia de calor de un objeto en relación con el ambiente circundante.La ley se expresa comúnmente como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d T(t)}{d t} = - k (T(t) - T_{\mathrm{a}}) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
siendo &amp;lt;math&amp;gt;T(t) &amp;lt;/math&amp;gt;la temperatura del objeto en un tiempo dado, &amp;lt;math&amp;gt;T_{\mathrm{a}}&amp;lt;/math&amp;gt; la temperatura ambiente y &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; la constante de proporcionalidad.&lt;br /&gt;
&lt;br /&gt;
*'''Principio de conservación de la energía calorífica''': establece que la variación de energía calorífica sobre un cuerpo V se debe al balance entre el calor que entra y sale del cuerpo más una producción externa.&lt;br /&gt;
&lt;br /&gt;
*'''Ley de Fourier''':intaura que el calor fluye desde regiones de alta temperatura a regiones de baja temperatura, y la cantidad de flujo de calor depende de la diferencia de temperatura y las propiedades del material.La expresión matemática de la Ley de Fourier es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{q}  = - k {\nabla} T &amp;lt;/math&amp;gt;,   &lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
donde &amp;lt;math&amp;gt; \mathbf{q}&amp;lt;/math&amp;gt; es el vector de flujo de calor por unidad de superficie y &amp;lt;math&amp;gt;  {\nabla} T &amp;lt;/math&amp;gt; es el gradiente del campo de temperatura en el interior del material.&lt;br /&gt;
*'''Coeficiente de conductividad térmica (D)''':cuantifica la capacidad de un material para conducir el calor. Se define como la cantidad de calor que pasa en un segundo a través de un metro cuadrado de material cuando la diferencia de temperatura a través del material,cuando la diferencia de temperatura a través del material es de un grado(ºC) es de un grado, y el espesor del material es de un metro.&lt;br /&gt;
*'''Principio del máximo''': Sea &amp;lt;math&amp;gt;u \in C^{2,1}(Q_T)\cap (\overline{Q_T})&amp;lt;/math&amp;gt; tal que  &amp;lt;math&amp;gt;u_t - \Delta u \leq 0&amp;lt;/math&amp;gt; en &amp;lt;math&amp;gt;Q_T&amp;lt;/math&amp;gt;. Entonces u alcanza su máximo en la frontera parabólica &amp;lt;math&amp;gt;\partial _p Q_T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\max_{\overline{Q_T}} u = \max_{\partial _p Q_T} u&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nuestro problema original ==&lt;br /&gt;
Habiendo ya introducido los conocimientos básicos, comenzaremos con nuestro problema.&lt;br /&gt;
Consideramos una varilla metálica de 1 metro de longitud , que se encuentra aislada por su superficie lateral, de manera que la conducción de calor únicamente se produce en la dirección longitudinal. La temperatura inicial de la varilla es de 0ºC. En el extremo izquierdo se consigue mantener la temperatura a 0 ºC mientras que en el derecho la temperatura es siempre de 1 ºC. Además  el calor específico toma un valor constante de 1.En cuanto al coeficiente de conductividad térmica,vamos a observar cómo sería nuestro problema para un valor cualquiera y seguidamente especificaremos el valor constante de 1.&lt;br /&gt;
&lt;br /&gt;
Pero antes de abordar matemáticamente nuestro problema, vamos a intentar deducir lo que podría ocurrir. Considerando que la temperatura en el extremo derecho de la varilla es superior a la del extremo izquierdo, el calor comenzará a transferirse desde la zona más cálida, elevando la temperatura a lo largo de la varilla y promoviendo el desplazamiento del calor hacia la región más fría. Simultáneamente, el incremento de la temperatura interna provoca una reducción del flujo de calor entrante y a un aumento del saliente con el tiempo. Anticipamos que, en algún momento, ambos flujos se equilibrarán, conduciendo la temperatura de la varilla a un estado estacionario.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por lo que nuestro problema a resolver queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - Du_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Debemos reescalar en tiempo, para facilitarnos los cálculos, por lo que realizamos el cambio de variable  &amp;lt;math&amp;gt;\tau = \alpha t, \tau \in\mathbb{R} &amp;lt;/math&amp;gt;. Por tanto,  &amp;lt;math&amp;gt; u(x,t)=U(x,\tau)&amp;lt;/math&amp;gt; y entonces &amp;lt;math&amp;gt; \alpha U_{\tau}-DU_{xx}=0&amp;lt;/math&amp;gt; .Tomando &amp;lt;math&amp;gt; \alpha = D&amp;lt;/math&amp;gt; , obtenemos el problema &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;U_{\tau} - U_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(0, \tau) = 0, &amp;amp; \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(1, \tau) = 1, &amp;amp; \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Este problema se resuelve mediante el método de variación de las constantes, pero un factor clave para su implementación es que las condiciones de contorno estén homogeneizadas, es decir, que sean igual a cero. Esto se conseguirá mediante un cambio de variable en el que es imprescindible la llamada solución estacionaria.&lt;br /&gt;
La solución estacionaria de nuestro problema es aquella que no varía con el tiempo &amp;lt;math&amp;gt; v=\lim_{t \to \infty} U(x,\tau)&amp;lt;/math&amp;gt; y por tanto, su derivada  respecto al tiempo es nula. Nuestro sistema queda ahora:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;-v_{xx}   = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, \\&lt;br /&gt;
&amp;amp;v(0)= 0 \\&lt;br /&gt;
&amp;amp;v(1) = 1, &lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Resolviendo obtenemos que &amp;lt;math&amp;gt; v(x)=x &amp;lt;/math&amp;gt; es nuestra solución estacionaria, cuya expresión gráfica es:&lt;br /&gt;
[[Archivo:sofiaest1.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import numpy as np&lt;br /&gt;
# Define el rango de x entre 0 y 1&lt;br /&gt;
x = np.linspace(0, 1, 100)  &lt;br /&gt;
# Define la función  estacionaria v(x) = x&lt;br /&gt;
v_x = x&lt;br /&gt;
# Crea la gráfica&lt;br /&gt;
plt.plot(x, v_x)&lt;br /&gt;
# Etiquetas de los ejes&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('v(x)')&lt;br /&gt;
# Título de la gráfica&lt;br /&gt;
plt.title('Gráfica de la solución estacionaria v(x)=x')&lt;br /&gt;
# Muestra la gráfica&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Una vez hallada, podemos homogeneizar nuestro problema mediante el cambio de variable &amp;lt;math&amp;gt;w(x,t)= U(x,\tau)-v(x)&amp;lt;/math&amp;gt;.Por tanto, sustituyendo en el sistema inicial :&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;w_{\tau} - w_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(0, \tau) = 0, &amp;amp; \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(1, \tau) = 1-1=0, &amp;amp; \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(x, 0) = 0-x=-x, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Nuestro sistema es ya homogéneo,por lo que aplicamos el método de separación de variables (que consiste en expresar la solución como el producto de una función que depende únicamente de la variable espacial x y una función dependiente de la variable temporal) y obtenemos como solución homogénea:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;w(x,\tau) =  \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 \tau}\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Y deshaciendo los dos cambios de variable realizados, nuestra solución al problema original es por tanto:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 Dt }\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Como en nuestro caso, el coeficiente de conductividad térmica es igual a 1, nuestro sistema es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
y nuestra solución:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 t }\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Mostramos gráficamente la solución, observando que se cumplen las condiciones de frontera y además según avanza el tiempo, la solución deja de depender de este, alcanzando un estado estacionario, determinado justamente por la solución estacionaria obtenida anteriormente, &amp;lt;math&amp;gt; v(x)=x &amp;lt;/math&amp;gt;. Cabe destacar que en &amp;lt;math&amp;gt; t=0 &amp;lt;/math&amp;gt;  obtenemos las oscilaciones correspondientes a la serie de Fourier de la condición inicial, que se aproxima mediante senos.&lt;br /&gt;
[[Archivo:SOFIASOL11.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
# Solución usando los primeros N términos de la serie&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculasmos los coeficientes C_k&lt;br /&gt;
        C_k = 2 * (-1)**(k) / (k * np.pi)  &lt;br /&gt;
        sum += C_k * np.sin(k*np.pi * x) * np.exp(-lambda_k * t*D) &lt;br /&gt;
    return x+sum&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
&lt;br /&gt;
# Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12,8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x (m)')&lt;br /&gt;
ax.set_ylabel('Tiempo t (s)')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) (ºC)')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Flujo===&lt;br /&gt;
Para estudiar el flujo de calor saliente y entrante en ambos extremos de la varilla a lo largo del tiempo, nos debemos basar en la ley de Fourier &amp;lt;math&amp;gt; \mathbf{q}  = - k  u_x(x,t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Por lo que necesitamos obtener la derivada de la solución con respecto al espacio:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(x,t)= 1+\sum_{k=1}^{\infty}(-1)^{k+1}2 e^{-k^2\pi ^2 t }\cos(k\pi  x) &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Ahora, el flujo en los extremos es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(0,t)=1 +\sum_{k=1}^{\infty}(-1)^{k+1}2 e^{-k^2\pi ^2 t } &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(1,t)=1-\sum_{k=1}^{\infty}2 e^{-k^2\pi ^2 t } &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Gráficamente,&lt;br /&gt;
[[Archivo:SOFIAFLUJO1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
# Derivada de nuestra solución respecto al espacio, multiplicado por -k&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculamos los coeficientes C_k mediante extensión impar&lt;br /&gt;
        C_k = 2 * (-1)**(k+1)  &lt;br /&gt;
        sum += C_k * np.cos(k*np.pi * x) * np.exp(-lambda_k * t) &lt;br /&gt;
    return 1+sum&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(t, u(0,t,N), label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t, u(1,t,N), label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Al comenzar con un flujo de calor nulo en el extremo izquierdo, esto  indica que hay una gran diferencia de temperatura entre ambos extremos de la varilla. El extremo izquierdo está perdiendo calor rápidamente hacia la zona más fría. A medida que el calor se va transfiriendo por la varilla, el gradiente de la temperatura cambia y el extremo derecho comienza a calentarse, debido al flujo de calor que proviene del otro extremo. Este cambio conduce a que el flujo en ambos extremos comience a estar en equilibrio. &lt;br /&gt;
Esta estabilización de flujo en -1 refleja que se ha alcanzado un estado estacionario en el sistema, indicando que cualquier calor entrante en la varilla, se compensa con el calor saliente, manteniendo una distribución de temperatura uniforme.&lt;br /&gt;
&lt;br /&gt;
Este comportamiento refleja la Ley de Fourier, donde al principio la gran diferencia de temperatura induce un flujo de calor bastante significativo, que se va estabilizando llegando a un flujo de -1 en ambos extremos, alcanzando así un gradiente de temperatura constante, con la misma cantidad de calor saliendo hacia fuera desde ambos extremos.&lt;br /&gt;
&lt;br /&gt;
==Cambio de coeficiente de conductividad térmica ==&lt;br /&gt;
Hemos estudiado el problema de Cauchy para un coeficiente de difusión de 1,veamos que ocurre si lo disminuimos a su mitad, es decir,&amp;lt;math&amp;gt;D=\frac{1}{2}&amp;lt;/math&amp;gt;.Nuestro nuevo problema por tanto es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - \frac{1}{2}u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuya solución es &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {\frac{-k^2\pi ^2 t}{2}}\sin(k\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gráficamente, únicamente hemos cambiado el valor de D en el código (2)  y obtenemos:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:SOFIASOL22.png|400px|thumb|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1/2       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
# Solución usando los primeros N términos de la serie&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculasmos los coeficientes C_k&lt;br /&gt;
        C_k = 2 * (-1)**(k) / (k * np.pi)  &lt;br /&gt;
        sum += C_k * np.sin(k*np.pi * x) * np.exp(-lambda_k * t*D) &lt;br /&gt;
    return x+sum&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
# Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12,8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
ax.set_xlabel('Posición x (m)')&lt;br /&gt;
ax.set_ylabel('Tiempo t (s)')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) (ºC)')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
No se puede apreciar ninguna diferencia aparente entre las soluciones para los diferentes coeficientes. Para observar algún cambio vamos a dibujar la diferencia entre la solución y el estado estacionario en &amp;lt;math&amp;gt; x = 1/2&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt; t \in [0, 1]&amp;lt;/math&amp;gt;, es decir &amp;lt;math&amp;gt;u(1/2, t) − v(1/2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
[[Archivo:SOFIACCT1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
x=0.5&lt;br /&gt;
# Definir la función de temperatura con un número limitado de términos en la serie&lt;br /&gt;
def u(x, t, alpha, n_terms=10):   &lt;br /&gt;
    sum_series = sum(2 * (-1)**(k + 1) / (k * np.pi) * np.sin(k * np.pi * x) * np.exp(-k**2 * np.pi**2 * alpha * t) for k in range(1, n_terms + 1))&lt;br /&gt;
    return  x - sum_series&lt;br /&gt;
# Intervalo de tiempo&lt;br /&gt;
t = np.linspace(0, 1, 100)&lt;br /&gt;
# Calcular la temperatura en x=1/2 para diferentes alphas&lt;br /&gt;
u_k1 = u(0.5, t, alpha=1)-x  # D=1, correspondiente a alpha=1&lt;br /&gt;
u_k_half = u(0.5, t, alpha=0.5)-x  # D=1/2, correspondiente a alpha=0.5&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.plot(t, u_k1, label='k=1', color='blue')&lt;br /&gt;
plt.plot(t, u_k_half, label='k=1/2', color='red')&lt;br /&gt;
plt.xlabel('Tiempo (s)')&lt;br /&gt;
plt.ylabel('u(1/2, t) − v(1/2)')&lt;br /&gt;
plt.title('Efecto del Coeficiente de Conductividad Térmica ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El coeficiente de conductividad térmica juega un papel fundamental en determinar la velocidad a la que se propaga la temperatura dentro de un material. Al disminuir este coeficiente a la mitad, el proceso de conducción térmica a través de la varilla experimenta una notable ralentización. Esto se traduce en que, en cualquier instante dado t, la distribución de la temperatura a lo largo de la varilla VA avanzando a la mitad de velocidad en comparación con un escenario donde el coeficiente de conductividad térmica es de 1. Dicho cambio incide directamente en la rapidez con que se logra el equilibrio térmico en la varilla, Resultando en una difusión térmica más lenta hacia el equilibrio.&lt;br /&gt;
&lt;br /&gt;
== Cambio de condiciones ==&lt;br /&gt;
Supongamos ahora una barra unidimensional con extremos fijos a una temperatura de &amp;lt;math&amp;gt;0^\circ C&amp;lt;/math&amp;gt;. La temperatura inicial en cualquier punto de la barra está dada por la función &amp;lt;math&amp;gt;u(x,0) = max\{0, 1−4|x−1/2|\}&amp;lt;/math&amp;gt;, lo que significa que inicialmente la temperatura en la barra varía de acuerdo con esta función.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = max\{0, 1−4|x−1/2|\}, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Supongamos que, en tiempo infinito, \( t \rightarrow \infty \), se llega a una solución estacionaria y que, por tanto, ya no varía en tiempo. De modo, que tomando esta suposición llegamos al siguiente sistema con \( u(x,t) \xrightarrow{\text{t tiende a }\infty} v(x) \).&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;v_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,   \\&lt;br /&gt;
&amp;amp;v(0) = 0, &amp;amp; \\&lt;br /&gt;
&amp;amp;v(1) = 0, &amp;amp;  &lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuya solución es la constante \( v(x)=0 \). De modo que el sistema homogeneizado, coincide con el original, pues \( w(x,t)=u(x,t)-v(x) =u(x,t)-0=u(x,t)\) &lt;br /&gt;
Antes de exigir la condición inicial, la solución coincide con la del primer apartado, pues nos encontramos ante la misma ecuación diferencial, salvo por la función \( u(x,0)\), la cual no toma parte hasta el final de la resolución de esta suponiendo separación de variables. De modo que&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t) = \sum_{k=1}^{\infty} C_k  e^{(-k^2\pi ^2 t )}\sin(k \pi  x)&amp;lt;/math&amp;gt; &lt;br /&gt;
Para hallar el valor de los coeficientes &amp;lt;math&amp;gt; C_k&amp;lt;/math&amp;gt;, buscamos la serie de Fourier de la función &amp;lt;math&amp;gt; max\{0, 1−4|x−1/2|\}&amp;lt;/math&amp;gt; extendida de forma impar. Esto es posible, ya que&lt;br /&gt;
:&amp;lt;math&amp;gt; \int^1_0 (max\{0, 1−4|x−1/2|\})^2 dx=0.1667 &amp;lt; \infty&amp;lt;/math&amp;gt;  &lt;br /&gt;
El cálculo de los coeficientes se ha realizado numéricamente aproximando por la fórmula del trapecio. Los coeficientes se pueden consultar ejecutando el siguiente código en Python&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np &lt;br /&gt;
def f(x):   # Defino función que se quiere aproximar&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x):&lt;br /&gt;
    coefficients = np.zeros(n) # Guardo los coeficientes en una lista&lt;br /&gt;
    for k in range(1,n+1):     # Compiezo en k=1, pues sin(0)=0&lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients&lt;br /&gt;
&lt;br /&gt;
fourier_coefficients(f, 10, np.linspace(0, 1, 1000))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
De modo que ya se ha calculado la solución de este nuevo problema. Visualmente, responde a la siguiente gráfica, resultado de ejecutar este código:&lt;br /&gt;
[[Archivo:Solucion_Celia.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)    # Generar una cuadrícula de puntos&lt;br /&gt;
&lt;br /&gt;
def f(x):    # Defino mi función condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x): # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    coefficients = np.zeros(n)&lt;br /&gt;
    for k in range(1,n+1):         # Comenzamos en 1, pues sen(0)=0&lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients.tolist()   # Convertir a lista&lt;br /&gt;
coef=fourier_coefficients(f, N, x)&lt;br /&gt;
&lt;br /&gt;
def u(x, t, n): # Definir la solución en términos de la serie de Fourier con N términos&lt;br /&gt;
    sum = 0                 # Almacenamos la suma (resultado) hasta el término 10&lt;br /&gt;
    for k in range(1, n+1): # Para cada k calculo el lambda y sumo su coeficiente respectivo&lt;br /&gt;
        lambda_k = k* np.pi&lt;br /&gt;
        sum += coef[k-1] * np.sin(lambda_k * x) * np.exp(-lambda_k**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
Z = u(X, T, N) # Calcular los valores de la función para cada par (x, t)&lt;br /&gt;
&lt;br /&gt;
# Graficar la función en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))  # Cambio aquí para hacer la figura más grande&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z,cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x [m]')&lt;br /&gt;
ax.set_ylabel('Tiempo t [s]')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) [ºC]')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)  #Añado una guía de colores&lt;br /&gt;
surf.set_clim(0, 1)                       # Le introduzco cota inf/sup a los colores&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
​[[Archivo:gifcelia.gif|400px|right|]]&lt;br /&gt;
Vemos como la temperatura sufre una gran variación en tiempos cercanos a 0, y rápidamente tiende a su estado estacionario, &amp;lt;math&amp;gt;v(x)=0&amp;lt;/math&amp;gt;. Para poder visualizarlo mejor mostraremos una un gif donde la imagen cambia a medida que el tiempo pasa, restringido a &amp;lt;math&amp;gt;t \in [0,0.3]&amp;lt;/math&amp;gt;, pues a partir de ahí, la temperatura está suficientemente cerca de la estacionaria y, por tanto, no hay gran variación en la temperatura.&lt;br /&gt;
&lt;br /&gt;
En un inicio, en \(t=0\) la temperatura toma valores negativos. Esto debido a que la exponencial se anula y son los coeficientes de Fourier quienes exigen el signo de la función. Una vez que &amp;lt;math&amp;gt;t&amp;gt;0&amp;lt;/math&amp;gt;, u se hace positivo en todas partes, lo que significa que la temperatura se difunde casi instantáneamente a lo largo del eje x, resultando en una velocidad de propagación infinita. Es decir, cualquier perturbación se siente enseguida en toda parte del dominio.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Terminamos el estudio de esta ecuación de difusión con el estudio del flujo, la inversa de la variación de la variable x de la solución. Para ello derivamos la solución que hemos obtenido. En términos de &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;, puesto que no son dependientes de x, obtenemos:&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{\partial}{\partial x}u(x,t)=\sum_{k=1}^{\infty} C_k  e^{(-k^2\pi ^2 t )}\cos(k \pi  x)\frac{1}{k \pi}&amp;lt;/math&amp;gt; como flujo de la ecuación homogénea. Adjuntamos el código con el cual se ha calculado la expresión de forma numérica y su respectiva representación gráfica:&lt;br /&gt;
[[Archivo:Flujo_Celia.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino la función de la ci para hallar los coef&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x): # Hallo los coef de Fourier  &lt;br /&gt;
    coefficients = np.zeros(n)&lt;br /&gt;
    for k in range(1,n+1): &lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients.tolist()   # Convertir a lista&lt;br /&gt;
coef=fourier_coefficients(f, N, x)&lt;br /&gt;
&lt;br /&gt;
def u(x, t, n):  # Definir la derivada en términos de la serie de Fourier con N términos&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, n+1):&lt;br /&gt;
        lambda_k = k* np.pi&lt;br /&gt;
        sum += coef[k-1] *np.cos(k * np.pi * x)/(k * np.pi) * np.exp(-lambda_k**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
# Graficamos&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(t, u(0,t,N), label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t, u(1,t,N), label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Observamos dos casos parecidos: Uno desciende hasta alcanzar el 0 (rojo) y otro asciende (azul). El primer caso, un flujo positivo que disminuye a cero, significa que el calor está siendo transferido a lo largo de la varilla en una dirección específica, pero la velocidad de transferencia de calor disminuye gradualmente hasta que alcanza cero, lo que indica un equilibrio térmico en la varilla. En el segundo caso, el flujo de calor comienza siendo negativo y alcanza cero, esto implicaría que al principio está ocurriendo una pérdida de calor en la dirección específica a lo largo de la varilla, pero esta pérdida disminuye hasta que se detiene completamente.&lt;br /&gt;
&lt;br /&gt;
==Varilla con extremo aislado==&lt;br /&gt;
En este estudio modelamos la difusión del calor en un alambre. Inicialmente, consideramos un alambre con una temperatura inicial de \( 0^\circ C \) en su extremo izquierdo. En contraste, el extremo derecho del alambre está aislado térmicamente, lo que significa que no hay transferencia de calor a través de este. En nuestro análisis, introducimos una fuente de calor en el centro del alambre en el instante inicial. Luego, examinamos cómo se propaga y se distribuye esta fuente de calor a lo largo del alambre con el tiempo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u_x(1, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = max\{0, 1−4|x−1/2|\}, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que la barra se encuentra aislada térmicamente en su extremo en \( x = 1 \) implica que no hay flujo de calor a través de este extremo. La ley de Fick, establece que el flujo de calor es proporcional al gradiente de temperatura según la ecuación \( q = -k \frac{du}{dx} \), donde \( q \) es el flujo de calor, \( k \) es la conductividad térmica y \( \frac{du}{dx} \) es el gradiente de temperatura a lo largo de la barra. En este contexto, si el flujo en dicho extremo es nulo, el gradiente de temperatura es nulo, por tanto  \( u_x(1, t) = 0 \). Observamos además que la solución estacionaria en nuestro caso es \( v(x) = 0 \), pues es la solución del problema de contorno.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
v''(x) = 0, \quad v(0) = 0, \quad v'(1) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De forma análoga a como ocurría en el apartado anterior, el problema que estamos estudiando en este caso es homogéneo. Por tanto, sin necesidad de hacer ningún cambio, procedemos a resolverlo mediante el método de separación de variables. Suponiendo que \( u(x, t) = X(x) \cdot T(t) \). Obtenemos como solución \( X(x) = A \sin(\pi(1/2+k)x) \) y \( T(t) = B e^{-(\pi^2)(1/2+k)^2 t} \). De modo que, la solución sin tener en cuenta la condición inicial es:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u_k(x, t) = c_k \cdot \sin(\pi(1/2+k)x) \cdot e^{-(\pi^2)(1/2+k)^2 t}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Para asegurar la existencia de solución del problema, es necesario verificar si existen ciertos coeficientes \( c_k \) tal que la solución pueda ser definida como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, t) = \sum_{k=0}^{\infty} c_k \cdot \sin(\pi(1/2+k)x) \cdot e^{-(\pi^2)(1/2+k)^2 t}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Para ello, es necesario verificar que las autofunciones \( \{\sin(\pi(1/2+k)x)\}_{k=0}^{\infty} \) forman un conjunto completo en \( L^2 [0, 1]\)  y ortogonal.&lt;br /&gt;
 &lt;br /&gt;
Para comprobar la ortogonalidad entre las autofunciones, calculamos la integral de su producto, o lo que es igual a calcular el producto escalar de \( L^2 [0,1]\), para dos funciones distintas \( \sin(\pi(1/2+k)x) \) y \( \sin(\pi(1/2+m)x) \) con \( k \neq m \in \mathbb{N}\):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{1} \sin(\pi(1/2+k)x) \sin(\pi(1/2+m)x) \, dx = \frac{\sin((k - m) \pi)}{2 (k - m) \pi} - \frac{\sin((1 + k + m) \pi)}{2 (1 + k + m) \pi}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Esta integral se anula para \( k,m \in  \mathbb{N} \), lo que demuestra que las autofunciones son ortogonales entre sí en el intervalo \([0, 1]\).&lt;br /&gt;
Por otro lado, dado que demostrar que las funciones forman una base completa para el espacio \( L^2[0,1] \) puede ser un proceso complejo y requiere un análisis detallado, en este trabajo supondremos que la forman.&lt;br /&gt;
[[Archivo:Solucion_Pablo.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)    # Generar una cuadrícula de puntos&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino mi fucnión condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficient(f, k, x):  # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    ck = 2* np.trapz(f(x) * np.sin(np.pi*(1/2+k)*x) ,x)&lt;br /&gt;
    return ck&lt;br /&gt;
&lt;br /&gt;
# Definir la solución en términos de la serie de Fourier con N términos&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0                 # Almacenamos la suma hasta el término 10&lt;br /&gt;
    for k in range(0, N+1): # Para cada k cálculo su coeficiente y lo sumo al resultado&lt;br /&gt;
        ck = fourier_coefficient(f, k, x)&lt;br /&gt;
        sum += ck * np.sin(np.pi*(1/2+k)*x) * np.exp(-(np.pi**2)*(1/2+k)**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Z = u(X, T, N)  # Calcular los valores de la función para cada par (x, t)&lt;br /&gt;
&lt;br /&gt;
# Graficar la función en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z,cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x [m]')&lt;br /&gt;
ax.set_ylabel('Tiempo t [s]')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) [ºC]')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)  #Añado una guía de colores&lt;br /&gt;
surf.set_clim(0, 1)                       # Le introduzco cota inf/sup a los colores&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gracias a los desarrollos en serie de Fourier, podemos calcular los coeficientes \( c_k \) para cumplir así la condición inicial. Dichos coeficientes se calculan mediante la integral:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_k := \frac{\int_{0}^{1} \max\{0, 1 - 4(x - 1/2)\} \sin(\pi(1/2+k)x) \, dx}{\int_{0}^{1} \sin^2(\pi(1/2+k)x) \, dx}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Dado que la integral es difícil de calcular analíticamente y en consecuencia es difícil obtener una expresión dependiente del parámetro &amp;lt;math&amp;gt; k&amp;lt;/math&amp;gt;, la resolveremos de forma numérica mediante el método del trapecio, de forma análoga a como se hizo en el modelo sin aislante térmico previo.&lt;br /&gt;
Para una comprensión más completa de la evolución de la temperatura del alambre en cuestión, es importante realizar un análisis visual de la solución propuesta. La representación gráfica de la solución en el intervalo de tiempo \( t \in [0, 1] \), considerando los primeros 10 términos de la serie de Fourier, ofrece una visualización tridimensional de la distribución del calor a lo largo del alambre en función del tiempo.&lt;br /&gt;
 &lt;br /&gt;
Es relevante destacar que a medida que transcurre el tiempo, la solución converge gradualmente hacia su estado estacionario, es decir, \(  v(x)=0 \) . Además, observamos que se verifica el principio del máximo, dado que tanto la temperatura máxima y mínima se alcanza en la frontera parabólica.&lt;br /&gt;
Esta última afirmación la podemos verificar de forma sencilla, obteniendo ambos valores de la función. El código utilizado mostró los siguientes datos.&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# Calcular la temperatura máxima y mínima&lt;br /&gt;
max_temperature = np.max(Z)&lt;br /&gt;
min_temperature = np.min(Z)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Temperatura máxima:&amp;quot;, max_temperature)&lt;br /&gt;
print(&amp;quot;Temperatura mínima:&amp;quot;, min_temperature)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Encontrar las coordenadas donde se alcanza la temperatura máxima y mínima&lt;br /&gt;
max_index = np.unravel_index(np.argmax(Z), Z.shape)&lt;br /&gt;
min_index = np.unravel_index(np.argmin(Z), Z.shape)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
max_x, max_t = x_values[max_index[1]], t_values[max_index[0]]&lt;br /&gt;
min_x, min_t = x_values[min_index[1]], t_values[min_index[0]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Coordenadas de la temperatura máxima: (x={}, t={})&amp;quot;.format(max_x, max_t))&lt;br /&gt;
print(&amp;quot;Coordenadas de la temperatura mínima: (x={}, t={})&amp;quot;.format(min_x, min_t))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Resultados de temperatura máxima y mínima&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parámetro!! Valor&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura máxima|| \(0.92 ^\circ \text{C}\)&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura mínima|| \(-0.03 ^\circ \text{C}\)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Coordenadas de temperatura máxima y mínima&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Coordenadas !! Valor&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura máxima|| \((x=0.50, t=0.00)\)&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura mínima|| \((x=0.81, t=0.00)\)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Observamos que el máximo debería ser de &amp;lt;math&amp;gt; 1^\circ \text{C} &amp;lt;/math&amp;gt;. No obstante, el resultado reportado por el código es &amp;lt;math&amp;gt; 0.92 ^\circ \text{C} &amp;lt;/math&amp;gt;. Esto se debe al uso de la aproximación por series de Fourier. Lo mismo ocurre con el valor mínimo que debería se de &amp;lt;math&amp;gt; 0^\circ \text{C} &amp;lt;/math&amp;gt;, no obstante el código reporta &amp;lt;math&amp;gt;-0.03^\circ \text{C} &amp;lt;/math&amp;gt;. Además dichos puntos están en la frontera parabólica, como afirma el principio del máximo. &lt;br /&gt;
&lt;br /&gt;
En este punto es interesante verificar si nuestro modelo es correcto. En tal caso, el extremo izquierdo de la barra no debería perder calor. Por lo tanto, calculamos la derivada de nuestra expresión y, gracias a la Ley de Fick, sabemos que el flujo de calor es igual a la derivada cambiada de signo. Obtenemos los siguientes resultados:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Flujo_Pablo.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 100     # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x_values = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t_values = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino mi función condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficient(f, k, x):   # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    ck = 2* np.trapz(f(x) * np.sin(np.pi*(1/2+k)*x) ,x)&lt;br /&gt;
    return ck&lt;br /&gt;
&lt;br /&gt;
def derivative_solution_x(x, t, N): # Definir la derivada de la solución respecto a x&lt;br /&gt;
    result = 0&lt;br /&gt;
    for k in range(0, N+1):&lt;br /&gt;
        ck = fourier_coefficient(f, k, x_values)&lt;br /&gt;
        result += ck * np.pi * (1/2 + k) * np.cos(np.pi * (1/2 + k) * x) * np.exp(-1 * (np.pi**2) * (1/2 + k)**2 * t)&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
# Calcular la derivada de la solución respecto a x para los extremos x=0 y x=1 a lo largo del tiempo&lt;br /&gt;
flux_x0 = [-derivative_solution_x(0, t, N) for t in t_values]&lt;br /&gt;
flux_x1 = [-derivative_solution_x(1, t, N) for t in t_values]&lt;br /&gt;
&lt;br /&gt;
# Graficar el flujo en los extremos x=0 y x=1 a lo largo del tiempo&lt;br /&gt;
plt.figure(figsize=(8, 5))&lt;br /&gt;
plt.plot(t_values, flux_x0, label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t_values, flux_x1, label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Observamos que todo el calor aportado en el instante inicial se disipa completamente por la izquierda de la varilla, ya que el flujo en &amp;lt;math&amp;gt; x=1&amp;lt;/math&amp;gt; es nulo, verificando así las condiciones fronteras de nuestro problema.&lt;br /&gt;
&lt;br /&gt;
==Solución fundamental==&lt;br /&gt;
La solución fundamental de la ecuación del calor es una función que describe la distribución de temperatura en un medio en función del tiempo y la posición. Para la ecuación del calor unidimensional, la solución fundamental está dada por la expresión:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\phi(x, t) = \frac{1}{2 \sqrt{\pi t}} \exp\left(-\frac{x^2}{t}\right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Además la solución general del problema de Cauchy es la solución fundamental (sin tener en cuenta la condición inicial).&lt;br /&gt;
El problema de Cauchy es el siguiente.&lt;br /&gt;
Dada la ecuación diferencial parcial:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u_t = k \cdot u_{xx},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
junto con la siguiente condición inicial:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, 0) = f(x)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
donde \( f(x) \) es una función dada en el dominio \( 0 \leq x \leq L \) y \( k \) es una constante positiva que representa la difusividad térmica del medio.&lt;br /&gt;
&lt;br /&gt;
Para resolver el problema de Cauchy, podemos utilizar la solución fundamental \( \phi(x, t) \) en combinación con la función inicial \( f(x) \) para obtener la solución general \( u(x, t) \) en cualquier instante de tiempo \( t \). Esto se logra convolucionando la función inicial \( f(x) \) con la solución fundamental \( \phi(x, t) \) .&lt;br /&gt;
La solución \( u(x, t) \) del problema de Cauchy se puede expresar como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, t) = \int_{-\infty}^{\infty} \phi(x - y, t) f(y) \, dy&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
En primer lugar, procederemos a visualizar una representación tridimensional de la solución fundamental  \( \phi(x, t) \).&lt;br /&gt;
[[Archivo:Solfundi.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Definir la función que representa la solución fundamental de la ecuación del calor&lt;br /&gt;
def phi(x, t):&lt;br /&gt;
    return 1 / (2 * np.sqrt(np.pi * t)) * np.exp(-x**2 / t)&lt;br /&gt;
&lt;br /&gt;
# Definir los valores de x y t para la gráfica&lt;br /&gt;
x_values = np.linspace(-1, 1, 100)    # Valores de x&lt;br /&gt;
t_values = np.linspace(0.01, 1, 200)  # Valores de t (tiempo)&lt;br /&gt;
&lt;br /&gt;
# Crear una malla de valores de x y t&lt;br /&gt;
X, T = np.meshgrid(x_values, t_values)&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución fundamental para cada par de valores (x, t)&lt;br /&gt;
Z = phi(X, T)&lt;br /&gt;
&lt;br /&gt;
# Crear una figura en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
# Graficar la superficie 3D&lt;br /&gt;
surf = ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
# Etiquetas y título con el símbolo de &amp;quot;phi&amp;quot;&lt;br /&gt;
ax.set_xlabel(r'$x$')&lt;br /&gt;
ax.set_ylabel(r'$t$')&lt;br /&gt;
ax.set_zlabel(r'$\phi(x, t)$')&lt;br /&gt;
ax.set_title(r'Solución fundamental de la ecuación del calor: $\phi(x, t)$')&lt;br /&gt;
&lt;br /&gt;
# Añadir una barra de colores para indicar los valores de Z&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=8)&lt;br /&gt;
plt.show()    # Mostrar la gráfica&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
En esta ocasión veremos la solución de la ecuación del calor \( u_t - u_{xx} = 0 \) en \( x \in \mathbb{R} \) asociada al dato inicial \( f(x) = 1_{[-1,1]} \), viene dada por la convolución:&lt;br /&gt;
 &lt;br /&gt;
:&amp;lt;math&amp;gt; u(x, t) = \int_{-\infty}^{\infty} \phi(x - y, t) f(y) \, dy = \int_{-\infty}^{\infty} \frac{1}{2 \sqrt{\pi t}} \exp\left(-\frac{(x-y)^2}{t}\right) 1_{[-1,1]} \, dy &amp;lt;/math&amp;gt;&lt;br /&gt;
Dibujaremos la solución en diferentes instantes de tiempo: \( t = 0.001 \), \( t = 0.01 \) , \( t = 0.1 \), \( t = 1 \).  Aproximaremos la integral indefinida utilizando la fórmula del trapecio.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:solsolsol.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Definir la solución fundamental&lt;br /&gt;
def phi(x, t):&lt;br /&gt;
    return 1 / np.sqrt(4 * np.pi * t) * np.exp(-x**2 / (4 * t))&lt;br /&gt;
&lt;br /&gt;
def u0(x):&lt;br /&gt;
    return np.where(np.logical_and(x &amp;gt;= -1, x &amp;lt;= 1), 1, 0)&lt;br /&gt;
&lt;br /&gt;
# Definir el intervalo espacial y los instantes de tiempo&lt;br /&gt;
x = np.linspace(-5, 5, 1000)  # Valores de x&lt;br /&gt;
t_values = [0.001, 0.01, 0.1, 1]  # Valores de t (instantes de tiempo)&lt;br /&gt;
&lt;br /&gt;
# Crear una nueva figura para la gráfica&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
# Calcular y graficar la solución para diferentes instantes de tiempo&lt;br /&gt;
for t in t_values:&lt;br /&gt;
    u_x_t = []&lt;br /&gt;
    for xi in x:&lt;br /&gt;
        # Utilizar np.trapz para calcular la solución integral de la ecuación del calor&lt;br /&gt;
        u_x_t.append(np.trapz(phi(xi - x, t)*u0(x), x))&lt;br /&gt;
    plt.plot(x, u_x_t, label=f't = {t}')&lt;br /&gt;
&lt;br /&gt;
# Etiquetas y título de la gráfica&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('u(x, t)')&lt;br /&gt;
plt.title(f'Solución de $u_t - uxx = 0$ en diferentes instantes de tiempo')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Por último, la metodología para calcular la solución fundamental de la ecuación del calor es flexible cuando se trata de incorporar condiciones de contorno. Supongamos que deseamos calcular una solución para la ecuación del calor en una dimensión en el semiespacio donde \( x &amp;gt; 0 \), satisfaciendo las condiciones \( u(0, t) = 1 \), \( u(x, t) \rightarrow 0 \) cuando \( x \rightarrow \infty \) y \( u(x, 0) = 0 \) para \( x &amp;gt; 0 \). Podemos modificar la solución fundamental de manera que satisfaga estas condiciones. Al hacerlo, obtenemos la expresión \( u(x,t) = -\text{erf}\left(\frac{x}{2 \cdot \sqrt{t}}\right) + 1 \), donde \( \text{erf}(x) = \frac{2}{\sqrt{\pi}} \int_{0}^{x} e^{-z^2} \, dz \). Esta expresión ajustada permite obtener la solución deseada que cumple con las condiciones de contorno especificadas.&lt;br /&gt;
[[Archivo:Ultimaaa.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# Importar las bibliotecas necesarias&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
from scipy.special import erf  # Importar la función de error gaussiano&lt;br /&gt;
&lt;br /&gt;
# Definir la función u(x, t)&lt;br /&gt;
def u(x, t):&lt;br /&gt;
    return -1 * erf(x / (2 * np.sqrt(t))) + 1&lt;br /&gt;
&lt;br /&gt;
# Definir los valores de x y t para la gráfica&lt;br /&gt;
x_values = np.linspace(0, 5, 500)  # Valores de x&lt;br /&gt;
t_values = np.linspace(0.01, 5, 500)  # Valores de t (tiempo)&lt;br /&gt;
&lt;br /&gt;
# Crear una malla de valores de x y t&lt;br /&gt;
X, T = np.meshgrid(x_values, t_values)&lt;br /&gt;
&lt;br /&gt;
# Calcular los valores de u(x, t) para cada par de valores (x, t)&lt;br /&gt;
Z = u(X, T)&lt;br /&gt;
&lt;br /&gt;
# Crear una figura en 3D&lt;br /&gt;
fig = plt.figure(figsize=(10, 6))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf = ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('t')&lt;br /&gt;
ax.set_zlabel('u(x, t)')&lt;br /&gt;
ax.set_title('Función u(x, t)')&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Solución fundamental dimensión 2===&lt;br /&gt;
&lt;br /&gt;
Veamos el problema de Cauchy para la ecuación del calor en dos dimensiones (\( x_1, x_2 \) y \( t \)). Sea \( u(x_1, x_2, t) \) la función de temperatura en un medio bidimensional, que satisface la ecuación del calor:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u_t = k(u_{x_1 x_1} + u_{x_2 x_2})&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Con las condiciones iniciales dadas por la temperatura inicial \( u(x_1, x_2, 0) = f(x_1, x_2) \) para algún campo de temperatura dado \( f(x_1, x_2)  \text{para} (x_1, x_2) \in \partial \Omega \), donde \( \Omega \) es el dominio bidimensional sobre el cual se define la temperatura.&lt;br /&gt;
La solución general a este problema (sin contar la condición inicial) viene dada por la siguiente expresión: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\phi(x_1, x_2, t) = \frac{1}{4 \pi t} \exp\left( -\frac{x_1^2 + x_2^2}{4t} \right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Procederemos ahora a representar la solución fundamental, donde veremos un gráfico tridimensional, &amp;lt;math&amp;gt; x_1, x_2, \phi(x_1, x_2, t) &amp;lt;/math&amp;gt; donde se ha fijado un tiempo t.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:gifgif.gif|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Definir la solución fundamental en 2D&lt;br /&gt;
def phi_2D(x1, x2, t):&lt;br /&gt;
    if t == 0:&lt;br /&gt;
        return np.zeros_like(x1)  # Devuelve una matriz de ceros si t es cero&lt;br /&gt;
    else:&lt;br /&gt;
        return 1 / (4 * np.pi * t) * np.exp(-(x1**2 + x2**2) / (4 * t))&lt;br /&gt;
&lt;br /&gt;
# Definir el intervalo espacial&lt;br /&gt;
x1_values = np.linspace(-1, 1, 100)  # Valores de x1&lt;br /&gt;
x2_values = np.linspace(-1, 1, 100)  # Valores de x2&lt;br /&gt;
x1, x2 = np.meshgrid(x1_values, x2_values)  # Malla de valores de x1 y x2&lt;br /&gt;
&lt;br /&gt;
# Definir los tiempos&lt;br /&gt;
t_values = np.linspace(0, 0.1, 3)  # Valores de tiempo&lt;br /&gt;
&lt;br /&gt;
# Tamaño de la figura&lt;br /&gt;
fig = plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
# Graficar la solución fundamental en 2D para cada tiempo&lt;br /&gt;
for i, t in enumerate(t_values, 1):&lt;br /&gt;
    ax = fig.add_subplot(1, len(t_values), i, projection='3d')&lt;br /&gt;
    phi = phi_2D(x1, x2, t)&lt;br /&gt;
    ax.plot_surface(x1, x2, phi, cmap='viridis')&lt;br /&gt;
    ax.set_title(f'Tiempo $t=${round(t, 3)}')&lt;br /&gt;
    ax.set_xlabel('x1')&lt;br /&gt;
    ax.set_ylabel('x2')&lt;br /&gt;
    ax.set_zlabel('phi(x1, x2, t)')&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor(Grupo_Eau_De_Parfum(EDP)))&amp;diff=70143</id>
		<title>Ecuación del calor(Grupo Eau De Parfum(EDP)))</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor(Grupo_Eau_De_Parfum(EDP)))&amp;diff=70143"/>
				<updated>2024-03-07T19:22:59Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del Calor. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
==Introducción==&lt;br /&gt;
&lt;br /&gt;
==Conocimientos previos==&lt;br /&gt;
Antes de comenzar será de gran ayuda introducir una serie de conceptos que utilizaremos a lo largo este trabajo:&lt;br /&gt;
&lt;br /&gt;
*'''Ley del calor de Newton''': describe la tasa de pérdida o ganancia de calor de un objeto en relación con el ambiente circundante.La ley se expresa comúnmente como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d T(t)}{d t} = - k (T(t) - T_{\mathrm{a}}) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
siendo &amp;lt;math&amp;gt;T(t) &amp;lt;/math&amp;gt;la temperatura del objeto en un tiempo dado, &amp;lt;math&amp;gt;T_{\mathrm{a}}&amp;lt;/math&amp;gt; la temperatura ambiente y &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; la constante de proporcionalidad.&lt;br /&gt;
&lt;br /&gt;
*'''Principio de conservación de la energía calorífica''': establece que la variación de energía calorífica sobre un cuerpo V se debe al balance entre el calor que entra y sale del cuerpo más una producción externa.&lt;br /&gt;
&lt;br /&gt;
*'''Ley de Fourier''':intaura que el calor fluye desde regiones de alta temperatura a regiones de baja temperatura, y la cantidad de flujo de calor depende de la diferencia de temperatura y las propiedades del material.La expresión matemática de la Ley de Fourier es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{q}  = - k {\nabla} T &amp;lt;/math&amp;gt;,   &lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
donde &amp;lt;math&amp;gt; \mathbf{q}&amp;lt;/math&amp;gt; es el vector de flujo de calor por unidad de superficie y &amp;lt;math&amp;gt;  {\nabla} T &amp;lt;/math&amp;gt; es el gradiente del campo de temperatura en el interior del material.&lt;br /&gt;
*'''Coeficiente de conductividad térmica (D)''':cuantifica la capacidad de un material para conducir el calor. Se define como la cantidad de calor que pasa en un segundo a través de un metro cuadrado de material cuando la diferencia de temperatura a través del material,cuando la diferencia de temperatura a través del material es de un grado(ºC) es de un grado, y el espesor del material es de un metro.&lt;br /&gt;
*'''Principio del máximo''': Sea &amp;lt;math&amp;gt;u \in C^{2,1}(Q_T)\cap (\overline{Q_T})&amp;lt;/math&amp;gt; tal que  &amp;lt;math&amp;gt;u_t - \Delta u \leq 0&amp;lt;/math&amp;gt; en &amp;lt;math&amp;gt;Q_T&amp;lt;/math&amp;gt;. Entonces u alcanza su máximo en la frontera parabólica &amp;lt;math&amp;gt;\partial _p Q_T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\max_{\overline{Q_T}} u = \max_{\partial _p Q_T} u&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nuestro problema original ==&lt;br /&gt;
Habiendo ya introducido los conocimientos básicos, comenzaremos con nuestro problema.&lt;br /&gt;
Consideramos una varilla metálica de 1 metro de longitud , que se encuentra aislada por su superficie lateral, de manera que la conducción de calor únicamente se produce en la dirección longitudinal. La temperatura inicial de la varilla es de 0ºC. En el extremo izquierdo se consigue mantener la temperatura a 0 ºC mientras que en el derecho la temperatura es siempre de 1 ºC. Además  el calor específico toma un valor constante de 1.En cuanto al coeficiente de conductividad térmica,vamos a observar cómo sería nuestro problema para un valor cualquiera y seguidamente especificaremos el valor constante de 1.&lt;br /&gt;
&lt;br /&gt;
Pero antes de abordar matemáticamente nuestro problema, vamos a intentar deducir lo que podría ocurrir. Considerando que la temperatura en el extremo derecho de la varilla es superior a la del extremo izquierdo, el calor comenzará a transferirse desde la zona más cálida, elevando la temperatura a lo largo de la varilla y promoviendo el desplazamiento del calor hacia la región más fría. Simultáneamente, el incremento de la temperatura interna provoca una reducción del flujo de calor entrante y a un aumento del saliente con el tiempo. Anticipamos que, en algún momento, ambos flujos se equilibrarán, conduciendo la temperatura de la varilla a un estado estacionario.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por lo que nuestro problema a resolver queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - Du_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Debemos reescalar en tiempo, para facilitarnos los cálculos, por lo que realizamos el cambio de variable  &amp;lt;math&amp;gt;\tau = \alpha t, \tau \in\mathbb{R} &amp;lt;/math&amp;gt;. Por tanto,  &amp;lt;math&amp;gt; u(x,t)=U(x,\tau)&amp;lt;/math&amp;gt; y entonces &amp;lt;math&amp;gt; \alpha U_{\tau}-DU_{xx}=0&amp;lt;/math&amp;gt; .Tomando &amp;lt;math&amp;gt; \alpha = D&amp;lt;/math&amp;gt; , obtenemos el problema &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;U_{\tau} - U_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(0, \tau) = 0, &amp;amp; \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(1, \tau) = 1, &amp;amp; \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Este problema se resuelve mediante el método de variación de las constantes, pero un factor clave para su implementación es que las condiciones de contorno estén homogeneizadas, es decir, que sean igual a cero. Esto se conseguirá mediante un cambio de variable, en el que es imprescindible la llamada solución estacionaria.&lt;br /&gt;
La solución estacionaria de nuestro problema es aquella que no varía con el tiempo &amp;lt;math&amp;gt; v=\lim_{t \to \infty} U(x,\tau)&amp;lt;/math&amp;gt;y por tanto, su derivada  respecto al tiempo es nula. Nuestro sistema queda ahora:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;-v_{xx}   = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, \\&lt;br /&gt;
&amp;amp;v(0)= 0 \\&lt;br /&gt;
&amp;amp;v(1) = 1, &lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Resolviendo obtenemos que &amp;lt;math&amp;gt; v(x)=x &amp;lt;/math&amp;gt; es nuestra solución estacionaria, cuya expresión gráfica es:&lt;br /&gt;
[[Archivo:sofiaest1.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import numpy as np&lt;br /&gt;
# Define el rango de x entre 0 y 1&lt;br /&gt;
x = np.linspace(0, 1, 100)  &lt;br /&gt;
# Define la función  estacionaria v(x) = x&lt;br /&gt;
v_x = x&lt;br /&gt;
# Crea la gráfica&lt;br /&gt;
plt.plot(x, v_x)&lt;br /&gt;
# Etiquetas de los ejes&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('v(x)')&lt;br /&gt;
# Título de la gráfica&lt;br /&gt;
plt.title('Gráfica de la solución estacionaria v(x)=x')&lt;br /&gt;
# Muestra la gráfica&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Una vez hallada la solución estacionaria, podemos homogeneizar nuestro problema mediante el cambio de variable &amp;lt;math&amp;gt;w(x,t)= U(x,\tau)-v(x)&amp;lt;/math&amp;gt;.Por tanto, sustituyendo en el sistema inicial obtenemos:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;w_{\tau} - w_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(0, \tau) = 0, &amp;amp; \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(1, \tau) = 1-1=0, &amp;amp; \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(x, 0) = 0-x=-x, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Nuestro sistema es ya homogéneo,por lo que aplicamos el método de separación de variables (que consiste en expresar la solución como el producto de una función que depende únicamente de la variable espacial x y una función dependiente de la variable temporal) y obtenemos como solución homogénea:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;w(x,\tau) =  \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 \tau}\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Y deshaciendo los dos cambios de variable, nuestra solución al problema original es por tanto:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 Dt }\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Como en nuestro caso, el coeficiente de conductividad térmica es igual a 1, nuestro sistema es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - Du_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
y nuestra solución:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 t }\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Mostramos gráficamente la solución, observando que se cumplen las condiciones de frontera y además según avanza el tiempo, la solución deja de depender del tiempo y alcanza un estado estacionario, determinado justamente por la solución estacionaria obtenida anteriormente, &amp;lt;math&amp;gt; v(x)=x &amp;lt;/math&amp;gt;. Cabe destacar que en &amp;lt;math&amp;gt; t=0 &amp;lt;/math&amp;gt;  obtenemos las oscilaciones correspondientes a la serie de Fourier de la condición inicial, que se aproxima mediante senos.&lt;br /&gt;
[[Archivo:SOFIASOL11.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
# Solución usando los primeros N términos de la serie&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculasmos los coeficientes C_k&lt;br /&gt;
        C_k = 2 * (-1)**(k) / (k * np.pi)  &lt;br /&gt;
        sum += C_k * np.sin(k*np.pi * x) * np.exp(-lambda_k * t*D) &lt;br /&gt;
    return x+sum&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
&lt;br /&gt;
# Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12,8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x (m)')&lt;br /&gt;
ax.set_ylabel('Tiempo t (s)')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) (ºC)')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Flujo===&lt;br /&gt;
Para estudiar el flujo de calor saliente y entrante en ambos extremos de la varilla a lo largo del tiempo, nos debemos basar en la ley de Fourier &amp;lt;math&amp;gt; \mathbf{q}  = - k  u_x(x,t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Por lo que necesitamos obtener la derivada de la solución con respecto al espacio:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(x,t)= 1+\sum_{k=1}^{\infty}(-1)^{k+1}2 e^{-k^2\pi ^2 t }\cos(k\pi  x) &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Ahora, el flujo en los extremos es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(0,t)=1 +\sum_{k=1}^{\infty}(-1)^{k+1}2 e^{-k^2\pi ^2 t } &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(1,t)=1-\sum_{k=1}^{\infty}2 e^{-k^2\pi ^2 t } &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Gráficamente,&lt;br /&gt;
[[Archivo:SOFIAFLUJO1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
# Derivada de nuestra solución respecto al espacio, multiplicado por -k&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculamos los coeficientes C_k mediante extensión impar&lt;br /&gt;
        C_k = 2 * (-1)**(k+1)  &lt;br /&gt;
        sum += C_k * np.cos(k*np.pi * x) * np.exp(-lambda_k * t) &lt;br /&gt;
    return 1+sum&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(t, u(0,t,N), label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t, u(1,t,N), label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Al comenzar con un flujo de calor nulo en el extremo izquierdo, esto  indica que hay una gran diferencia de temperatura entre ambos extremos de la varilla. El extremo izquierdo está perdiendo calor rápidamente hacia la zona más fría. A medida que el calor se va transfiriendo por la varilla, el gradiente de la temperatura cambia y el extremo derecho comienza a calentarse, debido al flujo de calor que proviene del otro extremo. Este cambio conduce a que el flujo en ambos extremos comience a estar en equilibrio. &lt;br /&gt;
Esta estabilización de flujo en -1 refleja que se ha alcanzado un estado estacionario en el sistema, indicando que cualquier calor entrante en la varilla, se compensa con el calor saliente, manteniendo una distribución de temperatura uniforme.&lt;br /&gt;
&lt;br /&gt;
Este comportamiento refleja la Ley de Fourier, donde al principio la gran diferencia de temperatura induce un flujo de calor bastante significativo, que se va estabilizando llegando a un flujo de -1 en ambos extremos, alcanzando así un gradiente de temperatura constante, con la misma cantidad de calor saliendo hacia fuera desde ambos extremos.&lt;br /&gt;
&lt;br /&gt;
==Cambio de coeficiente de conductividad térmica ==&lt;br /&gt;
Hemos estudiado el problema de Cauchy para un coeficiente de difusión de 1,veamos que ocurre si lo disminuimos a su mitad, es decir,&amp;lt;math&amp;gt;D=\frac{1}{2}&amp;lt;/math&amp;gt;.Nuestro nuevo problema por tanto es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - \frac{1}{2}u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuya solución es &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {\frac{-k^2\pi ^2 t}{2}}\sin(k\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gráficamente, únicamente hemos cambiado el valor de D en el código (2)  y obtenemos:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:SOFIASOL22.png|400px|thumb|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1/2       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
# Solución usando los primeros N términos de la serie&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculasmos los coeficientes C_k&lt;br /&gt;
        C_k = 2 * (-1)**(k) / (k * np.pi)  &lt;br /&gt;
        sum += C_k * np.sin(k*np.pi * x) * np.exp(-lambda_k * t*D) &lt;br /&gt;
    return x+sum&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
# Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12,8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
ax.set_xlabel('Posición x (m)')&lt;br /&gt;
ax.set_ylabel('Tiempo t (s)')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) (ºC)')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
No se puede apreciar ninguna diferencia aparente entre las soluciones para los diferentes coeficientes. Para observar algún cambio vamos a dibujar la diferencia entre la solución y el estado estacionario en &amp;lt;math&amp;gt; x = 1/2&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt; t \in [0, 1]&amp;lt;/math&amp;gt;, es decir &amp;lt;math&amp;gt;u(1/2, t) − v(1/2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
[[Archivo:SOFIACCT1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
x=0.5&lt;br /&gt;
# Definir la función de temperatura con un número limitado de términos en la serie&lt;br /&gt;
def u(x, t, alpha, n_terms=10):   &lt;br /&gt;
    sum_series = sum(2 * (-1)**(k + 1) / (k * np.pi) * np.sin(k * np.pi * x) * np.exp(-k**2 * np.pi**2 * alpha * t) for k in range(1, n_terms + 1))&lt;br /&gt;
    return  x - sum_series&lt;br /&gt;
# Intervalo de tiempo&lt;br /&gt;
t = np.linspace(0, 1, 100)&lt;br /&gt;
# Calcular la temperatura en x=1/2 para diferentes alphas&lt;br /&gt;
u_k1 = u(0.5, t, alpha=1)-x  # D=1, correspondiente a alpha=1&lt;br /&gt;
u_k_half = u(0.5, t, alpha=0.5)-x  # D=1/2, correspondiente a alpha=0.5&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.plot(t, u_k1, label='k=1', color='blue')&lt;br /&gt;
plt.plot(t, u_k_half, label='k=1/2', color='red')&lt;br /&gt;
plt.xlabel('Tiempo (s)')&lt;br /&gt;
plt.ylabel('u(1/2, t) − v(1/2)')&lt;br /&gt;
plt.title('Efecto del Coeficiente de Conductividad Térmica ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El coeficiente de conductividad térmica juega un papel fundamental en determinar la velocidad a la que se propaga la temperatura dentro de un material. Al disminuir este coeficiente a la mitad, el proceso de conducción térmica a través de la varilla experimenta una notable ralentización. Esto se traduce en que, en cualquier instante dado t, la distribución de la temperatura a lo largo de la varilla VA avanzando a la mitad de velocidad en comparación con un escenario donde el coeficiente de conductividad térmica es de 1. Dicho cambio incide directamente en la rapidez con que se logra el equilibrio térmico en la varilla, Resultando en una difusión térmica más lenta hacia el equilibrio.&lt;br /&gt;
&lt;br /&gt;
== Cambio de condiciones ==&lt;br /&gt;
Supongamos ahora una barra unidimensional con extremos fijos a una temperatura de &amp;lt;math&amp;gt;0^\circ C&amp;lt;/math&amp;gt;. La temperatura inicial en cualquier punto de la barra está dada por la función &amp;lt;math&amp;gt;u(x,0) = max\{0, 1−4|x−1/2|\}&amp;lt;/math&amp;gt;, lo que significa que inicialmente la temperatura en la barra varía de acuerdo con esta función.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = max\{0, 1−4|x−1/2|\}, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Supongamos que, en tiempo infinito, \( t \rightarrow \infty \), se llega a una solución estacionaria y que, por tanto, ya no varía en tiempo. De modo, que tomando esta suposición llegamos al siguiente sistema con \( u(x,t) \xrightarrow{\text{t tiende a }\infty} v(x) \).&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;v_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,   \\&lt;br /&gt;
&amp;amp;v(0) = 0, &amp;amp; \\&lt;br /&gt;
&amp;amp;v(1) = 0, &amp;amp;  &lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuya solución es la constante \( v(x)=0 \). De modo que el sistema homogeneizado, coincide con el original, pues \( w(x,t)=u(x,t)-v(x) =u(x,t)-0=u(x,t)\) &lt;br /&gt;
Antes de exigir la condición inicial, la solución coincide con la del primer apartado, pues nos encontramos ante la misma ecuación diferencial, salvo por la función \( u(x,0)\), la cual no toma parte hasta el final de la resolución de esta suponiendo separación de variables. De modo que&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t) = \sum_{k=1}^{\infty} C_k  e^{(-k^2\pi ^2 t )}\sin(k \pi  x)&amp;lt;/math&amp;gt; &lt;br /&gt;
Para hallar el valor de los coeficientes &amp;lt;math&amp;gt; C_k&amp;lt;/math&amp;gt;, buscamos la serie de Fourier de la función &amp;lt;math&amp;gt; max\{0, 1−4|x−1/2|\}&amp;lt;/math&amp;gt; extendida de forma impar. Esto es posible, ya que&lt;br /&gt;
:&amp;lt;math&amp;gt; \int^1_0 (max\{0, 1−4|x−1/2|\})^2 dx=0.1667 &amp;lt; \infty&amp;lt;/math&amp;gt;  &lt;br /&gt;
El cálculo de los coeficientes se ha realizado numéricamente aproximando por la fórmula del trapecio. Los coeficientes se pueden consultar ejecutando el siguiente código en Python&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np &lt;br /&gt;
def f(x):   # Defino función que se quiere aproximar&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x):&lt;br /&gt;
    coefficients = np.zeros(n) # Guardo los coeficientes en una lista&lt;br /&gt;
    for k in range(1,n+1):     # Compiezo en k=1, pues sin(0)=0&lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients&lt;br /&gt;
&lt;br /&gt;
fourier_coefficients(f, 10, np.linspace(0, 1, 1000))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
De modo que ya se ha calculado la solución de este nuevo problema. Visualmente, responde a la siguiente gráfica, resultado de ejecutar este código:&lt;br /&gt;
[[Archivo:Solucion_Celia.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)    # Generar una cuadrícula de puntos&lt;br /&gt;
&lt;br /&gt;
def f(x):    # Defino mi función condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x): # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    coefficients = np.zeros(n)&lt;br /&gt;
    for k in range(1,n+1):         # Comenzamos en 1, pues sen(0)=0&lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients.tolist()   # Convertir a lista&lt;br /&gt;
coef=fourier_coefficients(f, N, x)&lt;br /&gt;
&lt;br /&gt;
def u(x, t, n): # Definir la solución en términos de la serie de Fourier con N términos&lt;br /&gt;
    sum = 0                 # Almacenamos la suma (resultado) hasta el término 10&lt;br /&gt;
    for k in range(1, n+1): # Para cada k calculo el lambda y sumo su coeficiente respectivo&lt;br /&gt;
        lambda_k = k* np.pi&lt;br /&gt;
        sum += coef[k-1] * np.sin(lambda_k * x) * np.exp(-lambda_k**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
Z = u(X, T, N) # Calcular los valores de la función para cada par (x, t)&lt;br /&gt;
&lt;br /&gt;
# Graficar la función en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))  # Cambio aquí para hacer la figura más grande&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z,cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x [m]')&lt;br /&gt;
ax.set_ylabel('Tiempo t [s]')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) [ºC]')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)  #Añado una guía de colores&lt;br /&gt;
surf.set_clim(0, 1)                       # Le introduzco cota inf/sup a los colores&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
​[[Archivo:gifcelia.gif|400px|right|]]&lt;br /&gt;
Vemos como la temperatura sufre una gran variación en tiempos cercanos a 0, y rápidamente tiende a su estado estacionario, &amp;lt;math&amp;gt;v(x)=0&amp;lt;/math&amp;gt;. Para poder visualizarlo mejor mostraremos una un gif donde la imagen cambia a medida que el tiempo pasa, restringido a &amp;lt;math&amp;gt;t \in [0,0.3]&amp;lt;/math&amp;gt;, pues a partir de ahí, la temperatura está suficientemente cerca de la estacionaria y, por tanto, no hay gran variación en la temperatura.&lt;br /&gt;
&lt;br /&gt;
En un inicio, en \(t=0\) la temperatura toma valores negativos. Esto debido a que la exponencial se anula y son los coeficientes de Fourier quienes exigen el signo de la función. Una vez que &amp;lt;math&amp;gt;t&amp;gt;0&amp;lt;/math&amp;gt;, u se hace positivo en todas partes, lo que significa que la temperatura se difunde casi instantáneamente a lo largo del eje x, resultando en una velocidad de propagación infinita. Es decir, cualquier perturbación se siente enseguida en toda parte del dominio.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Terminamos el estudio de esta ecuación de difusión con el estudio del flujo, la inversa de la variación de la variable x de la solución. Para ello derivamos la solución que hemos obtenido. En términos de &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;, puesto que no son dependientes de x, obtenemos:&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{\partial}{\partial x}u(x,t)=\sum_{k=1}^{\infty} C_k  e^{(-k^2\pi ^2 t )}\cos(k \pi  x)\frac{1}{k \pi}&amp;lt;/math&amp;gt; como flujo de la ecuación homogénea. Adjuntamos el código con el cual se ha calculado la expresión de forma numérica y su respectiva representación gráfica:&lt;br /&gt;
[[Archivo:Flujo_Celia.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino la función de la ci para hallar los coef&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x): # Hallo los coef de Fourier  &lt;br /&gt;
    coefficients = np.zeros(n)&lt;br /&gt;
    for k in range(1,n+1): &lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients.tolist()   # Convertir a lista&lt;br /&gt;
coef=fourier_coefficients(f, N, x)&lt;br /&gt;
&lt;br /&gt;
def u(x, t, n):  # Definir la derivada en términos de la serie de Fourier con N términos&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, n+1):&lt;br /&gt;
        lambda_k = k* np.pi&lt;br /&gt;
        sum += coef[k-1] *np.cos(k * np.pi * x)/(k * np.pi) * np.exp(-lambda_k**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
# Graficamos&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(t, u(0,t,N), label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t, u(1,t,N), label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Observamos dos casos parecidos: Uno desciende hasta alcanzar el 0 (rojo) y otro asciende (azul). El primer caso, un flujo positivo que disminuye a cero, significa que el calor está siendo transferido a lo largo de la varilla en una dirección específica, pero la velocidad de transferencia de calor disminuye gradualmente hasta que alcanza cero, lo que indica un equilibrio térmico en la varilla. En el segundo caso, el flujo de calor comienza siendo negativo y alcanza cero, esto implicaría que al principio está ocurriendo una pérdida de calor en la dirección específica a lo largo de la varilla, pero esta pérdida disminuye hasta que se detiene completamente.&lt;br /&gt;
&lt;br /&gt;
==Varilla con extremo aislado==&lt;br /&gt;
En este estudio modelamos la difusión del calor en un alambre. Inicialmente, consideramos un alambre con una temperatura inicial de \( 0^\circ C \) en su extremo izquierdo. En contraste, el extremo derecho del alambre está aislado térmicamente, lo que significa que no hay transferencia de calor a través de este. En nuestro análisis, introducimos una fuente de calor en el centro del alambre en el instante inicial. Luego, examinamos cómo se propaga y se distribuye esta fuente de calor a lo largo del alambre con el tiempo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u_x(1, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = max\{0, 1−4|x−1/2|\}, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que la barra se encuentra aislada térmicamente en su extremo en \( x = 1 \) implica que no hay flujo de calor a través de este extremo. La ley de Fick, establece que el flujo de calor es proporcional al gradiente de temperatura según la ecuación \( q = -k \frac{du}{dx} \), donde \( q \) es el flujo de calor, \( k \) es la conductividad térmica y \( \frac{du}{dx} \) es el gradiente de temperatura a lo largo de la barra. En este contexto, si el flujo en dicho extremo es nulo, el gradiente de temperatura es nulo, por tanto  \( u_x(1, t) = 0 \). Observamos además que la solución estacionaria en nuestro caso es \( v(x) = 0 \), pues es la solución del problema de contorno.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
v''(x) = 0, \quad v(0) = 0, \quad v'(1) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De forma análoga a como ocurría en el apartado anterior, el problema que estamos estudiando en este caso es homogéneo. Por tanto, sin necesidad de hacer ningún cambio, procedemos a resolverlo mediante el método de separación de variables. Suponiendo que \( u(x, t) = X(x) \cdot T(t) \). Obtenemos como solución \( X(x) = A \sin(\pi(1/2+k)x) \) y \( T(t) = B e^{-(\pi^2)(1/2+k)^2 t} \). De modo que, la solución sin tener en cuenta la condición inicial es:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u_k(x, t) = c_k \cdot \sin(\pi(1/2+k)x) \cdot e^{-(\pi^2)(1/2+k)^2 t}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Para asegurar la existencia de solución del problema, es necesario verificar si existen ciertos coeficientes \( c_k \) tal que la solución pueda ser definida como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, t) = \sum_{k=0}^{\infty} c_k \cdot \sin(\pi(1/2+k)x) \cdot e^{-(\pi^2)(1/2+k)^2 t}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Para ello, es necesario verificar que las autofunciones \( \{\sin(\pi(1/2+k)x)\}_{k=0}^{\infty} \) forman un conjunto completo en \( L^2 [0, 1]\)  y ortogonal.&lt;br /&gt;
 &lt;br /&gt;
Para comprobar la ortogonalidad entre las autofunciones, calculamos la integral de su producto, o lo que es igual a calcular el producto escalar de \( L^2 [0,1]\), para dos funciones distintas \( \sin(\pi(1/2+k)x) \) y \( \sin(\pi(1/2+m)x) \) con \( k \neq m \in \mathbb{N}\):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{1} \sin(\pi(1/2+k)x) \sin(\pi(1/2+m)x) \, dx = \frac{\sin((k - m) \pi)}{2 (k - m) \pi} - \frac{\sin((1 + k + m) \pi)}{2 (1 + k + m) \pi}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Esta integral se anula para \( k,m \in  \mathbb{N} \), lo que demuestra que las autofunciones son ortogonales entre sí en el intervalo \([0, 1]\).&lt;br /&gt;
Por otro lado, dado que demostrar que las funciones forman una base completa para el espacio \( L^2[0,1] \) puede ser un proceso complejo y requiere un análisis detallado, en este trabajo supondremos que la forman.&lt;br /&gt;
[[Archivo:Solucion_Pablo.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)    # Generar una cuadrícula de puntos&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino mi fucnión condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficient(f, k, x):  # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    ck = 2* np.trapz(f(x) * np.sin(np.pi*(1/2+k)*x) ,x)&lt;br /&gt;
    return ck&lt;br /&gt;
&lt;br /&gt;
# Definir la solución en términos de la serie de Fourier con N términos&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0                 # Almacenamos la suma hasta el término 10&lt;br /&gt;
    for k in range(0, N+1): # Para cada k cálculo su coeficiente y lo sumo al resultado&lt;br /&gt;
        ck = fourier_coefficient(f, k, x)&lt;br /&gt;
        sum += ck * np.sin(np.pi*(1/2+k)*x) * np.exp(-(np.pi**2)*(1/2+k)**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Z = u(X, T, N)  # Calcular los valores de la función para cada par (x, t)&lt;br /&gt;
&lt;br /&gt;
# Graficar la función en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z,cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x [m]')&lt;br /&gt;
ax.set_ylabel('Tiempo t [s]')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) [ºC]')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)  #Añado una guía de colores&lt;br /&gt;
surf.set_clim(0, 1)                       # Le introduzco cota inf/sup a los colores&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gracias a los desarrollos en serie de Fourier, podemos calcular los coeficientes \( c_k \) para cumplir así la condición inicial. Dichos coeficientes se calculan mediante la integral:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_k := \frac{\int_{0}^{1} \max\{0, 1 - 4(x - 1/2)\} \sin(\pi(1/2+k)x) \, dx}{\int_{0}^{1} \sin^2(\pi(1/2+k)x) \, dx}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Dado que la integral es difícil de calcular analíticamente y en consecuencia es difícil obtener una expresión dependiente del parámetro &amp;lt;math&amp;gt; k&amp;lt;/math&amp;gt;, la resolveremos de forma numérica mediante el método del trapecio, de forma análoga a como se hizo en el modelo sin aislante térmico previo.&lt;br /&gt;
Para una comprensión más completa de la evolución de la temperatura del alambre en cuestión, es importante realizar un análisis visual de la solución propuesta. La representación gráfica de la solución en el intervalo de tiempo \( t \in [0, 1] \), considerando los primeros 10 términos de la serie de Fourier, ofrece una visualización tridimensional de la distribución del calor a lo largo del alambre en función del tiempo.&lt;br /&gt;
 &lt;br /&gt;
Es relevante destacar que a medida que transcurre el tiempo, la solución converge gradualmente hacia su estado estacionario, es decir, \(  v(x)=0 \) . Además, observamos que se verifica el principio del máximo, dado que tanto la temperatura máxima y mínima se alcanza en la frontera parabólica.&lt;br /&gt;
Esta última afirmación la podemos verificar de forma sencilla, obteniendo ambos valores de la función. El código utilizado mostró los siguientes datos.&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# Calcular la temperatura máxima y mínima&lt;br /&gt;
max_temperature = np.max(Z)&lt;br /&gt;
min_temperature = np.min(Z)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Temperatura máxima:&amp;quot;, max_temperature)&lt;br /&gt;
print(&amp;quot;Temperatura mínima:&amp;quot;, min_temperature)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Encontrar las coordenadas donde se alcanza la temperatura máxima y mínima&lt;br /&gt;
max_index = np.unravel_index(np.argmax(Z), Z.shape)&lt;br /&gt;
min_index = np.unravel_index(np.argmin(Z), Z.shape)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
max_x, max_t = x_values[max_index[1]], t_values[max_index[0]]&lt;br /&gt;
min_x, min_t = x_values[min_index[1]], t_values[min_index[0]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Coordenadas de la temperatura máxima: (x={}, t={})&amp;quot;.format(max_x, max_t))&lt;br /&gt;
print(&amp;quot;Coordenadas de la temperatura mínima: (x={}, t={})&amp;quot;.format(min_x, min_t))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Resultados de temperatura máxima y mínima&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parámetro!! Valor&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura máxima|| \(0.92 ^\circ \text{C}\)&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura mínima|| \(-0.03 ^\circ \text{C}\)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Coordenadas de temperatura máxima y mínima&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Coordenadas !! Valor&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura máxima|| \((x=0.50, t=0.00)\)&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura mínima|| \((x=0.81, t=0.00)\)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Observamos que el máximo debería ser de &amp;lt;math&amp;gt; 1^\circ \text{C} &amp;lt;/math&amp;gt;. No obstante, el resultado reportado por el código es &amp;lt;math&amp;gt; 0.92 ^\circ \text{C} &amp;lt;/math&amp;gt;. Esto se debe al uso de la aproximación por series de Fourier. Lo mismo ocurre con el valor mínimo que debería se de &amp;lt;math&amp;gt; 0^\circ \text{C} &amp;lt;/math&amp;gt;, no obstante el código reporta &amp;lt;math&amp;gt;-0.03^\circ \text{C} &amp;lt;/math&amp;gt;. Además dichos puntos están en la frontera parabólica, como afirma el principio del máximo. &lt;br /&gt;
&lt;br /&gt;
En este punto es interesante verificar si nuestro modelo es correcto. En tal caso, el extremo izquierdo de la barra no debería perder calor. Por lo tanto, calculamos la derivada de nuestra expresión y, gracias a la Ley de Fick, sabemos que el flujo de calor es igual a la derivada cambiada de signo. Obtenemos los siguientes resultados:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Flujo_Pablo.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 100     # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x_values = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t_values = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino mi función condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficient(f, k, x):   # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    ck = 2* np.trapz(f(x) * np.sin(np.pi*(1/2+k)*x) ,x)&lt;br /&gt;
    return ck&lt;br /&gt;
&lt;br /&gt;
def derivative_solution_x(x, t, N): # Definir la derivada de la solución respecto a x&lt;br /&gt;
    result = 0&lt;br /&gt;
    for k in range(0, N+1):&lt;br /&gt;
        ck = fourier_coefficient(f, k, x_values)&lt;br /&gt;
        result += ck * np.pi * (1/2 + k) * np.cos(np.pi * (1/2 + k) * x) * np.exp(-1 * (np.pi**2) * (1/2 + k)**2 * t)&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
# Calcular la derivada de la solución respecto a x para los extremos x=0 y x=1 a lo largo del tiempo&lt;br /&gt;
flux_x0 = [-derivative_solution_x(0, t, N) for t in t_values]&lt;br /&gt;
flux_x1 = [-derivative_solution_x(1, t, N) for t in t_values]&lt;br /&gt;
&lt;br /&gt;
# Graficar el flujo en los extremos x=0 y x=1 a lo largo del tiempo&lt;br /&gt;
plt.figure(figsize=(8, 5))&lt;br /&gt;
plt.plot(t_values, flux_x0, label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t_values, flux_x1, label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Observamos que todo el calor aportado en el instante inicial se disipa completamente por la izquierda de la varilla, ya que el flujo en &amp;lt;math&amp;gt; x=1&amp;lt;/math&amp;gt; es nulo, verificando así las condiciones fronteras de nuestro problema.&lt;br /&gt;
&lt;br /&gt;
==Solución fundamental==&lt;br /&gt;
La solución fundamental de la ecuación del calor es una función que describe la distribución de temperatura en un medio en función del tiempo y la posición. Para la ecuación del calor unidimensional, la solución fundamental está dada por la fórmula:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\phi(x, t) = \frac{1}{2 \sqrt{\pi t}} \exp\left(-\frac{x^2}{t}\right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
La solución fundamental describe cómo el calor se propaga y difunde a lo largo del medio a medida que pasa el tiempo, en este caso, por ejemplo, el calor en un alambre. Además la solución general del problema de Cauchy es la solución fundamental de la ecuación del calor.&lt;br /&gt;
El problema de Cauchy es el siguiente:&lt;br /&gt;
Dada la ecuación diferencial parcial:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u_t = k \cdot u_{xx},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
junto con las siguientes condiciones iniciales:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, 0) = f(x)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
donde \( f(x) \) es una función dada en el dominio \( 0 \leq x \leq L \) y \( k \) es una constante positiva que representa la difusividad térmica del medio.&lt;br /&gt;
Para resolver el problema de Cauchy para la ecuación del calor es mediante el uso de la solución fundamental y la técnica de convolución. La solución fundamental \( \phi(x, t) \) de la ecuación del calor es una función especial que satisface la ecuación diferencial parcial y las condiciones iniciales dadas.&lt;br /&gt;
 &lt;br /&gt;
Para resolver el problema de Cauchy, podemos utilizar la solución fundamental \( \phi(x, t) \) en combinación con la función inicial \( u_0(x) \) para obtener la solución general \( u(x, t) \) en cualquier instante de tiempo \( t \). Esto se logra convolucionando la función inicial \( f(x) \) con la solución fundamental \( \phi(x, t) \) .&lt;br /&gt;
La solución \( u(x, t) \) del problema de Cauchy se puede expresar como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, t) = \int_{-\infty}^{\infty} \phi(x - y, t) f(y) \, dy&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
En primer lugar, procederemos a visualizar una representación tridimensional de la solución fundamental  \( \phi(x, t) \).&lt;br /&gt;
[[Archivo:Solfundi.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Definir la función que representa la solución fundamental de la ecuación del calor&lt;br /&gt;
def phi(x, t):&lt;br /&gt;
    return 1 / (2 * np.sqrt(np.pi * t)) * np.exp(-x**2 / t)&lt;br /&gt;
&lt;br /&gt;
# Definir los valores de x y t para la gráfica&lt;br /&gt;
x_values = np.linspace(-1, 1, 100)    # Valores de x&lt;br /&gt;
t_values = np.linspace(0.01, 1, 200)  # Valores de t (tiempo)&lt;br /&gt;
&lt;br /&gt;
# Crear una malla de valores de x y t&lt;br /&gt;
X, T = np.meshgrid(x_values, t_values)&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución fundamental para cada par de valores (x, t)&lt;br /&gt;
Z = phi(X, T)&lt;br /&gt;
&lt;br /&gt;
# Crear una figura en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
# Graficar la superficie 3D&lt;br /&gt;
surf = ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
# Etiquetas y título con el símbolo de &amp;quot;phi&amp;quot;&lt;br /&gt;
ax.set_xlabel(r'$x$')&lt;br /&gt;
ax.set_ylabel(r'$t$')&lt;br /&gt;
ax.set_zlabel(r'$\phi(x, t)$')&lt;br /&gt;
ax.set_title(r'Solución fundamental de la ecuación del calor: $\phi(x, t)$')&lt;br /&gt;
&lt;br /&gt;
# Añadir una barra de colores para indicar los valores de Z&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=8)&lt;br /&gt;
plt.show()    # Mostrar la gráfica&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
En esta ocasión veremos la solución de la ecuación del calor \( u_t - u_{xx} = 0 \) en \( x \in \mathbb{R} \) asociada al dato inicial \( f(x) = 1_{[-1,1]} \), viene dada por la convolución:&lt;br /&gt;
 &lt;br /&gt;
:&amp;lt;math&amp;gt; u(x, t) = \int_{-\infty}^{\infty} \phi(x - y, t) f(y) \, dy = \int_{-\infty}^{\infty} \frac{1}{2 \sqrt{\pi t}} \exp\left(-\frac{(x-y)^2}{t}\right) 1_{[-1,1]} \, dy &amp;lt;/math&amp;gt;&lt;br /&gt;
Dibujaremos la solución en diferentes instantes de tiempo: \( t = 0.001 \), \( t = 0.01 \) , \( t = 0.1 \), \( t = 1 \).  Aproximaremos la integral indefinida utilizando la fórmula del trapecio.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:solsolsol.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Definir la solución fundamental&lt;br /&gt;
def phi(x, t):&lt;br /&gt;
    return 1 / np.sqrt(4 * np.pi * t) * np.exp(-x**2 / (4 * t))&lt;br /&gt;
&lt;br /&gt;
def u0(x):&lt;br /&gt;
    return np.where(np.logical_and(x &amp;gt;= -1, x &amp;lt;= 1), 1, 0)&lt;br /&gt;
&lt;br /&gt;
# Definir el intervalo espacial y los instantes de tiempo&lt;br /&gt;
x = np.linspace(-5, 5, 1000)  # Valores de x&lt;br /&gt;
t_values = [0.001, 0.01, 0.1, 1]  # Valores de t (instantes de tiempo)&lt;br /&gt;
&lt;br /&gt;
# Crear una nueva figura para la gráfica&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
# Calcular y graficar la solución para diferentes instantes de tiempo&lt;br /&gt;
for t in t_values:&lt;br /&gt;
    u_x_t = []&lt;br /&gt;
    for xi in x:&lt;br /&gt;
        # Utilizar np.trapz para calcular la solución integral de la ecuación del calor&lt;br /&gt;
        u_x_t.append(np.trapz(phi(xi - x, t)*u0(x), x))&lt;br /&gt;
    plt.plot(x, u_x_t, label=f't = {t}')&lt;br /&gt;
&lt;br /&gt;
# Etiquetas y título de la gráfica&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('u(x, t)')&lt;br /&gt;
plt.title(f'Solución de $u_t - uxx = 0$ en diferentes instantes de tiempo')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Por último, la metodología para calcular la solución fundamental de la ecuación del calor es flexible cuando se trata de incorporar condiciones de contorno. Supongamos que deseamos calcular una solución para la ecuación del calor en una dimensión en el semiespacio donde \( x &amp;gt; 0 \), satisfaciendo las condiciones \( u(0, t) = 1 \), \( u(x, t) \rightarrow 0 \) cuando \( x \rightarrow \infty \) y \( u(x, 0) = 0 \) para \( x &amp;gt; 0 \). Podemos modificar la solución fundamental de manera que satisfaga estas condiciones. Al hacerlo, obtenemos la expresión \( u(x,t) = -\text{erf}\left(\frac{x}{2 \cdot \sqrt{t}}\right) + 1 \), donde \( \text{erf}(x) = \frac{2}{\sqrt{\pi}} \int_{0}^{x} e^{-z^2} \, dz \). Esta expresión ajustada permite obtener la solución deseada que cumple con las condiciones de contorno especificadas.&lt;br /&gt;
[[Archivo:Ultimaaa.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# Importar las bibliotecas necesarias&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
from scipy.special import erf  # Importar la función de error gaussiano&lt;br /&gt;
&lt;br /&gt;
# Definir la función u(x, t)&lt;br /&gt;
def u(x, t):&lt;br /&gt;
    return -1 * erf(x / (2 * np.sqrt(t))) + 1&lt;br /&gt;
&lt;br /&gt;
# Definir los valores de x y t para la gráfica&lt;br /&gt;
x_values = np.linspace(0, 5, 500)  # Valores de x&lt;br /&gt;
t_values = np.linspace(0.01, 5, 500)  # Valores de t (tiempo)&lt;br /&gt;
&lt;br /&gt;
# Crear una malla de valores de x y t&lt;br /&gt;
X, T = np.meshgrid(x_values, t_values)&lt;br /&gt;
&lt;br /&gt;
# Calcular los valores de u(x, t) para cada par de valores (x, t)&lt;br /&gt;
Z = u(X, T)&lt;br /&gt;
&lt;br /&gt;
# Crear una figura en 3D&lt;br /&gt;
fig = plt.figure(figsize=(10, 6))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf = ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('t')&lt;br /&gt;
ax.set_zlabel('u(x, t)')&lt;br /&gt;
ax.set_title('Función u(x, t)')&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Solución fundamental dimensión 2==&lt;br /&gt;
&lt;br /&gt;
Veamos el problema de Cauchy para la ecuación del calor en dos dimensiones (\( x_1, x_2 \) y \( t \)). Sea \( u(x_1, x_2, t) \) la función de temperatura en un medio bidimensional, que satisface la ecuación del calor:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u_t = k(u_{x_1 x_1} + u_{x_2 x_2})&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Con las condiciones iniciales dadas por la temperatura inicial \( u(x_1, x_2, 0) = f(x_1, x_2) \) para algún campo de temperatura dado \( f(x_1, x_2)  \text{para} (x_1, x_2) \in \partial \Omega \), donde \( \Omega \) es el dominio bidimensional sobre el cual se define la temperatura.&lt;br /&gt;
La solución general a este problema (sin contar la condición inicial) viene dada por la siguiente expresión: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\phi(x_1, x_2, t) = \frac{1}{4 \pi t} \exp\left( -\frac{x_1^2 + x_2^2}{4t} \right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Procederemos ahora a representar la solución fundamental, donde veremos un gráfico tridimensional, &amp;lt;math&amp;gt; x_1, x_2, \phi(x_1, x_2, t) &amp;lt;/math&amp;gt; donde se ha fijado un tiempo t.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:gifgif.gif|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Definir la solución fundamental en 2D&lt;br /&gt;
def phi_2D(x1, x2, t):&lt;br /&gt;
    if t == 0:&lt;br /&gt;
        return np.zeros_like(x1)  # Devuelve una matriz de ceros si t es cero&lt;br /&gt;
    else:&lt;br /&gt;
        return 1 / (4 * np.pi * t) * np.exp(-(x1**2 + x2**2) / (4 * t))&lt;br /&gt;
&lt;br /&gt;
# Definir el intervalo espacial&lt;br /&gt;
x1_values = np.linspace(-1, 1, 100)  # Valores de x1&lt;br /&gt;
x2_values = np.linspace(-1, 1, 100)  # Valores de x2&lt;br /&gt;
x1, x2 = np.meshgrid(x1_values, x2_values)  # Malla de valores de x1 y x2&lt;br /&gt;
&lt;br /&gt;
# Definir los tiempos&lt;br /&gt;
t_values = np.linspace(0, 0.1, 3)  # Valores de tiempo&lt;br /&gt;
&lt;br /&gt;
# Tamaño de la figura&lt;br /&gt;
fig = plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
# Graficar la solución fundamental en 2D para cada tiempo&lt;br /&gt;
for i, t in enumerate(t_values, 1):&lt;br /&gt;
    ax = fig.add_subplot(1, len(t_values), i, projection='3d')&lt;br /&gt;
    phi = phi_2D(x1, x2, t)&lt;br /&gt;
    ax.plot_surface(x1, x2, phi, cmap='viridis')&lt;br /&gt;
    ax.set_title(f'Tiempo $t=${round(t, 3)}')&lt;br /&gt;
    ax.set_xlabel('x1')&lt;br /&gt;
    ax.set_ylabel('x2')&lt;br /&gt;
    ax.set_zlabel('phi(x1, x2, t)')&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor(Grupo_Eau_De_Parfum(EDP)))&amp;diff=70142</id>
		<title>Ecuación del calor(Grupo Eau De Parfum(EDP)))</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor(Grupo_Eau_De_Parfum(EDP)))&amp;diff=70142"/>
				<updated>2024-03-07T19:22:23Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del Calor. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
==Introducción==&lt;br /&gt;
&lt;br /&gt;
==Conocimientos previos==&lt;br /&gt;
Antes de comenzar será de gran ayuda introducir una serie de conceptos que utilizaremos a lo largo este trabajo:&lt;br /&gt;
&lt;br /&gt;
*'''Ley del calor de Newton''': describe la tasa de pérdida o ganancia de calor de un objeto en relación con el ambiente circundante.La ley se expresa comúnmente como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d T(t)}{d t} = - k (T(t) - T_{\mathrm{a}}) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
siendo &amp;lt;math&amp;gt;T(t) &amp;lt;/math&amp;gt;la temperatura del objeto en un tiempo dado, &amp;lt;math&amp;gt;T_{\mathrm{a}}&amp;lt;/math&amp;gt; la temperatura ambiente y &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; la constante de proporcionalidad.&lt;br /&gt;
&lt;br /&gt;
*'''Principio de conservación de la energía calorífica''': establece que la variación de energía calorífica sobre un cuerpo V se debe al balance entre el calor que entra y sale del cuerpo más una producción externa.&lt;br /&gt;
&lt;br /&gt;
*'''Ley de Fourier''':intaura que el calor fluye desde regiones de alta temperatura a regiones de baja temperatura, y la cantidad de flujo de calor depende de la diferencia de temperatura y las propiedades del material.La expresión matemática de la Ley de Fourier es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{q}  = - k {\nabla} T &amp;lt;/math&amp;gt;,   &lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
donde &amp;lt;math&amp;gt; \mathbf{q}&amp;lt;/math&amp;gt; es el vector de flujo de calor por unidad de superficie y &amp;lt;math&amp;gt;  {\nabla} T &amp;lt;/math&amp;gt; es el gradiente del campo de temperatura en el interior del material.&lt;br /&gt;
*'''Coeficiente de conductividad térmica (D)''':cuantifica la capacidad de un material para conducir el calor. Se define como la cantidad de calor que pasa en un segundo a través de un metro cuadrado de material cuando la diferencia de temperatura a través del material,cuando la diferencia de temperatura a través del material es de un grado(ºC) es de un grado, y el espesor del material es de un metro.&lt;br /&gt;
*'''Principio del máximo''': Sea &amp;lt;math&amp;gt;u \in C^{2,1}(Q_T)\cap (\overline{Q_T})&amp;lt;/math&amp;gt; tal que  &amp;lt;math&amp;gt;u_t - \Delta u \leq 0&amp;lt;/math&amp;gt; en &amp;lt;math&amp;gt;Q_T&amp;lt;/math&amp;gt;. Entonces u alcanza su máximo en la frontera parabólica &amp;lt;math&amp;gt;\partial _p Q_T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\max_{\overline{Q_T}} u = \max_{\partial _p Q_T} u&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nuestro problema original ==&lt;br /&gt;
Habiendo ya introducido los conocimientos básicos, comenzaremos con nuestro problema.&lt;br /&gt;
Consideramos una varilla metálica de 1 metro de longitud , que se encuentra aislada por su superficie lateral, de manera que la conducción de calor únicamente se produce en la dirección longitudinal. La temperatura inicial de la varilla es de 0ºC. En el extremo izquierdo se consigue mantener la temperatura a 0 ºC mientras que en el derecho la temperatura es siempre de 1 ºC. Además  el calor específico toma un valor constante de 1.En cuanto al coeficiente de conductividad térmica,vamos a observar cómo sería nuestro problema para un valor cualquiera y seguidamente especificaremos el valor constante de 1.&lt;br /&gt;
&lt;br /&gt;
Pero antes de abordar matemáticamente nuestro problema, vamos a intentar deducir lo que podría ocurrir. Considerando que la temperatura en el extremo derecho de la varilla es superior a la del extremo izquierdo, el calor comenzará a transferirse desde la zona más cálida, elevando la temperatura a lo largo de la varilla y promoviendo el desplazamiento del calor hacia la región más fría. Simultáneamente, el incremento de la temperatura interna provoca una reducción del flujo de calor entrante y a un aumento del saliente con el tiempo. Anticipamos que, en algún momento, ambos flujos se equilibrarán, conduciendo la temperatura de la varilla a un estado estacionario.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por lo que nuestro problema a resolver queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - Du_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Debemos reescalar en tiempo, para facilitarnos los cálculos, por lo que realizamos el cambio de variable  &amp;lt;math&amp;gt;\tau = \alpha t, \tau \in\mathbb{R} &amp;lt;/math&amp;gt;. Por tanto,  &amp;lt;math&amp;gt; u(x,t)=U(x,\tau)&amp;lt;/math&amp;gt; y entonces &amp;lt;math&amp;gt; \alpha U_{\tau}-DU_{xx}=0&amp;lt;/math&amp;gt; .Tomando &amp;lt;math&amp;gt; \alpha = D&amp;lt;/math&amp;gt; , obtenemos el problema &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;U_{\tau} - U_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(0, \tau) = 0, &amp;amp; \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(1, \tau) = 1, &amp;amp; \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Este problema se resuelve mediante el método de variación de las constantes, pero un factor clave para su implementación es que las condiciones de contorno estén homogeneizadas, es decir, que sean igual a cero. Esto se conseguirá mediante un cambio de variable, en el que es imprescindible la llamada solución estacionaria.&lt;br /&gt;
La solución estacionaria de nuestro problema es aquella que no varía con el tiempo &amp;lt;math&amp;gt; v=\lim_{t \to \infty} U(x,\tau)&amp;lt;/math&amp;gt;y por tanto, su derivada  respecto al tiempo es nula. Nuestro sistema queda ahora:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;-v_{xx}   = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, \\&lt;br /&gt;
&amp;amp;v(0)= 0 \\&lt;br /&gt;
&amp;amp;v(1) = 1, &lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Resolviendo obtenemos que &amp;lt;math&amp;gt; v(x)=x &amp;lt;/math&amp;gt; es nuestra solución estacionaria, cuya expresión gráfica es:&lt;br /&gt;
[[Archivo:sofiaest1.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import numpy as np&lt;br /&gt;
# Define el rango de x entre 0 y 1&lt;br /&gt;
x = np.linspace(0, 1, 100)  &lt;br /&gt;
# Define la función  estacionaria v(x) = x&lt;br /&gt;
v_x = x&lt;br /&gt;
# Crea la gráfica&lt;br /&gt;
plt.plot(x, v_x)&lt;br /&gt;
# Etiquetas de los ejes&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('v(x)')&lt;br /&gt;
# Título de la gráfica&lt;br /&gt;
plt.title('Gráfica de la solución estacionaria v(x)=x')&lt;br /&gt;
# Muestra la gráfica&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Una vez hallada la solución estacionaria, podemos homogeneizar nuestro problema mediante el cambio de variable &amp;lt;math&amp;gt;w(x,t)= U(x,\tau)-v(x)&amp;lt;/math&amp;gt;.Por tanto, sustituyendo en el sistema inicial obtenemos:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;w_{\tau} - w_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(0, \tau) = 0, &amp;amp; \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(1, \tau) = 1-1=0, &amp;amp; \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(x, 0) = 0-x=-x, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Nuestro sistema es ya homogéneo,por lo que aplicamos el método de separación de variables (que consiste en expresar la solución como el producto de una función que depende únicamente de la variable espacial x y una función dependiente de la variable temporal) y obtenemos como solución homogénea:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;w(x,\tau) =  \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 \tau}\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Y deshaciendo los dos cambios de variable, nuestra solución al problema original es por tanto:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 Dt }\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Como en nuestro caso, el coeficiente de conductividad térmica es igual a 1, nuestro sistema es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - Du_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
y nuestra solución:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 t }\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Mostramos gráficamente la solución, observando que se cumplen las condiciones de frontera y además según avanza el tiempo, la solución deja de depender del tiempo y alcanza un estado estacionario, determinado justamente por la solución estacionaria obtenida anteriormente, &amp;lt;math&amp;gt; v(x)=x &amp;lt;/math&amp;gt;. Cabe destacar que en &amp;lt;math&amp;gt; t=0 &amp;lt;/math&amp;gt;  obtenemos las oscilaciones correspondientes a la serie de Fourier de la condición inicial, que se aproxima mediante senos.&lt;br /&gt;
[[Archivo:SOFIASOL11.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
# Solución usando los primeros N términos de la serie&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculasmos los coeficientes C_k&lt;br /&gt;
        C_k = 2 * (-1)**(k) / (k * np.pi)  &lt;br /&gt;
        sum += C_k * np.sin(k*np.pi * x) * np.exp(-lambda_k * t*D) &lt;br /&gt;
    return x+sum&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
&lt;br /&gt;
# Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12,8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x (m)')&lt;br /&gt;
ax.set_ylabel('Tiempo t (s)')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) (ºC)')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Flujo===&lt;br /&gt;
Para estudiar el flujo de calor saliente y entrante en ambos extremos de la varilla a lo largo del tiempo, nos debemos basar en la ley de Fourier &amp;lt;math&amp;gt; \mathbf{q}  = - k  u_x(x,t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Por lo que necesitamos obtener la derivada de la solución con respecto al espacio:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(x,t)= 1+\sum_{k=1}^{\infty}(-1)^{k+1}2 e^{-k^2\pi ^2 t }\cos(k\pi  x) &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Ahora, el flujo en los extremos es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(0,t)=1 +\sum_{k=1}^{\infty}(-1)^{k+1}2 e^{-k^2\pi ^2 t } &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(1,t)=1-\sum_{k=1}^{\infty}2 e^{-k^2\pi ^2 t } &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Gráficamente,&lt;br /&gt;
[[Archivo:SOFIAFLUJO1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
# Derivada de nuestra solución respecto al espacio, multiplicado por -k&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculamos los coeficientes C_k mediante extensión impar&lt;br /&gt;
        C_k = 2 * (-1)**(k+1)  &lt;br /&gt;
        sum += C_k * np.cos(k*np.pi * x) * np.exp(-lambda_k * t) &lt;br /&gt;
    return 1+sum&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(t, u(0,t,N), label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t, u(1,t,N), label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Al comenzar con un flujo de calor nulo en el extremo izquierdo, esto  indica que hay una gran diferencia de temperatura entre ambos extremos de la varilla. El extremo izquierdo está perdiendo calor rápidamente hacia la zona más fría. A medida que el calor se va transfiriendo por la varilla, el gradiente de la temperatura cambia y el extremo derecho comienza a calentarse, debido al flujo de calor que proviene del otro extremo. Este cambio conduce a que el flujo en ambos extremos comience a estar en equilibrio. &lt;br /&gt;
Esta estabilización de flujo en -1 refleja que se ha alcanzado un estado estacionario en el sistema, indicando que cualquier calor entrante en la varilla, se compensa con el calor saliente, manteniendo una distribución de temperatura uniforme.&lt;br /&gt;
&lt;br /&gt;
Este comportamiento refleja la Ley de Fourier, donde al principio la gran diferencia de temperatura induce un flujo de calor bastante significativo, que se va estabilizando llegando a un flujo de -1 en ambos extremos, alcanzando así un gradiente de temperatura constante, con la misma cantidad de calor saliendo hacia fuera desde ambos extremos.&lt;br /&gt;
&lt;br /&gt;
==Cambio de coeficiente de conductividad térmica ==&lt;br /&gt;
Hemos estudiado el problema de Cauchy para un coeficiente de difusión de 1,veamos que ocurre si lo disminuimos a su mitad, es decir,&amp;lt;math&amp;gt;D=\frac{1}{2}&amp;lt;/math&amp;gt;.Nuestro nuevo problema por tanto es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - \frac{1}{2}u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuya solución es &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {\frac{-k^2\pi ^2 t}{2}}\sin(k\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gráficamente, únicamente hemos cambiado el valor de D en el código (2)  y obtenemos:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:SOFIASOL22.png|400px|thumb|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1/2       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
# Solución usando los primeros N términos de la serie&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculasmos los coeficientes C_k&lt;br /&gt;
        C_k = 2 * (-1)**(k) / (k * np.pi)  &lt;br /&gt;
        sum += C_k * np.sin(k*np.pi * x) * np.exp(-lambda_k * t*D) &lt;br /&gt;
    return x+sum&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
# Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12,8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
ax.set_xlabel('Posición x (m)')&lt;br /&gt;
ax.set_ylabel('Tiempo t (s)')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) (ºC)')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
No se puede apreciar ninguna diferencia aparente entre las soluciones para los diferentes coeficientes. Para observar algún cambio vamos a dibujar la diferencia entre la solución y el estado estacionario en &amp;lt;math&amp;gt; x = 1/2&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt; t \in [0, 1]&amp;lt;/math&amp;gt;, es decir &amp;lt;math&amp;gt;u(1/2, t) − v(1/2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
[[Archivo:SOFIACCT1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
x=0.5&lt;br /&gt;
# Definir la función de temperatura con un número limitado de términos en la serie&lt;br /&gt;
def u(x, t, alpha, n_terms=10):   &lt;br /&gt;
    sum_series = sum(2 * (-1)**(k + 1) / (k * np.pi) * np.sin(k * np.pi * x) * np.exp(-k**2 * np.pi**2 * alpha * t) for k in range(1, n_terms + 1))&lt;br /&gt;
    return  x - sum_series&lt;br /&gt;
# Intervalo de tiempo&lt;br /&gt;
t = np.linspace(0, 1, 100)&lt;br /&gt;
# Calcular la temperatura en x=1/2 para diferentes alphas&lt;br /&gt;
u_k1 = u(0.5, t, alpha=1)-x  # D=1, correspondiente a alpha=1&lt;br /&gt;
u_k_half = u(0.5, t, alpha=0.5)-x  # D=1/2, correspondiente a alpha=0.5&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.plot(t, u_k1, label='k=1', color='blue')&lt;br /&gt;
plt.plot(t, u_k_half, label='k=1/2', color='red')&lt;br /&gt;
plt.xlabel('Tiempo (s)')&lt;br /&gt;
plt.ylabel('u(1/2, t) − v(1/2)')&lt;br /&gt;
plt.title('Efecto del Coeficiente de Conductividad Térmica ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El coeficiente de conductividad térmica juega un papel fundamental en determinar la velocidad a la que se propaga la temperatura dentro de un material. Al disminuir este coeficiente a la mitad, el proceso de conducción térmica a través de la varilla experimenta una notable ralentización. Esto se traduce en que, en cualquier instante dado t, la distribución de la temperatura a lo largo de la varilla VA avanzando a la mitad de velocidad en comparación con un escenario donde el coeficiente de conductividad térmica es de 1. Dicho cambio incide directamente en la rapidez con que se logra el equilibrio térmico en la varilla, Resultando en una difusión térmica más lenta hacia el equilibrio.&lt;br /&gt;
&lt;br /&gt;
== Cambio de condiciones ==&lt;br /&gt;
Supongamos ahora una barra unidimensional con extremos fijos a una temperatura de &amp;lt;math&amp;gt;0^\circ C&amp;lt;/math&amp;gt;. La temperatura inicial en cualquier punto de la barra está dada por la función &amp;lt;math&amp;gt;u(x,0) = max\{0, 1−4|x−1/2|\}&amp;lt;/math&amp;gt;, lo que significa que inicialmente la temperatura en la barra varía de acuerdo con esta función.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = max\{0, 1−4|x−1/2|\}, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Supongamos que, en tiempo infinito, \( t \rightarrow \infty \), se llega a una solución estacionaria y que, por tanto, ya no varía en tiempo. De modo, que tomando esta suposición llegamos al siguiente sistema con \( u(x,t) \xrightarrow{\text{t tiende a }\infty} v(x) \).&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;v_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,   \\&lt;br /&gt;
&amp;amp;v(0) = 0, &amp;amp; \\&lt;br /&gt;
&amp;amp;v(1) = 0, &amp;amp;  &lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuya solución es la constante \( v(x)=0 \). De modo que el sistema homogeneizado, coincide con el original, pues \( w(x,t)=u(x,t)-v(x) =u(x,t)-0=u(x,t)\) &lt;br /&gt;
Antes de exigir la condición inicial, la solución coincide con la del primer apartado, pues nos encontramos ante la misma ecuación diferencial, salvo por la función \( u(x,0)\), la cual no toma parte hasta el final de la resolución de esta suponiendo separación de variables. De modo que&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t) = \sum_{k=1}^{\infty} C_k  e^{(-k^2\pi ^2 t )}\sin(k \pi  x)&amp;lt;/math&amp;gt; &lt;br /&gt;
Para hallar el valor de los coeficientes &amp;lt;math&amp;gt; C_k&amp;lt;/math&amp;gt;, buscamos la serie de Fourier de la función &amp;lt;math&amp;gt; max\{0, 1−4|x−1/2|\}&amp;lt;/math&amp;gt; extendida de forma impar. Esto es posible, ya que&lt;br /&gt;
:&amp;lt;math&amp;gt; \int^1_0 (max\{0, 1−4|x−1/2|\})^2 dx=0.1667 &amp;lt; \infty&amp;lt;/math&amp;gt;  &lt;br /&gt;
El cálculo de los coeficientes se ha realizado numéricamente aproximando por la fórmula del trapecio. Los coeficientes se pueden consultar ejecutando el siguiente código en Python&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np &lt;br /&gt;
def f(x):   # Defino función que se quiere aproximar&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x):&lt;br /&gt;
    coefficients = np.zeros(n) # Guardo los coeficientes en una lista&lt;br /&gt;
    for k in range(1,n+1):     # Compiezo en k=1, pues sin(0)=0&lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients&lt;br /&gt;
&lt;br /&gt;
fourier_coefficients(f, 10, np.linspace(0, 1, 1000))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
De modo que ya se ha calculado la solución de este nuevo problema. Visualmente, responde a la siguiente gráfica, resultado de ejecutar este código:&lt;br /&gt;
[[Archivo:Solucion_Celia.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)    # Generar una cuadrícula de puntos&lt;br /&gt;
&lt;br /&gt;
def f(x):    # Defino mi función condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x): # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    coefficients = np.zeros(n)&lt;br /&gt;
    for k in range(1,n+1):         # Comenzamos en 1, pues sen(0)=0&lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients.tolist()   # Convertir a lista&lt;br /&gt;
coef=fourier_coefficients(f, N, x)&lt;br /&gt;
&lt;br /&gt;
def u(x, t, n): # Definir la solución en términos de la serie de Fourier con N términos&lt;br /&gt;
    sum = 0                 # Almacenamos la suma (resultado) hasta el término 10&lt;br /&gt;
    for k in range(1, n+1): # Para cada k calculo el lambda y sumo su coeficiente respectivo&lt;br /&gt;
        lambda_k = k* np.pi&lt;br /&gt;
        sum += coef[k-1] * np.sin(lambda_k * x) * np.exp(-lambda_k**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
Z = u(X, T, N) # Calcular los valores de la función para cada par (x, t)&lt;br /&gt;
&lt;br /&gt;
# Graficar la función en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))  # Cambio aquí para hacer la figura más grande&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z,cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x [m]')&lt;br /&gt;
ax.set_ylabel('Tiempo t [s]')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) [ºC]')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)  #Añado una guía de colores&lt;br /&gt;
surf.set_clim(0, 1)                       # Le introduzco cota inf/sup a los colores&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
​[[Archivo:gifcelia.gif|400px|right|]]&lt;br /&gt;
Vemos como la temperatura sufre una gran variación en tiempos cercanos a 0, y rápidamente tiende a su estado estacionario, &amp;lt;math&amp;gt;v(x)=0&amp;lt;/math&amp;gt;. Para poder visualizarlo mejor mostraremos una un gif donde la imagen cambia a medida que el tiempo pasa, restringido a &amp;lt;math&amp;gt;t \in [0,0.3]&amp;lt;/math&amp;gt;, pues a partir de ahí, la temperatura está suficientemente cerca de la estacionaria y, por tanto, no hay gran variación en la temperatura.&lt;br /&gt;
&lt;br /&gt;
En un inicio, en \(t=0\) la temperatura toma valores negativos. Esto debido a que la exponencial se anula y son los coeficientes de Fourier quienes exigen el signo de la función. Una vez que &amp;lt;math&amp;gt;t&amp;gt;0&amp;lt;/math&amp;gt;, u se hace positivo en todas partes, lo que significa que la temperatura se difunde casi instantáneamente a lo largo del eje x, resultando en una velocidad de propagación infinita. Es decir, cualquier perturbación se siente enseguida en toda parte del dominio.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Terminamos el estudio de esta ecuación de difusión con el estudio del flujo, la inversa de la variación de la variable x de la solución. Para ello derivamos la solución que hemos obtenido. En términos de &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;, puesto que no son dependientes de x, obtenemos:&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{\partial}{\partial x}u(x,t)=\sum_{k=1}^{\infty} C_k  e^{(-k^2\pi ^2 t )}\cos(k \pi  x)\frac{1}{k \pi}&amp;lt;/math&amp;gt; como flujo de la ecuación homogénea. Adjuntamos el código con el cual se ha calculado la expresión de forma numérica y su respectiva representación gráfica:&lt;br /&gt;
[[Archivo:Flujo_Celia.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino la función de la ci para hallar los coef&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x): # Hallo los coef de Fourier  &lt;br /&gt;
    coefficients = np.zeros(n)&lt;br /&gt;
    for k in range(1,n+1): &lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients.tolist()   # Convertir a lista&lt;br /&gt;
coef=fourier_coefficients(f, N, x)&lt;br /&gt;
&lt;br /&gt;
def u(x, t, n):  # Definir la derivada en términos de la serie de Fourier con N términos&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, n+1):&lt;br /&gt;
        lambda_k = k* np.pi&lt;br /&gt;
        sum += coef[k-1] *np.cos(k * np.pi * x)/(k * np.pi) * np.exp(-lambda_k**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
# Graficamos&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(t, u(0,t,N), label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t, u(1,t,N), label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Observamos dos casos parecidos: Uno desciende hasta alcanzar el 0 (rojo) y otro asciende (azul). El primer caso, un flujo positivo que disminuye a cero, significa que el calor está siendo transferido a lo largo de la varilla en una dirección específica, pero la velocidad de transferencia de calor disminuye gradualmente hasta que alcanza cero, lo que indica un equilibrio térmico en la varilla. En el segundo caso, el flujo de calor comienza siendo negativo y alcanza cero, esto implicaría que al principio está ocurriendo una pérdida de calor en la dirección específica a lo largo de la varilla, pero esta pérdida disminuye hasta que se detiene completamente.&lt;br /&gt;
&lt;br /&gt;
==Varilla con extremo aislado==&lt;br /&gt;
En este estudio modelamos la difusión del calor en un alambre. Inicialmente, consideramos un alambre con una temperatura inicial de \( 0^\circ C \) en su extremo izquierdo. En contraste, el extremo derecho del alambre está aislado térmicamente, lo que significa que no hay transferencia de calor a través de este. En nuestro análisis, introducimos una fuente de calor en el centro del alambre en el instante inicial. Luego, examinamos cómo se propaga y se distribuye esta fuente de calor a lo largo del alambre con el tiempo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u_x(1, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = max\{0, 1−4|x−1/2|\}, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que la barra se encuentra aislada térmicamente en su extremo en \( x = 1 \) implica que no hay flujo de calor a través de este extremo. La ley de Fick, establece que el flujo de calor es proporcional al gradiente de temperatura según la ecuación \( q = -k \frac{du}{dx} \), donde \( q \) es el flujo de calor, \( k \) es la conductividad térmica y \( \frac{du}{dx} \) es el gradiente de temperatura a lo largo de la barra. En este contexto, si el flujo en dicho extremo es nulo, el gradiente de temperatura es nulo, por tanto  \( u_x(1, t) = 0 \). Observamos además que la solución estacionaria en nuestro caso es \( v(x) = 0 \), pues es la solución del problema de contorno.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
v''(x) = 0, \quad v(0) = 0, \quad v'(1) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De forma análoga a como ocurría en el apartado anterior, el problema que estamos estudiando en este caso es homogéneo. Por tanto, sin necesidad de hacer ningún cambio, procedemos a resolverlo mediante el método de separación de variables. Suponiendo que \( u(x, t) = X(x) \cdot T(t) \). Obtenemos como solución \( X(x) = A \sin(\pi(1/2+k)x) \) y \( T(t) = B e^{-(\pi^2)(1/2+k)^2 t} \). De modo que, la solución sin tener en cuenta la condición inicial es:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u_k(x, t) = c_k \cdot \sin(\pi(1/2+k)x) \cdot e^{-(\pi^2)(1/2+k)^2 t}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Para asegurar la existencia de solución del problema, es necesario verificar si existen ciertos coeficientes \( c_k \) tal que la solución pueda ser definida como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, t) = \sum_{k=0}^{\infty} c_k \cdot \sin(\pi(1/2+k)x) \cdot e^{-(\pi^2)(1/2+k)^2 t}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Para ello, es necesario verificar que las autofunciones \( \{\sin(\pi(1/2+k)x)\}_{k=0}^{\infty} \) forman un conjunto completo en \( L^2 [0, 1]\)  y ortogonal.&lt;br /&gt;
 &lt;br /&gt;
Para comprobar la ortogonalidad entre las autofunciones, calculamos la integral de su producto, o lo que es igual a calcular el producto escalar de \( L^2 [0,1]\), para dos funciones distintas \( \sin(\pi(1/2+k)x) \) y \( \sin(\pi(1/2+m)x) \) con \( k \neq m \in \mathbb{N}\):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{1} \sin(\pi(1/2+k)x) \sin(\pi(1/2+m)x) \, dx = \frac{\sin((k - m) \pi)}{2 (k - m) \pi} - \frac{\sin((1 + k + m) \pi)}{2 (1 + k + m) \pi}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Esta integral se anula para \( k,m \in  \mathbb{N} \), lo que demuestra que las autofunciones son ortogonales entre sí en el intervalo \([0, 1]\).&lt;br /&gt;
Por otro lado, dado que demostrar que las funciones forman una base completa para el espacio \( L^2[0,1] \) puede ser un proceso complejo y requiere un análisis detallado, en este trabajo supondremos que la forman.&lt;br /&gt;
[[Archivo:Solucion_Pablo.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)    # Generar una cuadrícula de puntos&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino mi fucnión condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficient(f, k, x):  # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    ck = 2* np.trapz(f(x) * np.sin(np.pi*(1/2+k)*x) ,x)&lt;br /&gt;
    return ck&lt;br /&gt;
&lt;br /&gt;
# Definir la solución en términos de la serie de Fourier con N términos&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0                 # Almacenamos la suma hasta el término 10&lt;br /&gt;
    for k in range(0, N+1): # Para cada k cálculo su coeficiente y lo sumo al resultado&lt;br /&gt;
        ck = fourier_coefficient(f, k, x)&lt;br /&gt;
        sum += ck * np.sin(np.pi*(1/2+k)*x) * np.exp(-(np.pi**2)*(1/2+k)**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Z = u(X, T, N)  # Calcular los valores de la función para cada par (x, t)&lt;br /&gt;
&lt;br /&gt;
# Graficar la función en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z,cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x [m]')&lt;br /&gt;
ax.set_ylabel('Tiempo t [s]')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) [ºC]')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)  #Añado una guía de colores&lt;br /&gt;
surf.set_clim(0, 1)                       # Le introduzco cota inf/sup a los colores&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gracias a los desarrollos en serie de Fourier, podemos calcular los coeficientes \( c_k \) para cumplir así la condición inicial. Dichos coeficientes se calculan mediante la integral:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_k := \frac{\int_{0}^{1} \max\{0, 1 - 4(x - 1/2)\} \sin(\pi(1/2+k)x) \, dx}{\int_{0}^{1} \sin^2(\pi(1/2+k)x) \, dx}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Dado que la integral es difícil de calcular analíticamente y en consecuencia es difícil obtener una expresión dependiente del parámetro &amp;lt;math&amp;gt; k&amp;lt;/math&amp;gt;, la resolveremos de forma numérica mediante el método del trapecio, de forma análoga a como se hizo en el modelo sin aislante térmico previo.&lt;br /&gt;
Para una comprensión más completa de la evolución de la temperatura del alambre en cuestión, es importante realizar un análisis visual de la solución propuesta. La representación gráfica de la solución en el intervalo de tiempo \( t \in [0, 1] \), considerando los primeros 10 términos de la serie de Fourier, ofrece una visualización tridimensional de la distribución del calor a lo largo del alambre en función del tiempo.&lt;br /&gt;
 &lt;br /&gt;
Es relevante destacar que a medida que transcurre el tiempo, la solución converge gradualmente hacia su estado estacionario, es decir, \(  v(x)=0 \) . Además, observamos que se verifica el principio del máximo, dado que tanto la temperatura máxima y mínima se alcanza en la frontera parabólica.&lt;br /&gt;
Esta última afirmación la podemos verificar de forma sencilla, obteniendo ambos valores de la función. El código utilizado mostró los siguientes datos.&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# Calcular la temperatura máxima y mínima&lt;br /&gt;
max_temperature = np.max(Z)&lt;br /&gt;
min_temperature = np.min(Z)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Temperatura máxima:&amp;quot;, max_temperature)&lt;br /&gt;
print(&amp;quot;Temperatura mínima:&amp;quot;, min_temperature)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Encontrar las coordenadas donde se alcanza la temperatura máxima y mínima&lt;br /&gt;
max_index = np.unravel_index(np.argmax(Z), Z.shape)&lt;br /&gt;
min_index = np.unravel_index(np.argmin(Z), Z.shape)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
max_x, max_t = x_values[max_index[1]], t_values[max_index[0]]&lt;br /&gt;
min_x, min_t = x_values[min_index[1]], t_values[min_index[0]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Coordenadas de la temperatura máxima: (x={}, t={})&amp;quot;.format(max_x, max_t))&lt;br /&gt;
print(&amp;quot;Coordenadas de la temperatura mínima: (x={}, t={})&amp;quot;.format(min_x, min_t))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Resultados de temperatura máxima y mínima&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parámetro!! Valor&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura máxima|| \(0.92 ^\circ \text{C}\)&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura mínima|| \(-0.03 ^\circ \text{C}\)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Coordenadas de temperatura máxima y mínima&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Coordenadas !! Valor&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura máxima|| \((x=0.50, t=0.00)\)&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura mínima|| \((x=0.81, t=0.00)\)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Observamos que el máximo debería ser de &amp;lt;math&amp;gt; 1^\circ \text{C} &amp;lt;/math&amp;gt;. No obstante, el resultado reportado por el código es &amp;lt;math&amp;gt; 0.92 ^\circ \text{C} &amp;lt;/math&amp;gt;. Esto se debe al uso de la aproximación por series de Fourier. Lo mismo ocurre con el valor mínimo que debería se de &amp;lt;math&amp;gt; 0^\circ \text{C} &amp;lt;/math&amp;gt;, no obstante el código reporta &amp;lt;math&amp;gt;-0.03^\circ \text{C} &amp;lt;/math&amp;gt;. Además dichos puntos están en la frontera parabólica, como afirma el principio del máximo. &lt;br /&gt;
&lt;br /&gt;
En este punto es interesante verificar si nuestro modelo es correcto. En tal caso, el extremo izquierdo de la barra no debería perder calor. Por lo tanto, calculamos la derivada de nuestra expresión y, gracias a la Ley de Fick, sabemos que el flujo de calor es igual a la derivada cambiada de signo. Obtenemos los siguientes resultados:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Flujo_Pablo.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 100     # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x_values = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t_values = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino mi función condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficient(f, k, x):   # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    ck = 2* np.trapz(f(x) * np.sin(np.pi*(1/2+k)*x) ,x)&lt;br /&gt;
    return ck&lt;br /&gt;
&lt;br /&gt;
def derivative_solution_x(x, t, N): # Definir la derivada de la solución respecto a x&lt;br /&gt;
    result = 0&lt;br /&gt;
    for k in range(0, N+1):&lt;br /&gt;
        ck = fourier_coefficient(f, k, x_values)&lt;br /&gt;
        result += ck * np.pi * (1/2 + k) * np.cos(np.pi * (1/2 + k) * x) * np.exp(-1 * (np.pi**2) * (1/2 + k)**2 * t)&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
# Calcular la derivada de la solución respecto a x para los extremos x=0 y x=1 a lo largo del tiempo&lt;br /&gt;
flux_x0 = [-derivative_solution_x(0, t, N) for t in t_values]&lt;br /&gt;
flux_x1 = [-derivative_solution_x(1, t, N) for t in t_values]&lt;br /&gt;
&lt;br /&gt;
# Graficar el flujo en los extremos x=0 y x=1 a lo largo del tiempo&lt;br /&gt;
plt.figure(figsize=(8, 5))&lt;br /&gt;
plt.plot(t_values, flux_x0, label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t_values, flux_x1, label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Observamos que todo el calor aportado en el instante inicial se disipa completamente por la izquierda de la varilla, ya que el flujo en &amp;lt;math&amp;gt; x=1&amp;lt;/math&amp;gt; es nulo, verificando así las condiciones fronteras de nuestro problema.&lt;br /&gt;
&lt;br /&gt;
==Solución fundamental==&lt;br /&gt;
La solución fundamental de la ecuación del calor es una función que describe la distribución de temperatura en un medio en función del tiempo y la posición. Para la ecuación del calor unidimensional, la solución fundamental está dada por la fórmula:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\phi(x, t) = \frac{1}{2 \sqrt{\pi t}} \exp\left(-\frac{x^2}{t}\right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
La solución fundamental describe cómo el calor se propaga y difunde a lo largo del medio a medida que pasa el tiempo, en este caso, por ejemplo, el calor en un alambre. Además la solución general del problema de Cauchy es la solución fundamental de la ecuación del calor.&lt;br /&gt;
El problema de Cauchy es el siguiente:&lt;br /&gt;
Dada la ecuación diferencial parcial:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u_t = k \cdot u_{xx},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
junto con las siguientes condiciones iniciales:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, 0) = f(x)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
donde \( f(x) \) es una función dada en el dominio \( 0 \leq x \leq L \) y \( k \) es una constante positiva que representa la difusividad térmica del medio.&lt;br /&gt;
Para resolver el problema de Cauchy para la ecuación del calor es mediante el uso de la solución fundamental y la técnica de convolución. La solución fundamental \( \phi(x, t) \) de la ecuación del calor es una función especial que satisface la ecuación diferencial parcial y las condiciones iniciales dadas.&lt;br /&gt;
 &lt;br /&gt;
Para resolver el problema de Cauchy, podemos utilizar la solución fundamental \( \phi(x, t) \) en combinación con la función inicial \( u_0(x) \) para obtener la solución general \( u(x, t) \) en cualquier instante de tiempo \( t \). Esto se logra convolucionando la función inicial \( f(x) \) con la solución fundamental \( \phi(x, t) \) .&lt;br /&gt;
La solución \( u(x, t) \) del problema de Cauchy se puede expresar como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, t) = \int_{-\infty}^{\infty} \phi(x - y, t) f(y) \, dy&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
En primer lugar, procederemos a visualizar una representación tridimensional de la solución fundamental  \( \phi(x, t) \).&lt;br /&gt;
[[Archivo:Solfundi.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Definir la función que representa la solución fundamental de la ecuación del calor&lt;br /&gt;
def phi(x, t):&lt;br /&gt;
    return 1 / (2 * np.sqrt(np.pi * t)) * np.exp(-x**2 / t)&lt;br /&gt;
&lt;br /&gt;
# Definir los valores de x y t para la gráfica&lt;br /&gt;
x_values = np.linspace(-1, 1, 100)    # Valores de x&lt;br /&gt;
t_values = np.linspace(0.01, 1, 200)  # Valores de t (tiempo)&lt;br /&gt;
&lt;br /&gt;
# Crear una malla de valores de x y t&lt;br /&gt;
X, T = np.meshgrid(x_values, t_values)&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución fundamental para cada par de valores (x, t)&lt;br /&gt;
Z = phi(X, T)&lt;br /&gt;
&lt;br /&gt;
# Crear una figura en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
# Graficar la superficie 3D&lt;br /&gt;
surf = ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
# Etiquetas y título con el símbolo de &amp;quot;phi&amp;quot;&lt;br /&gt;
ax.set_xlabel(r'$x$')&lt;br /&gt;
ax.set_ylabel(r'$t$')&lt;br /&gt;
ax.set_zlabel(r'$\phi(x, t)$')&lt;br /&gt;
ax.set_title(r'Solución fundamental de la ecuación del calor: $\phi(x, t)$')&lt;br /&gt;
&lt;br /&gt;
# Añadir una barra de colores para indicar los valores de Z&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=8)&lt;br /&gt;
plt.show()    # Mostrar la gráfica&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
En esta ocasión veremos la solución de la ecuación del calor \( u_t - u_{xx} = 0 \) en \( x \in \mathbb{R} \) asociada al dato inicial \( f(x) = 1_{[-1,1]} \), viene dada por la convolución:&lt;br /&gt;
 &lt;br /&gt;
:&amp;lt;math&amp;gt; u(x, t) = \int_{-\infty}^{\infty} \phi(x - y, t) f(y) \, dy = \int_{-\infty}^{\infty} \frac{1}{2 \sqrt{\pi t}} \exp\left(-\frac{(x-y)^2}{t}\right) 1_{[-1,1]} \, dy &amp;lt;/math&amp;gt;&lt;br /&gt;
Dibujaremos la solución en diferentes instantes de tiempo: \( t = 0.001 \), \( t = 0.01 \) , \( t = 0.1 \), \( t = 1 \).  Aproximaremos la integral indefinida utilizando la fórmula del trapecio.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:solsolsol.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Definir la solución fundamental&lt;br /&gt;
def phi(x, t):&lt;br /&gt;
    return 1 / np.sqrt(4 * np.pi * t) * np.exp(-x**2 / (4 * t))&lt;br /&gt;
&lt;br /&gt;
def u0(x):&lt;br /&gt;
    return np.where(np.logical_and(x &amp;gt;= -1, x &amp;lt;= 1), 1, 0)&lt;br /&gt;
&lt;br /&gt;
# Definir el intervalo espacial y los instantes de tiempo&lt;br /&gt;
x = np.linspace(-5, 5, 1000)  # Valores de x&lt;br /&gt;
t_values = [0.001, 0.01, 0.1, 1]  # Valores de t (instantes de tiempo)&lt;br /&gt;
&lt;br /&gt;
# Crear una nueva figura para la gráfica&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
# Calcular y graficar la solución para diferentes instantes de tiempo&lt;br /&gt;
for t in t_values:&lt;br /&gt;
    u_x_t = []&lt;br /&gt;
    for xi in x:&lt;br /&gt;
        # Utilizar np.trapz para calcular la solución integral de la ecuación del calor&lt;br /&gt;
        u_x_t.append(np.trapz(phi(xi - x, t)*u0(x), x))&lt;br /&gt;
    plt.plot(x, u_x_t, label=f't = {t}')&lt;br /&gt;
&lt;br /&gt;
# Etiquetas y título de la gráfica&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('u(x, t)')&lt;br /&gt;
plt.title(f'Solución de $u_t - uxx = 0$ en diferentes instantes de tiempo')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Por último, la metodología para calcular la solución fundamental de la ecuación del calor es flexible cuando se trata de incorporar condiciones de contorno. Supongamos que deseamos calcular una solución para la ecuación del calor en una dimensión en el semiespacio donde \( x &amp;gt; 0 \), satisfaciendo las condiciones \( u(0, t) = 1 \), \( u(x, t) \rightarrow 0 \) cuando \( x \rightarrow \infty \) y \( u(x, 0) = 0 \) para \( x &amp;gt; 0 \). Podemos modificar la solución fundamental de manera que satisfaga estas condiciones. Al hacerlo, obtenemos la expresión \( u(x,t) = -\text{erf}\left(\frac{x}{2 \cdot \sqrt{t}}\right) + 1 \), donde \( \text{erf}(x) = \frac{2}{\sqrt{\pi}} \int_{0}^{x} e^{-z^2} \, dz \). Esta expresión ajustada permite obtener la solución deseada que cumple con las condiciones de contorno especificadas.&lt;br /&gt;
&lt;br /&gt;
==Solución fundamental dimensión 2==&lt;br /&gt;
&lt;br /&gt;
Veamos el problema de Cauchy para la ecuación del calor en dos dimensiones (\( x_1, x_2 \) y \( t \)). Sea \( u(x_1, x_2, t) \) la función de temperatura en un medio bidimensional, que satisface la ecuación del calor:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u_t = k(u_{x_1 x_1} + u_{x_2 x_2})&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Con las condiciones iniciales dadas por la temperatura inicial \( u(x_1, x_2, 0) = f(x_1, x_2) \) para algún campo de temperatura dado \( f(x_1, x_2)  \text{para} (x_1, x_2) \in \partial \Omega \), donde \( \Omega \) es el dominio bidimensional sobre el cual se define la temperatura.&lt;br /&gt;
La solución general a este problema (sin contar la condición inicial) viene dada por la siguiente expresión: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\phi(x_1, x_2, t) = \frac{1}{4 \pi t} \exp\left( -\frac{x_1^2 + x_2^2}{4t} \right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Procederemos ahora a representar la solución fundamental, donde veremos un gráfico tridimensional, &amp;lt;math&amp;gt; x_1, x_2, \phi(x_1, x_2, t) &amp;lt;/math&amp;gt; donde se ha fijado un tiempo t.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:gifgif.gif|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Definir la solución fundamental en 2D&lt;br /&gt;
def phi_2D(x1, x2, t):&lt;br /&gt;
    if t == 0:&lt;br /&gt;
        return np.zeros_like(x1)  # Devuelve una matriz de ceros si t es cero&lt;br /&gt;
    else:&lt;br /&gt;
        return 1 / (4 * np.pi * t) * np.exp(-(x1**2 + x2**2) / (4 * t))&lt;br /&gt;
&lt;br /&gt;
# Definir el intervalo espacial&lt;br /&gt;
x1_values = np.linspace(-1, 1, 100)  # Valores de x1&lt;br /&gt;
x2_values = np.linspace(-1, 1, 100)  # Valores de x2&lt;br /&gt;
x1, x2 = np.meshgrid(x1_values, x2_values)  # Malla de valores de x1 y x2&lt;br /&gt;
&lt;br /&gt;
# Definir los tiempos&lt;br /&gt;
t_values = np.linspace(0, 0.1, 3)  # Valores de tiempo&lt;br /&gt;
&lt;br /&gt;
# Tamaño de la figura&lt;br /&gt;
fig = plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
# Graficar la solución fundamental en 2D para cada tiempo&lt;br /&gt;
for i, t in enumerate(t_values, 1):&lt;br /&gt;
    ax = fig.add_subplot(1, len(t_values), i, projection='3d')&lt;br /&gt;
    phi = phi_2D(x1, x2, t)&lt;br /&gt;
    ax.plot_surface(x1, x2, phi, cmap='viridis')&lt;br /&gt;
    ax.set_title(f'Tiempo $t=${round(t, 3)}')&lt;br /&gt;
    ax.set_xlabel('x1')&lt;br /&gt;
    ax.set_ylabel('x2')&lt;br /&gt;
    ax.set_zlabel('phi(x1, x2, t)')&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==PABLO==&lt;br /&gt;
[[Archivo:Ultimaaa.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# Importar las bibliotecas necesarias&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
from scipy.special import erf  # Importar la función de error gaussiano&lt;br /&gt;
&lt;br /&gt;
# Definir la función u(x, t)&lt;br /&gt;
def u(x, t):&lt;br /&gt;
    return -1 * erf(x / (2 * np.sqrt(t))) + 1&lt;br /&gt;
&lt;br /&gt;
# Definir los valores de x y t para la gráfica&lt;br /&gt;
x_values = np.linspace(0, 5, 500)  # Valores de x&lt;br /&gt;
t_values = np.linspace(0.01, 5, 500)  # Valores de t (tiempo)&lt;br /&gt;
&lt;br /&gt;
# Crear una malla de valores de x y t&lt;br /&gt;
X, T = np.meshgrid(x_values, t_values)&lt;br /&gt;
&lt;br /&gt;
# Calcular los valores de u(x, t) para cada par de valores (x, t)&lt;br /&gt;
Z = u(X, T)&lt;br /&gt;
&lt;br /&gt;
# Crear una figura en 3D&lt;br /&gt;
fig = plt.figure(figsize=(10, 6))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf = ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('x')&lt;br /&gt;
ax.set_ylabel('t')&lt;br /&gt;
ax.set_zlabel('u(x, t)')&lt;br /&gt;
ax.set_title('Función u(x, t)')&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Ultimaaa.png&amp;diff=70141</id>
		<title>Archivo:Ultimaaa.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Ultimaaa.png&amp;diff=70141"/>
				<updated>2024-03-07T19:20:45Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor(Grupo_Eau_De_Parfum(EDP)))&amp;diff=70136</id>
		<title>Ecuación del calor(Grupo Eau De Parfum(EDP)))</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor(Grupo_Eau_De_Parfum(EDP)))&amp;diff=70136"/>
				<updated>2024-03-07T19:18:00Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Solución fundamental */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del Calor. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
==Introducción==&lt;br /&gt;
&lt;br /&gt;
==Conocimientos previos==&lt;br /&gt;
Antes de comenzar será de gran ayuda introducir una serie de conceptos que utilizaremos a lo largo este trabajo:&lt;br /&gt;
&lt;br /&gt;
*'''Ley del calor de Newton''': describe la tasa de pérdida o ganancia de calor de un objeto en relación con el ambiente circundante.La ley se expresa comúnmente como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d T(t)}{d t} = - k (T(t) - T_{\mathrm{a}}) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
siendo &amp;lt;math&amp;gt;T(t) &amp;lt;/math&amp;gt;la temperatura del objeto en un tiempo dado, &amp;lt;math&amp;gt;T_{\mathrm{a}}&amp;lt;/math&amp;gt; la temperatura ambiente y &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; la constante de proporcionalidad.&lt;br /&gt;
&lt;br /&gt;
*'''Principio de conservación de la energía calorífica''': establece que la variación de energía calorífica sobre un cuerpo V se debe al balance entre el calor que entra y sale del cuerpo más una producción externa.&lt;br /&gt;
&lt;br /&gt;
*'''Ley de Fourier''':intaura que el calor fluye desde regiones de alta temperatura a regiones de baja temperatura, y la cantidad de flujo de calor depende de la diferencia de temperatura y las propiedades del material.La expresión matemática de la Ley de Fourier es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{q}  = - k {\nabla} T &amp;lt;/math&amp;gt;,   &lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
donde &amp;lt;math&amp;gt; \mathbf{q}&amp;lt;/math&amp;gt; es el vector de flujo de calor por unidad de superficie y &amp;lt;math&amp;gt;  {\nabla} T &amp;lt;/math&amp;gt; es el gradiente del campo de temperatura en el interior del material.&lt;br /&gt;
*'''Coeficiente de conductividad térmica (D)''':cuantifica la capacidad de un material para conducir el calor. Se define como la cantidad de calor que pasa en un segundo a través de un metro cuadrado de material cuando la diferencia de temperatura a través del material,cuando la diferencia de temperatura a través del material es de un grado(ºC) es de un grado, y el espesor del material es de un metro.&lt;br /&gt;
*'''Principio del máximo''': Sea &amp;lt;math&amp;gt;u \in C^{2,1}(Q_T)\cap (\overline{Q_T})&amp;lt;/math&amp;gt; tal que  &amp;lt;math&amp;gt;u_t - \Delta u \leq 0&amp;lt;/math&amp;gt; en &amp;lt;math&amp;gt;Q_T&amp;lt;/math&amp;gt;. Entonces u alcanza su máximo en la frontera parabólica &amp;lt;math&amp;gt;\partial _p Q_T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\max_{\overline{Q_T}} u = \max_{\partial _p Q_T} u&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nuestro problema original ==&lt;br /&gt;
Consideramos una varilla metálica de 1 metro de longitud , que se encuentra aislada por su superficie lateral, de manera que la conducción de calor únicamente se produce en la dirección longitudinal. La temperatura inicial de la varilla es de 0ºC. En el extremo izquierdo se consigue mantener la temperatura a 0 ºC mientras que en el derecho la temperatura es siempre de 1 ºC. Además  el calor específico toma un valor constante de 1.En cuanto al coeficiente de conductividad térmica,vamos a observar cómo sería nuestro problema para un valor cualquiera y seguidamente especificaremos el valor constante de 1.&lt;br /&gt;
&lt;br /&gt;
Pero antes de abordar matemáticamente nuestro problema, vamos a intentar deducir lo que podría ocurrir. Considerando que la temperatura en el extremo derecho de la varilla es superior a la del extremo izquierdo, el calor comenzará a transferirse desde la zona más cálida, elevando la temperatura a lo largo de la varilla y promoviendo el desplazamiento del calor hacia la región más fría. Simultáneamente, el incremento de la temperatura interna provoca una reducción del flujo de calor entrante y a un aumento del saliente con el tiempo. Anticipamos que, en algún momento, ambos flujos se equilibrarán, conduciendo la temperatura de la varilla a un estado estacionario.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por lo que nuestro problema a resolver queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - Du_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Debemos reescalar en tiempo, para facilitarnos los cálculos, por lo que realizamos el cambio de variable  &amp;lt;math&amp;gt;\tau = \alpha t, \tau \in\mathbb{R} &amp;lt;/math&amp;gt;. Por tanto,  &amp;lt;math&amp;gt; u(x,t)=U(x,\tau)&amp;lt;/math&amp;gt; y entonces &amp;lt;math&amp;gt; \alpha U_{\tau}-DU_{xx}=0&amp;lt;/math&amp;gt; .Tomando &amp;lt;math&amp;gt; \alpha = D&amp;lt;/math&amp;gt; , obtenemos el problema &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;U_{\tau} - U_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(0, \tau) = 0, &amp;amp; \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(1, \tau) = 1, &amp;amp; \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Este problema se resuelve mediante el método de variación de las constantes, pero un factor clave para su implementación es que las condiciones de contorno estén homogeneizadas, es decir, que sean igual a cero. Esto se conseguirá mediante un cambio de variable, en el que es imprescindible la llamada solución estacionaria.&lt;br /&gt;
La solución estacionaria de nuestro problema es aquella que no varía con el tiempo &amp;lt;math&amp;gt; v=\lim_{t \to \infty} U(x,\tau)&amp;lt;/math&amp;gt;y por tanto, su derivada  respecto al tiempo es nula. Nuestro sistema queda ahora:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;-v_{xx}   = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, \\&lt;br /&gt;
&amp;amp;v(0)= 0 \\&lt;br /&gt;
&amp;amp;v(1) = 1, &lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Resolviendo obtenemos que &amp;lt;math&amp;gt; v(x)=x &amp;lt;/math&amp;gt; es nuestra solución estacionaria, cuya expresión gráfica es:&lt;br /&gt;
[[Archivo:sofiaest1.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import numpy as np&lt;br /&gt;
# Define el rango de x entre 0 y 1&lt;br /&gt;
x = np.linspace(0, 1, 100)  &lt;br /&gt;
# Define la función  estacionaria v(x) = x&lt;br /&gt;
v_x = x&lt;br /&gt;
# Crea la gráfica&lt;br /&gt;
plt.plot(x, v_x)&lt;br /&gt;
# Etiquetas de los ejes&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('v(x)')&lt;br /&gt;
# Título de la gráfica&lt;br /&gt;
plt.title('Gráfica de la solución estacionaria v(x)=x')&lt;br /&gt;
# Muestra la gráfica&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Una vez hallada la solución estacionaria, podemos homogeneizar nuestro problema mediante el cambio de variable &amp;lt;math&amp;gt;w(x,t)= U(x,\tau)-v(x)&amp;lt;/math&amp;gt;.Por tanto, sustituyendo en el sistema inicial obtenemos:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;w_{\tau} - w_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(0, \tau) = 0, &amp;amp; \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(1, \tau) = 1-1=0, &amp;amp; \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(x, 0) = 0-x=-x, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Nuestro sistema es ya homogéneo,por lo que aplicamos el método de separación de variables (que consiste en expresar la solución como el producto de una función que depende únicamente de la variable espacial x y una función dependiente de la variable temporal) y obtenemos como solución homogénea:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;w(x,\tau) =  \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 \tau}\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Y deshaciendo los dos cambios de variable, nuestra solución al problema original es por tanto:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 Dt }\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Como en nuestro caso, el coeficiente de conductividad térmica es igual a 1, nuestro sistema es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - Du_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
y nuestra solución:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 t }\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Mostramos gráficamente la solución, observando que se cumplen las condiciones de frontera y además según avanza el tiempo, la solución deja de depender del tiempo y alcanza un estado estacionario, determinado justamente por la solución estacionaria obtenida anteriormente, &amp;lt;math&amp;gt; v(x)=x &amp;lt;/math&amp;gt;. Cabe destacar que en &amp;lt;math&amp;gt; t=0 &amp;lt;/math&amp;gt;  obtenemos las oscilaciones correspondientes a la serie de Fourier de la condición inicial, que se aproxima mediante senos.&lt;br /&gt;
[[Archivo:SOFIASOL11.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
# Solución usando los primeros N términos de la serie&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculasmos los coeficientes C_k&lt;br /&gt;
        C_k = 2 * (-1)**(k) / (k * np.pi)  &lt;br /&gt;
        sum += C_k * np.sin(k*np.pi * x) * np.exp(-lambda_k * t*D) &lt;br /&gt;
    return x+sum&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
&lt;br /&gt;
# Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12,8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x (m)')&lt;br /&gt;
ax.set_ylabel('Tiempo t (s)')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) (ºC)')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Flujo===&lt;br /&gt;
Para estudiar el flujo de calor saliente y entrante en ambos extremos de la varilla a lo largo del tiempo, nos debemos basar en la ley de Fourier &amp;lt;math&amp;gt; \mathbf{q}  = - k  u_x(x,t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Por lo que necesitamos obtener la derivada de la solución con respecto al espacio:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(x,t)= 1+\sum_{k=1}^{\infty}(-1)^{k+1}2 e^{-k^2\pi ^2 t }\cos(k\pi  x) &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Ahora, el flujo en los extremos es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(0,t)=1 +\sum_{k=1}^{\infty}(-1)^{k+1}2 e^{-k^2\pi ^2 t } &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(1,t)=1-\sum_{k=1}^{\infty}2 e^{-k^2\pi ^2 t } &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Gráficamente,&lt;br /&gt;
[[Archivo:SOFIAFLUJO1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
# Derivada de nuestra solución respecto al espacio, multiplicado por -k&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculamos los coeficientes C_k mediante extensión impar&lt;br /&gt;
        C_k = 2 * (-1)**(k+1)  &lt;br /&gt;
        sum += C_k * np.cos(k*np.pi * x) * np.exp(-lambda_k * t) &lt;br /&gt;
    return 1+sum&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(t, u(0,t,N), label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t, u(1,t,N), label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Al comenzar con un flujo de calor nulo en el extremo izquierdo, esto  indica que hay una gran diferencia de temperatura entre ambos extremos de la varilla. El extremo izquierdo está perdiendo calor rápidamente hacia la zona más fría. A medida que el calor se va transfiriendo por la varilla, el gradiente de la temperatura cambia y el extremo derecho comienza a calentarse, debido al flujo de calor que proviene del otro extremo. Este cambio conduce a que el flujo en ambos extremos comience a estar en equilibrio. &lt;br /&gt;
Esta estabilización de flujo en -1 refleja que se ha alcanzado un estado estacionario en el sistema, indicando que cualquier calor entrante en la varilla, se compensa con el calor saliente, manteniendo una distribución de temperatura uniforme.&lt;br /&gt;
&lt;br /&gt;
Este comportamiento refleja la Ley de Fourier, donde al principio la gran diferencia de temperatura induce un flujo de calor bastante significativo, que se va estabilizando llegando a un flujo de -1 en ambos extremos, alcanzando así un gradiente de temperatura constante, con la misma cantidad de calor saliendo hacia fuera desde ambos extremos.&lt;br /&gt;
&lt;br /&gt;
==Cambio de coeficiente de conductividad térmica ==&lt;br /&gt;
Hemos estudiado el problema de Cauchy para un coeficiente de difusión de 1,veamos que ocurre si lo disminuimos a su mitad, es decir,&amp;lt;math&amp;gt;D=\frac{1}{2}&amp;lt;/math&amp;gt;.Nuestro nuevo problema por tanto es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - \frac{1}{2}u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuya solución es &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {\frac{-k^2\pi ^2 t}{2}}\sin(k\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gráficamente, únicamente hemos cambiado el valor de D en el código (2)  y obtenemos:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:SOFIASOL22.png|400px|thumb|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1/2       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
# Solución usando los primeros N términos de la serie&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculasmos los coeficientes C_k&lt;br /&gt;
        C_k = 2 * (-1)**(k) / (k * np.pi)  &lt;br /&gt;
        sum += C_k * np.sin(k*np.pi * x) * np.exp(-lambda_k * t*D) &lt;br /&gt;
    return x+sum&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
# Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12,8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
ax.set_xlabel('Posición x (m)')&lt;br /&gt;
ax.set_ylabel('Tiempo t (s)')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) (ºC)')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
No se puede apreciar ninguna diferencia aparente entre las soluciones para los diferentes coeficientes. Para observar algún cambio vamos a dibujar la diferencia entre la solución y el estado estacionario en &amp;lt;math&amp;gt; x = 1/2&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt; t \in [0, 1]&amp;lt;/math&amp;gt;, es decir &amp;lt;math&amp;gt;u(1/2, t) − v(1/2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
[[Archivo:SOFIACCT1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
x=0.5&lt;br /&gt;
# Definir la función de temperatura con un número limitado de términos en la serie&lt;br /&gt;
def u(x, t, alpha, n_terms=10):   &lt;br /&gt;
    sum_series = sum(2 * (-1)**(k + 1) / (k * np.pi) * np.sin(k * np.pi * x) * np.exp(-k**2 * np.pi**2 * alpha * t) for k in range(1, n_terms + 1))&lt;br /&gt;
    return  x - sum_series&lt;br /&gt;
# Intervalo de tiempo&lt;br /&gt;
t = np.linspace(0, 1, 100)&lt;br /&gt;
# Calcular la temperatura en x=1/2 para diferentes alphas&lt;br /&gt;
u_k1 = u(0.5, t, alpha=1)-x  # D=1, correspondiente a alpha=1&lt;br /&gt;
u_k_half = u(0.5, t, alpha=0.5)-x  # D=1/2, correspondiente a alpha=0.5&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.plot(t, u_k1, label='k=1', color='blue')&lt;br /&gt;
plt.plot(t, u_k_half, label='k=1/2', color='red')&lt;br /&gt;
plt.xlabel('Tiempo (s)')&lt;br /&gt;
plt.ylabel('u(1/2, t) − v(1/2)')&lt;br /&gt;
plt.title('Efecto del Coeficiente de Conductividad Térmica ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El coeficiente de conductividad térmica juega un papel fundamental en determinar la velocidad a la que se propaga la temperatura dentro de un material. Al disminuir este coeficiente a la mitad, el proceso de conducción térmica a través de la varilla experimenta una notable ralentización. Esto se traduce en que, en cualquier instante dado t, la distribución de la temperatura a lo largo de la varilla VA avanzando a la mitad de velocidad en comparación con un escenario donde el coeficiente de conductividad térmica es de 1. Dicho cambio incide directamente en la rapidez con que se logra el equilibrio térmico en la varilla, Resultando en una difusión térmica más lenta hacia el equilibrio.&lt;br /&gt;
&lt;br /&gt;
== Cambio de condiciones ==&lt;br /&gt;
Supongamos ahora una barra unidimensional con extremos fijos a una temperatura de &amp;lt;math&amp;gt;0^\circ C&amp;lt;/math&amp;gt;. La temperatura inicial en cualquier punto de la barra está dada por la función &amp;lt;math&amp;gt;u(x,0) = max\{0, 1−4|x−1/2|\}&amp;lt;/math&amp;gt;, lo que significa que inicialmente la temperatura en la barra varía de acuerdo con esta función.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = max\{0, 1−4|x−1/2|\}, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Supongamos que, en tiempo infinito, \( t \rightarrow \infty \), se llega a una solución estacionaria y que, por tanto, ya no varía en tiempo. De modo, que tomando esta suposición llegamos al siguiente sistema con \( u(x,t) \xrightarrow{\text{t tiende a }\infty} v(x) \).&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;v_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,   \\&lt;br /&gt;
&amp;amp;v(0) = 0, &amp;amp; \\&lt;br /&gt;
&amp;amp;v(1) = 0, &amp;amp;  &lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuya solución es la constante \( v(x)=0 \). De modo que el sistema homogeneizado, coincide con el original, pues \( w(x,t)=u(x,t)-v(x) =u(x,t)-0=u(x,t)\) &lt;br /&gt;
Antes de exigir la condición inicial, la solución coincide con la del primer apartado, pues nos encontramos ante la misma ecuación diferencial, salvo por la función \( u(x,0)\), la cual no toma parte hasta el final de la resolución de esta suponiendo separación de variables. De modo que&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t) = \sum_{k=1}^{\infty} C_k  e^{(-k^2\pi ^2 t )}\sin(k \pi  x)&amp;lt;/math&amp;gt; &lt;br /&gt;
Para hallar el valor de los coeficientes &amp;lt;math&amp;gt; C_k&amp;lt;/math&amp;gt;, buscamos la serie de Fourier de la función &amp;lt;math&amp;gt; max\{0, 1−4|x−1/2|\}&amp;lt;/math&amp;gt; extendida de forma impar. Esto es posible, ya que&lt;br /&gt;
:&amp;lt;math&amp;gt; \int^1_0 (max\{0, 1−4|x−1/2|\})^2 dx=0.1667 &amp;lt; \infty&amp;lt;/math&amp;gt;  &lt;br /&gt;
El cálculo de los coeficientes se ha realizado numéricamente aproximando por la fórmula del trapecio. Los coeficientes se pueden consultar ejecutando el siguiente código en Python&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np &lt;br /&gt;
def f(x):   # Defino función que se quiere aproximar&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x):&lt;br /&gt;
    coefficients = np.zeros(n) # Guardo los coeficientes en una lista&lt;br /&gt;
    for k in range(1,n+1):     # Compiezo en k=1, pues sin(0)=0&lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients&lt;br /&gt;
&lt;br /&gt;
fourier_coefficients(f, 10, np.linspace(0, 1, 1000))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
De modo que ya se ha calculado la solución de este nuevo problema. Visualmente, responde a la siguiente gráfica, resultado de ejecutar este código:&lt;br /&gt;
[[Archivo:Solucion_Celia.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)    # Generar una cuadrícula de puntos&lt;br /&gt;
&lt;br /&gt;
def f(x):    # Defino mi función condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x): # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    coefficients = np.zeros(n)&lt;br /&gt;
    for k in range(1,n+1):         # Comenzamos en 1, pues sen(0)=0&lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients.tolist()   # Convertir a lista&lt;br /&gt;
coef=fourier_coefficients(f, N, x)&lt;br /&gt;
&lt;br /&gt;
def u(x, t, n): # Definir la solución en términos de la serie de Fourier con N términos&lt;br /&gt;
    sum = 0                 # Almacenamos la suma (resultado) hasta el término 10&lt;br /&gt;
    for k in range(1, n+1): # Para cada k calculo el lambda y sumo su coeficiente respectivo&lt;br /&gt;
        lambda_k = k* np.pi&lt;br /&gt;
        sum += coef[k-1] * np.sin(lambda_k * x) * np.exp(-lambda_k**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
Z = u(X, T, N) # Calcular los valores de la función para cada par (x, t)&lt;br /&gt;
&lt;br /&gt;
# Graficar la función en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))  # Cambio aquí para hacer la figura más grande&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z,cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x [m]')&lt;br /&gt;
ax.set_ylabel('Tiempo t [s]')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) [ºC]')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)  #Añado una guía de colores&lt;br /&gt;
surf.set_clim(0, 1)                       # Le introduzco cota inf/sup a los colores&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
​[[Archivo:gifcelia.gif|400px|right|]]&lt;br /&gt;
Vemos como la temperatura sufre una gran variación en tiempos cercanos a 0, y rápidamente tiende a su estado estacionario, &amp;lt;math&amp;gt;v(x)=0&amp;lt;/math&amp;gt;. Para poder visualizarlo mejor mostraremos una un gif donde la imagen cambia a medida que el tiempo pasa, restringido a &amp;lt;math&amp;gt;t \in [0,0.3]&amp;lt;/math&amp;gt;, pues a partir de ahí, la temperatura está suficientemente cerca de la estacionaria y, por tanto, no hay gran variación en la temperatura.&lt;br /&gt;
&lt;br /&gt;
En un inicio, en \(t=0\) la temperatura toma valores negativos. Esto debido a que la exponencial se anula y son los coeficientes de Fourier quienes exigen el signo de la función. Una vez que &amp;lt;math&amp;gt;t&amp;gt;0&amp;lt;/math&amp;gt;, u se hace positivo en todas partes, lo que significa que la temperatura se difunde casi instantáneamente a lo largo del eje x, resultando en una velocidad de propagación infinita. Es decir, cualquier perturbación se siente enseguida en toda parte del dominio.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Terminamos el estudio de esta ecuación de difusión con el estudio del flujo, la inversa de la variación de la variable x de la solución. Para ello derivamos la solución que hemos obtenido. En términos de &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;, puesto que no son dependientes de x, obtenemos:&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{\partial}{\partial x}u(x,t)=\sum_{k=1}^{\infty} C_k  e^{(-k^2\pi ^2 t )}\cos(k \pi  x)\frac{1}{k \pi}&amp;lt;/math&amp;gt; como flujo de la ecuación homogénea. Adjuntamos el código con el cual se ha calculado la expresión de forma numérica y su respectiva representación gráfica:&lt;br /&gt;
[[Archivo:Flujo_Celia.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino la función de la ci para hallar los coef&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x): # Hallo los coef de Fourier  &lt;br /&gt;
    coefficients = np.zeros(n)&lt;br /&gt;
    for k in range(1,n+1): &lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients.tolist()   # Convertir a lista&lt;br /&gt;
coef=fourier_coefficients(f, N, x)&lt;br /&gt;
&lt;br /&gt;
def u(x, t, n):  # Definir la derivada en términos de la serie de Fourier con N términos&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, n+1):&lt;br /&gt;
        lambda_k = k* np.pi&lt;br /&gt;
        sum += coef[k-1] *np.cos(k * np.pi * x)/(k * np.pi) * np.exp(-lambda_k**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
# Graficamos&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(t, u(0,t,N), label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t, u(1,t,N), label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Observamos dos casos parecidos: Uno desciende hasta alcanzar el 0 (rojo) y otro asciende (azul). El primer caso, un flujo positivo que disminuye a cero, significa que el calor está siendo transferido a lo largo de la varilla en una dirección específica, pero la velocidad de transferencia de calor disminuye gradualmente hasta que alcanza cero, lo que indica un equilibrio térmico en la varilla. En el segundo caso, el flujo de calor comienza siendo negativo y alcanza cero, esto implicaría que al principio está ocurriendo una pérdida de calor en la dirección específica a lo largo de la varilla, pero esta pérdida disminuye hasta que se detiene completamente.&lt;br /&gt;
&lt;br /&gt;
==Varilla con extremo aislado==&lt;br /&gt;
En este estudio modelamos la difusión del calor en un alambre. Inicialmente, consideramos un alambre con una temperatura inicial de \( 0^\circ C \) en su extremo izquierdo. En contraste, el extremo derecho del alambre está aislado térmicamente, lo que significa que no hay transferencia de calor a través de este. En nuestro análisis, introducimos una fuente de calor en el centro del alambre en el instante inicial. Luego, examinamos cómo se propaga y se distribuye esta fuente de calor a lo largo del alambre con el tiempo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u_x(1, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = max\{0, 1−4|x−1/2|\}, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que la barra se encuentra aislada térmicamente en su extremo en \( x = 1 \) implica que no hay flujo de calor a través de este extremo. La ley de Fick, establece que el flujo de calor es proporcional al gradiente de temperatura según la ecuación \( q = -k \frac{du}{dx} \), donde \( q \) es el flujo de calor, \( k \) es la conductividad térmica y \( \frac{du}{dx} \) es el gradiente de temperatura a lo largo de la barra. En este contexto, si el flujo en dicho extremo es nulo, el gradiente de temperatura es nulo, por tanto  \( u_x(1, t) = 0 \). Observamos además que la solución estacionaria en nuestro caso es \( v(x) = 0 \), pues es la solución del problema de contorno.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
v''(x) = 0, \quad v(0) = 0, \quad v'(1) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De forma análoga a como ocurría en el apartado anterior, el problema que estamos estudiando en este caso es homogéneo. Por tanto, sin necesidad de hacer ningún cambio, procedemos a resolverlo mediante el método de separación de variables. Suponiendo que \( u(x, t) = X(x) \cdot T(t) \). Obtenemos como solución \( X(x) = A \sin(\pi(1/2+k)x) \) y \( T(t) = B e^{-(\pi^2)(1/2+k)^2 t} \). De modo que, la solución sin tener en cuenta la condición inicial es:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u_k(x, t) = c_k \cdot \sin(\pi(1/2+k)x) \cdot e^{-(\pi^2)(1/2+k)^2 t}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Para asegurar la existencia de solución del problema, es necesario verificar si existen ciertos coeficientes \( c_k \) tal que la solución pueda ser definida como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, t) = \sum_{k=0}^{\infty} c_k \cdot \sin(\pi(1/2+k)x) \cdot e^{-(\pi^2)(1/2+k)^2 t}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Para ello, es necesario verificar que las autofunciones \( \{\sin(\pi(1/2+k)x)\}_{k=0}^{\infty} \) forman un conjunto completo en \( L^2 [0, 1]\)  y ortogonal.&lt;br /&gt;
 &lt;br /&gt;
Para comprobar la ortogonalidad entre las autofunciones, calculamos la integral de su producto, o lo que es igual a calcular el producto escalar de \( L^2 [0,1]\), para dos funciones distintas \( \sin(\pi(1/2+k)x) \) y \( \sin(\pi(1/2+m)x) \) con \( k \neq m \in \mathbb{N}\):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{1} \sin(\pi(1/2+k)x) \sin(\pi(1/2+m)x) \, dx = \frac{\sin((k - m) \pi)}{2 (k - m) \pi} - \frac{\sin((1 + k + m) \pi)}{2 (1 + k + m) \pi}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Esta integral se anula para \( k,m \in  \mathbb{N} \), lo que demuestra que las autofunciones son ortogonales entre sí en el intervalo \([0, 1]\).&lt;br /&gt;
Por otro lado, dado que demostrar que las funciones forman una base completa para el espacio \( L^2[0,1] \) puede ser un proceso complejo y requiere un análisis detallado, en este trabajo supondremos que la forman.&lt;br /&gt;
[[Archivo:Solucion_Pablo.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)    # Generar una cuadrícula de puntos&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino mi fucnión condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficient(f, k, x):  # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    ck = 2* np.trapz(f(x) * np.sin(np.pi*(1/2+k)*x) ,x)&lt;br /&gt;
    return ck&lt;br /&gt;
&lt;br /&gt;
# Definir la solución en términos de la serie de Fourier con N términos&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0                 # Almacenamos la suma hasta el término 10&lt;br /&gt;
    for k in range(0, N+1): # Para cada k cálculo su coeficiente y lo sumo al resultado&lt;br /&gt;
        ck = fourier_coefficient(f, k, x)&lt;br /&gt;
        sum += ck * np.sin(np.pi*(1/2+k)*x) * np.exp(-(np.pi**2)*(1/2+k)**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Z = u(X, T, N)  # Calcular los valores de la función para cada par (x, t)&lt;br /&gt;
&lt;br /&gt;
# Graficar la función en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z,cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x [m]')&lt;br /&gt;
ax.set_ylabel('Tiempo t [s]')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) [ºC]')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)  #Añado una guía de colores&lt;br /&gt;
surf.set_clim(0, 1)                       # Le introduzco cota inf/sup a los colores&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gracias a los desarrollos en serie de Fourier, podemos calcular los coeficientes \( c_k \) para cumplir así la condición inicial. Dichos coeficientes se calculan mediante la integral:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_k := \frac{\int_{0}^{1} \max\{0, 1 - 4(x - 1/2)\} \sin(\pi(1/2+k)x) \, dx}{\int_{0}^{1} \sin^2(\pi(1/2+k)x) \, dx}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Dado que la integral es difícil de calcular analíticamente y en consecuencia es difícil obtener una expresión dependiente del parámetro &amp;lt;math&amp;gt; k&amp;lt;/math&amp;gt;, la resolveremos de forma numérica mediante el método del trapecio, de forma análoga a como se hizo en el modelo sin aislante térmico previo.&lt;br /&gt;
Para una comprensión más completa de la evolución de la temperatura del alambre en cuestión, es importante realizar un análisis visual de la solución propuesta. La representación gráfica de la solución en el intervalo de tiempo \( t \in [0, 1] \), considerando los primeros 10 términos de la serie de Fourier, ofrece una visualización tridimensional de la distribución del calor a lo largo del alambre en función del tiempo.&lt;br /&gt;
 &lt;br /&gt;
Es relevante destacar que a medida que transcurre el tiempo, la solución converge gradualmente hacia su estado estacionario, es decir, \(  v(x)=0 \) . Además, observamos que se verifica el principio del máximo, dado que tanto la temperatura máxima y mínima se alcanza en la frontera parabólica.&lt;br /&gt;
Esta última afirmación la podemos verificar de forma sencilla, obteniendo ambos valores de la función. El código utilizado mostró los siguientes datos.&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# Calcular la temperatura máxima y mínima&lt;br /&gt;
max_temperature = np.max(Z)&lt;br /&gt;
min_temperature = np.min(Z)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Temperatura máxima:&amp;quot;, max_temperature)&lt;br /&gt;
print(&amp;quot;Temperatura mínima:&amp;quot;, min_temperature)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Encontrar las coordenadas donde se alcanza la temperatura máxima y mínima&lt;br /&gt;
max_index = np.unravel_index(np.argmax(Z), Z.shape)&lt;br /&gt;
min_index = np.unravel_index(np.argmin(Z), Z.shape)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
max_x, max_t = x_values[max_index[1]], t_values[max_index[0]]&lt;br /&gt;
min_x, min_t = x_values[min_index[1]], t_values[min_index[0]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Coordenadas de la temperatura máxima: (x={}, t={})&amp;quot;.format(max_x, max_t))&lt;br /&gt;
print(&amp;quot;Coordenadas de la temperatura mínima: (x={}, t={})&amp;quot;.format(min_x, min_t))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Resultados de temperatura máxima y mínima&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parámetro!! Valor&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura máxima|| \(0.92 ^\circ \text{C}\)&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura mínima|| \(-0.03 ^\circ \text{C}\)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Coordenadas de temperatura máxima y mínima&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Coordenadas !! Valor&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura máxima|| \((x=0.50, t=0.00)\)&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura mínima|| \((x=0.81, t=0.00)\)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Observamos que el máximo debería ser de &amp;lt;math&amp;gt; 1^\circ \text{C} &amp;lt;/math&amp;gt;. No obstante, el resultado reportado por el código es &amp;lt;math&amp;gt; 0.92 ^\circ \text{C} &amp;lt;/math&amp;gt;. Esto se debe al uso de la aproximación por series de Fourier. Lo mismo ocurre con el valor mínimo que debería se de &amp;lt;math&amp;gt; 0^\circ \text{C} &amp;lt;/math&amp;gt;, no obstante el código reporta &amp;lt;math&amp;gt;-0.03^\circ \text{C} &amp;lt;/math&amp;gt;. Además dichos puntos están en la frontera parabólica, como afirma el principio del máximo. &lt;br /&gt;
&lt;br /&gt;
En este punto es interesante verificar si nuestro modelo es correcto. En tal caso, el extremo izquierdo de la barra no debería perder calor. Por lo tanto, calculamos la derivada de nuestra expresión y, gracias a la Ley de Fick, sabemos que el flujo de calor es igual a la derivada cambiada de signo. Obtenemos los siguientes resultados:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Flujo_Pablo.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 100     # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x_values = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t_values = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino mi función condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficient(f, k, x):   # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    ck = 2* np.trapz(f(x) * np.sin(np.pi*(1/2+k)*x) ,x)&lt;br /&gt;
    return ck&lt;br /&gt;
&lt;br /&gt;
def derivative_solution_x(x, t, N): # Definir la derivada de la solución respecto a x&lt;br /&gt;
    result = 0&lt;br /&gt;
    for k in range(0, N+1):&lt;br /&gt;
        ck = fourier_coefficient(f, k, x_values)&lt;br /&gt;
        result += ck * np.pi * (1/2 + k) * np.cos(np.pi * (1/2 + k) * x) * np.exp(-1 * (np.pi**2) * (1/2 + k)**2 * t)&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
# Calcular la derivada de la solución respecto a x para los extremos x=0 y x=1 a lo largo del tiempo&lt;br /&gt;
flux_x0 = [-derivative_solution_x(0, t, N) for t in t_values]&lt;br /&gt;
flux_x1 = [-derivative_solution_x(1, t, N) for t in t_values]&lt;br /&gt;
&lt;br /&gt;
# Graficar el flujo en los extremos x=0 y x=1 a lo largo del tiempo&lt;br /&gt;
plt.figure(figsize=(8, 5))&lt;br /&gt;
plt.plot(t_values, flux_x0, label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t_values, flux_x1, label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Observamos que todo el calor aportado en el instante inicial se disipa completamente por la izquierda de la varilla, ya que el flujo en &amp;lt;math&amp;gt; x=1&amp;lt;/math&amp;gt; es nulo, verificando así las condiciones fronteras de nuestro problema.&lt;br /&gt;
&lt;br /&gt;
==Solución fundamental==&lt;br /&gt;
La solución fundamental de la ecuación del calor es una función que describe la distribución de temperatura en un medio en función del tiempo y la posición. Para la ecuación del calor unidimensional, la solución fundamental está dada por la fórmula:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\phi(x, t) = \frac{1}{2 \sqrt{\pi t}} \exp\left(-\frac{x^2}{t}\right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
La solución fundamental describe cómo el calor se propaga y difunde a lo largo del medio a medida que pasa el tiempo, en este caso, por ejemplo, el calor en un alambre. Además la solución general del problema de Cauchy es la solución fundamental de la ecuación del calor.&lt;br /&gt;
El problema de Cauchy es el siguiente:&lt;br /&gt;
Dada la ecuación diferencial parcial:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u_t = k \cdot u_{xx},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
junto con las siguientes condiciones iniciales:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, 0) = f(x)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
donde \( f(x) \) es una función dada en el dominio \( 0 \leq x \leq L \) y \( k \) es una constante positiva que representa la difusividad térmica del medio.&lt;br /&gt;
Para resolver el problema de Cauchy para la ecuación del calor es mediante el uso de la solución fundamental y la técnica de convolución. La solución fundamental \( \phi(x, t) \) de la ecuación del calor es una función especial que satisface la ecuación diferencial parcial y las condiciones iniciales dadas.&lt;br /&gt;
 &lt;br /&gt;
Para resolver el problema de Cauchy, podemos utilizar la solución fundamental \( \phi(x, t) \) en combinación con la función inicial \( u_0(x) \) para obtener la solución general \( u(x, t) \) en cualquier instante de tiempo \( t \). Esto se logra convolucionando la función inicial \( f(x) \) con la solución fundamental \( \phi(x, t) \) .&lt;br /&gt;
La solución \( u(x, t) \) del problema de Cauchy se puede expresar como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, t) = \int_{-\infty}^{\infty} \phi(x - y, t) f(y) \, dy&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
En primer lugar, procederemos a visualizar una representación tridimensional de la solución fundamental  \( \phi(x, t) \).&lt;br /&gt;
[[Archivo:Solfundi.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Definir la función que representa la solución fundamental de la ecuación del calor&lt;br /&gt;
def phi(x, t):&lt;br /&gt;
    return 1 / (2 * np.sqrt(np.pi * t)) * np.exp(-x**2 / t)&lt;br /&gt;
&lt;br /&gt;
# Definir los valores de x y t para la gráfica&lt;br /&gt;
x_values = np.linspace(-1, 1, 100)    # Valores de x&lt;br /&gt;
t_values = np.linspace(0.01, 1, 200)  # Valores de t (tiempo)&lt;br /&gt;
&lt;br /&gt;
# Crear una malla de valores de x y t&lt;br /&gt;
X, T = np.meshgrid(x_values, t_values)&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución fundamental para cada par de valores (x, t)&lt;br /&gt;
Z = phi(X, T)&lt;br /&gt;
&lt;br /&gt;
# Crear una figura en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
# Graficar la superficie 3D&lt;br /&gt;
surf = ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
# Etiquetas y título con el símbolo de &amp;quot;phi&amp;quot;&lt;br /&gt;
ax.set_xlabel(r'$x$')&lt;br /&gt;
ax.set_ylabel(r'$t$')&lt;br /&gt;
ax.set_zlabel(r'$\phi(x, t)$')&lt;br /&gt;
ax.set_title(r'Solución fundamental de la ecuación del calor: $\phi(x, t)$')&lt;br /&gt;
&lt;br /&gt;
# Añadir una barra de colores para indicar los valores de Z&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=8)&lt;br /&gt;
plt.show()    # Mostrar la gráfica&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
En esta ocasión veremos la solución de la ecuación del calor \( u_t - u_{xx} = 0 \) en \( x \in \mathbb{R} \) asociada al dato inicial \( f(x) = 1_{[-1,1]} \), viene dada por la convolución:&lt;br /&gt;
 &lt;br /&gt;
:&amp;lt;math&amp;gt; u(x, t) = \int_{-\infty}^{\infty} \phi(x - y, t) f(y) \, dy = \int_{-\infty}^{\infty} \frac{1}{2 \sqrt{\pi t}} \exp\left(-\frac{(x-y)^2}{t}\right) 1_{[-1,1]} \, dy &amp;lt;/math&amp;gt;&lt;br /&gt;
Dibujaremos la solución en diferentes instantes de tiempo: \( t = 0.001 \), \( t = 0.01 \) , \( t = 0.1 \), \( t = 1 \).  Aproximaremos la integral indefinida utilizando la fórmula del trapecio.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:solsolsol.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Definir la solución fundamental&lt;br /&gt;
def phi(x, t):&lt;br /&gt;
    return 1 / np.sqrt(4 * np.pi * t) * np.exp(-x**2 / (4 * t))&lt;br /&gt;
&lt;br /&gt;
def u0(x):&lt;br /&gt;
    return np.where(np.logical_and(x &amp;gt;= -1, x &amp;lt;= 1), 1, 0)&lt;br /&gt;
&lt;br /&gt;
# Definir el intervalo espacial y los instantes de tiempo&lt;br /&gt;
x = np.linspace(-5, 5, 1000)  # Valores de x&lt;br /&gt;
t_values = [0.001, 0.01, 0.1, 1]  # Valores de t (instantes de tiempo)&lt;br /&gt;
&lt;br /&gt;
# Crear una nueva figura para la gráfica&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
# Calcular y graficar la solución para diferentes instantes de tiempo&lt;br /&gt;
for t in t_values:&lt;br /&gt;
    u_x_t = []&lt;br /&gt;
    for xi in x:&lt;br /&gt;
        # Utilizar np.trapz para calcular la solución integral de la ecuación del calor&lt;br /&gt;
        u_x_t.append(np.trapz(phi(xi - x, t)*u0(x), x))&lt;br /&gt;
    plt.plot(x, u_x_t, label=f't = {t}')&lt;br /&gt;
&lt;br /&gt;
# Etiquetas y título de la gráfica&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('u(x, t)')&lt;br /&gt;
plt.title(f'Solución de $u_t - uxx = 0$ en diferentes instantes de tiempo')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Por último, la metodología para calcular la solución fundamental de la ecuación del calor es flexible cuando se trata de incorporar condiciones de contorno. Supongamos que deseamos calcular una solución para la ecuación del calor en una dimensión en el semiespacio donde \( x &amp;gt; 0 \), satisfaciendo las condiciones \( u(0, t) = 1 \), \( u(x, t) \rightarrow 0 \) cuando \( x \rightarrow \infty \) y \( u(x, 0) = 0 \) para \( x &amp;gt; 0 \). Podemos modificar la solución fundamental de manera que satisfaga estas condiciones. Al hacerlo, obtenemos la expresión \( u(x,t) = -\text{erf}\left(\frac{x}{2 \cdot \sqrt{t}}\right) + 1 \), donde \( \text{erf}(x) = \frac{2}{\sqrt{\pi}} \int_{0}^{x} e^{-z^2} \, dz \). Esta expresión ajustada permite obtener la solución deseada que cumple con las condiciones de contorno especificadas.&lt;br /&gt;
&lt;br /&gt;
==Solución fundamental dimensión 2==&lt;br /&gt;
&lt;br /&gt;
Veamos el problema de Cauchy para la ecuación del calor en dos dimensiones (\( x_1, x_2 \) y \( t \)). Sea \( u(x_1, x_2, t) \) la función de temperatura en un medio bidimensional, que satisface la ecuación del calor:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u_t = k(u_{x_1 x_1} + u_{x_2 x_2})&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Con las condiciones iniciales dadas por la temperatura inicial \( u(x_1, x_2, 0) = f(x_1, x_2) \) para algún campo de temperatura dado \( f(x_1, x_2)  \text{para} (x_1, x_2) \in \partial \Omega \), donde \( \Omega \) es el dominio bidimensional sobre el cual se define la temperatura.&lt;br /&gt;
La solución general a este problema (sin contar la condición inicial) viene dada por la siguiente expresión: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\phi(x_1, x_2, t) = \frac{1}{4 \pi t} \exp\left( -\frac{x_1^2 + x_2^2}{4t} \right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Procederemos ahora a representar la solución fundamental, donde veremos un gráfico tridimensional, &amp;lt;math&amp;gt; x_1, x_2, \phi(x_1, x_2, t) &amp;lt;/math&amp;gt; donde se ha fijado un tiempo t.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:gifgif.gif|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Definir la solución fundamental en 2D&lt;br /&gt;
def phi_2D(x1, x2, t):&lt;br /&gt;
    if t == 0:&lt;br /&gt;
        return np.zeros_like(x1)  # Devuelve una matriz de ceros si t es cero&lt;br /&gt;
    else:&lt;br /&gt;
        return 1 / (4 * np.pi * t) * np.exp(-(x1**2 + x2**2) / (4 * t))&lt;br /&gt;
&lt;br /&gt;
# Definir el intervalo espacial&lt;br /&gt;
x1_values = np.linspace(-1, 1, 100)  # Valores de x1&lt;br /&gt;
x2_values = np.linspace(-1, 1, 100)  # Valores de x2&lt;br /&gt;
x1, x2 = np.meshgrid(x1_values, x2_values)  # Malla de valores de x1 y x2&lt;br /&gt;
&lt;br /&gt;
# Definir los tiempos&lt;br /&gt;
t_values = np.linspace(0, 0.1, 3)  # Valores de tiempo&lt;br /&gt;
&lt;br /&gt;
# Tamaño de la figura&lt;br /&gt;
fig = plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
# Graficar la solución fundamental en 2D para cada tiempo&lt;br /&gt;
for i, t in enumerate(t_values, 1):&lt;br /&gt;
    ax = fig.add_subplot(1, len(t_values), i, projection='3d')&lt;br /&gt;
    phi = phi_2D(x1, x2, t)&lt;br /&gt;
    ax.plot_surface(x1, x2, phi, cmap='viridis')&lt;br /&gt;
    ax.set_title(f'Tiempo $t=${round(t, 3)}')&lt;br /&gt;
    ax.set_xlabel('x1')&lt;br /&gt;
    ax.set_ylabel('x2')&lt;br /&gt;
    ax.set_zlabel('phi(x1, x2, t)')&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Solsolsol.png&amp;diff=70135</id>
		<title>Archivo:Solsolsol.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Solsolsol.png&amp;diff=70135"/>
				<updated>2024-03-07T19:17:22Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor(Grupo_Eau_De_Parfum(EDP)))&amp;diff=70134</id>
		<title>Ecuación del calor(Grupo Eau De Parfum(EDP)))</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor(Grupo_Eau_De_Parfum(EDP)))&amp;diff=70134"/>
				<updated>2024-03-07T19:15:48Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Cambio de condiciones */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del Calor. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
==Introducción==&lt;br /&gt;
&lt;br /&gt;
==Conocimientos previos==&lt;br /&gt;
Antes de comenzar será de gran ayuda introducir una serie de conceptos que utilizaremos a lo largo este trabajo:&lt;br /&gt;
&lt;br /&gt;
*'''Ley del calor de Newton''': describe la tasa de pérdida o ganancia de calor de un objeto en relación con el ambiente circundante.La ley se expresa comúnmente como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d T(t)}{d t} = - k (T(t) - T_{\mathrm{a}}) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
siendo &amp;lt;math&amp;gt;T(t) &amp;lt;/math&amp;gt;la temperatura del objeto en un tiempo dado, &amp;lt;math&amp;gt;T_{\mathrm{a}}&amp;lt;/math&amp;gt; la temperatura ambiente y &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; la constante de proporcionalidad.&lt;br /&gt;
&lt;br /&gt;
*'''Principio de conservación de la energía calorífica''': establece que la variación de energía calorífica sobre un cuerpo V se debe al balance entre el calor que entra y sale del cuerpo más una producción externa.&lt;br /&gt;
&lt;br /&gt;
*'''Ley de Fourier''':intaura que el calor fluye desde regiones de alta temperatura a regiones de baja temperatura, y la cantidad de flujo de calor depende de la diferencia de temperatura y las propiedades del material.La expresión matemática de la Ley de Fourier es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{q}  = - k {\nabla} T &amp;lt;/math&amp;gt;,   &lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
donde &amp;lt;math&amp;gt; \mathbf{q}&amp;lt;/math&amp;gt; es el vector de flujo de calor por unidad de superficie y &amp;lt;math&amp;gt;  {\nabla} T &amp;lt;/math&amp;gt; es el gradiente del campo de temperatura en el interior del material.&lt;br /&gt;
*'''Coeficiente de conductividad térmica (D)''':cuantifica la capacidad de un material para conducir el calor. Se define como la cantidad de calor que pasa en un segundo a través de un metro cuadrado de material cuando la diferencia de temperatura a través del material,cuando la diferencia de temperatura a través del material es de un grado(ºC) es de un grado, y el espesor del material es de un metro.&lt;br /&gt;
*'''Principio del máximo''': Sea &amp;lt;math&amp;gt;u \in C^{2,1}(Q_T)\cap (\overline{Q_T})&amp;lt;/math&amp;gt; tal que  &amp;lt;math&amp;gt;u_t - \Delta u \leq 0&amp;lt;/math&amp;gt; en &amp;lt;math&amp;gt;Q_T&amp;lt;/math&amp;gt;. Entonces u alcanza su máximo en la frontera parabólica &amp;lt;math&amp;gt;\partial _p Q_T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\max_{\overline{Q_T}} u = \max_{\partial _p Q_T} u&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nuestro problema original ==&lt;br /&gt;
Consideramos una varilla metálica de 1 metro de longitud , que se encuentra aislada por su superficie lateral, de manera que la conducción de calor únicamente se produce en la dirección longitudinal. La temperatura inicial de la varilla es de 0ºC. En el extremo izquierdo se consigue mantener la temperatura a 0 ºC mientras que en el derecho la temperatura es siempre de 1 ºC. Además  el calor específico toma un valor constante de 1.En cuanto al coeficiente de conductividad térmica,vamos a observar cómo sería nuestro problema para un valor cualquiera y seguidamente especificaremos el valor constante de 1.&lt;br /&gt;
&lt;br /&gt;
Pero antes de abordar matemáticamente nuestro problema, vamos a intentar deducir lo que podría ocurrir. Considerando que la temperatura en el extremo derecho de la varilla es superior a la del extremo izquierdo, el calor comenzará a transferirse desde la zona más cálida, elevando la temperatura a lo largo de la varilla y promoviendo el desplazamiento del calor hacia la región más fría. Simultáneamente, el incremento de la temperatura interna provoca una reducción del flujo de calor entrante y a un aumento del saliente con el tiempo. Anticipamos que, en algún momento, ambos flujos se equilibrarán, conduciendo la temperatura de la varilla a un estado estacionario.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por lo que nuestro problema a resolver queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - Du_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Debemos reescalar en tiempo, para facilitarnos los cálculos, por lo que realizamos el cambio de variable  &amp;lt;math&amp;gt;\tau = \alpha t, \tau \in\mathbb{R} &amp;lt;/math&amp;gt;. Por tanto,  &amp;lt;math&amp;gt; u(x,t)=U(x,\tau)&amp;lt;/math&amp;gt; y entonces &amp;lt;math&amp;gt; \alpha U_{\tau}-DU_{xx}=0&amp;lt;/math&amp;gt; .Tomando &amp;lt;math&amp;gt; \alpha = D&amp;lt;/math&amp;gt; , obtenemos el problema &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;U_{\tau} - U_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(0, \tau) = 0, &amp;amp; \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(1, \tau) = 1, &amp;amp; \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Este problema se resuelve mediante el método de variación de las constantes, pero un factor clave para su implementación es que las condiciones de contorno estén homogeneizadas, es decir, que sean igual a cero. Esto se conseguirá mediante un cambio de variable, en el que es imprescindible la llamada solución estacionaria.&lt;br /&gt;
La solución estacionaria de nuestro problema es aquella que no varía con el tiempo &amp;lt;math&amp;gt; v=\lim_{t \to \infty} U(x,\tau)&amp;lt;/math&amp;gt;y por tanto, su derivada  respecto al tiempo es nula. Nuestro sistema queda ahora:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;-v_{xx}   = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, \\&lt;br /&gt;
&amp;amp;v(0)= 0 \\&lt;br /&gt;
&amp;amp;v(1) = 1, &lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Resolviendo obtenemos que &amp;lt;math&amp;gt; v(x)=x &amp;lt;/math&amp;gt; es nuestra solución estacionaria, cuya expresión gráfica es:&lt;br /&gt;
[[Archivo:sofiaest1.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import numpy as np&lt;br /&gt;
# Define el rango de x entre 0 y 1&lt;br /&gt;
x = np.linspace(0, 1, 100)  &lt;br /&gt;
# Define la función  estacionaria v(x) = x&lt;br /&gt;
v_x = x&lt;br /&gt;
# Crea la gráfica&lt;br /&gt;
plt.plot(x, v_x)&lt;br /&gt;
# Etiquetas de los ejes&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('v(x)')&lt;br /&gt;
# Título de la gráfica&lt;br /&gt;
plt.title('Gráfica de la solución estacionaria v(x)=x')&lt;br /&gt;
# Muestra la gráfica&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Una vez hallada la solución estacionaria, podemos homogeneizar nuestro problema mediante el cambio de variable &amp;lt;math&amp;gt;w(x,t)= U(x,\tau)-v(x)&amp;lt;/math&amp;gt;.Por tanto, sustituyendo en el sistema inicial obtenemos:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;w_{\tau} - w_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(0, \tau) = 0, &amp;amp; \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(1, \tau) = 1-1=0, &amp;amp; \tau &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(x, 0) = 0-x=-x, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Nuestro sistema es ya homogéneo,por lo que aplicamos el método de separación de variables (que consiste en expresar la solución como el producto de una función que depende únicamente de la variable espacial x y una función dependiente de la variable temporal) y obtenemos como solución homogénea:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;w(x,\tau) =  \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 \tau}\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Y deshaciendo los dos cambios de variable, nuestra solución al problema original es por tanto:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 Dt }\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Como en nuestro caso, el coeficiente de conductividad térmica es igual a 1, nuestro sistema es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - Du_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
y nuestra solución:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 t }\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Mostramos gráficamente la solución, observando que se cumplen las condiciones de frontera y además según avanza el tiempo, la solución deja de depender del tiempo y alcanza un estado estacionario, determinado justamente por la solución estacionaria obtenida anteriormente, &amp;lt;math&amp;gt; v(x)=x &amp;lt;/math&amp;gt;. Cabe destacar que en &amp;lt;math&amp;gt; t=0 &amp;lt;/math&amp;gt;  obtenemos las oscilaciones correspondientes a la serie de Fourier de la condición inicial, que se aproxima mediante senos.&lt;br /&gt;
[[Archivo:SOFIASOL11.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
# Solución usando los primeros N términos de la serie&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculasmos los coeficientes C_k&lt;br /&gt;
        C_k = 2 * (-1)**(k) / (k * np.pi)  &lt;br /&gt;
        sum += C_k * np.sin(k*np.pi * x) * np.exp(-lambda_k * t*D) &lt;br /&gt;
    return x+sum&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
&lt;br /&gt;
# Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12,8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x (m)')&lt;br /&gt;
ax.set_ylabel('Tiempo t (s)')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) (ºC)')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Flujo===&lt;br /&gt;
Para estudiar el flujo de calor saliente y entrante en ambos extremos de la varilla a lo largo del tiempo, nos debemos basar en la ley de Fourier &amp;lt;math&amp;gt; \mathbf{q}  = - k  u_x(x,t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Por lo que necesitamos obtener la derivada de la solución con respecto al espacio:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(x,t)= 1+\sum_{k=1}^{\infty}(-1)^{k+1}2 e^{-k^2\pi ^2 t }\cos(k\pi  x) &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Ahora, el flujo en los extremos es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(0,t)=1 +\sum_{k=1}^{\infty}(-1)^{k+1}2 e^{-k^2\pi ^2 t } &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(1,t)=1-\sum_{k=1}^{\infty}2 e^{-k^2\pi ^2 t } &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Gráficamente,&lt;br /&gt;
[[Archivo:SOFIAFLUJO1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
# Derivada de nuestra solución respecto al espacio, multiplicado por -k&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculamos los coeficientes C_k mediante extensión impar&lt;br /&gt;
        C_k = 2 * (-1)**(k+1)  &lt;br /&gt;
        sum += C_k * np.cos(k*np.pi * x) * np.exp(-lambda_k * t) &lt;br /&gt;
    return 1+sum&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(t, u(0,t,N), label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t, u(1,t,N), label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Al comenzar con un flujo de calor nulo en el extremo izquierdo, esto  indica que hay una gran diferencia de temperatura entre ambos extremos de la varilla. El extremo izquierdo está perdiendo calor rápidamente hacia la zona más fría. A medida que el calor se va transfiriendo por la varilla, el gradiente de la temperatura cambia y el extremo derecho comienza a calentarse, debido al flujo de calor que proviene del otro extremo. Este cambio conduce a que el flujo en ambos extremos comience a estar en equilibrio. &lt;br /&gt;
Esta estabilización de flujo en -1 refleja que se ha alcanzado un estado estacionario en el sistema, indicando que cualquier calor entrante en la varilla, se compensa con el calor saliente, manteniendo una distribución de temperatura uniforme.&lt;br /&gt;
&lt;br /&gt;
Este comportamiento refleja la Ley de Fourier, donde al principio la gran diferencia de temperatura induce un flujo de calor bastante significativo, que se va estabilizando llegando a un flujo de -1 en ambos extremos, alcanzando así un gradiente de temperatura constante, con la misma cantidad de calor saliendo hacia fuera desde ambos extremos.&lt;br /&gt;
&lt;br /&gt;
==Cambio de coeficiente de conductividad térmica ==&lt;br /&gt;
Hemos estudiado el problema de Cauchy para un coeficiente de difusión de 1,veamos que ocurre si lo disminuimos a su mitad, es decir,&amp;lt;math&amp;gt;D=\frac{1}{2}&amp;lt;/math&amp;gt;.Nuestro nuevo problema por tanto es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - \frac{1}{2}u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuya solución es &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {\frac{-k^2\pi ^2 t}{2}}\sin(k\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gráficamente, únicamente hemos cambiado el valor de D en el código (2)  y obtenemos:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:SOFIASOL22.png|400px|thumb|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1/2       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
# Solución usando los primeros N términos de la serie&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculasmos los coeficientes C_k&lt;br /&gt;
        C_k = 2 * (-1)**(k) / (k * np.pi)  &lt;br /&gt;
        sum += C_k * np.sin(k*np.pi * x) * np.exp(-lambda_k * t*D) &lt;br /&gt;
    return x+sum&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
# Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12,8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
ax.set_xlabel('Posición x (m)')&lt;br /&gt;
ax.set_ylabel('Tiempo t (s)')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) (ºC)')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
No se puede apreciar ninguna diferencia aparente entre las soluciones para los diferentes coeficientes. Para observar algún cambio vamos a dibujar la diferencia entre la solución y el estado estacionario en &amp;lt;math&amp;gt; x = 1/2&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt; t \in [0, 1]&amp;lt;/math&amp;gt;, es decir &amp;lt;math&amp;gt;u(1/2, t) − v(1/2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
[[Archivo:SOFIACCT1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
x=0.5&lt;br /&gt;
# Definir la función de temperatura con un número limitado de términos en la serie&lt;br /&gt;
def u(x, t, alpha, n_terms=10):   &lt;br /&gt;
    sum_series = sum(2 * (-1)**(k + 1) / (k * np.pi) * np.sin(k * np.pi * x) * np.exp(-k**2 * np.pi**2 * alpha * t) for k in range(1, n_terms + 1))&lt;br /&gt;
    return  x - sum_series&lt;br /&gt;
# Intervalo de tiempo&lt;br /&gt;
t = np.linspace(0, 1, 100)&lt;br /&gt;
# Calcular la temperatura en x=1/2 para diferentes alphas&lt;br /&gt;
u_k1 = u(0.5, t, alpha=1)-x  # D=1, correspondiente a alpha=1&lt;br /&gt;
u_k_half = u(0.5, t, alpha=0.5)-x  # D=1/2, correspondiente a alpha=0.5&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.plot(t, u_k1, label='k=1', color='blue')&lt;br /&gt;
plt.plot(t, u_k_half, label='k=1/2', color='red')&lt;br /&gt;
plt.xlabel('Tiempo (s)')&lt;br /&gt;
plt.ylabel('u(1/2, t) − v(1/2)')&lt;br /&gt;
plt.title('Efecto del Coeficiente de Conductividad Térmica ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El coeficiente de conductividad térmica juega un papel fundamental en determinar la velocidad a la que se propaga la temperatura dentro de un material. Al disminuir este coeficiente a la mitad, el proceso de conducción térmica a través de la varilla experimenta una notable ralentización. Esto se traduce en que, en cualquier instante dado t, la distribución de la temperatura a lo largo de la varilla VA avanzando a la mitad de velocidad en comparación con un escenario donde el coeficiente de conductividad térmica es de 1. Dicho cambio incide directamente en la rapidez con que se logra el equilibrio térmico en la varilla, Resultando en una difusión térmica más lenta hacia el equilibrio.&lt;br /&gt;
&lt;br /&gt;
== Cambio de condiciones ==&lt;br /&gt;
Supongamos ahora una barra unidimensional con extremos fijos a una temperatura de &amp;lt;math&amp;gt;0^\circ C&amp;lt;/math&amp;gt;. La temperatura inicial en cualquier punto de la barra está dada por la función &amp;lt;math&amp;gt;u(x,0) = max\{0, 1−4|x−1/2|\}&amp;lt;/math&amp;gt;, lo que significa que inicialmente la temperatura en la barra varía de acuerdo con esta función.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = max\{0, 1−4|x−1/2|\}, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Supongamos que, en tiempo infinito, \( t \rightarrow \infty \), se llega a una solución estacionaria y que, por tanto, ya no varía en tiempo. De modo, que tomando esta suposición llegamos al siguiente sistema con \( u(x,t) \xrightarrow{\text{t tiende a }\infty} v(x) \).&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;v_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,   \\&lt;br /&gt;
&amp;amp;v(0) = 0, &amp;amp; \\&lt;br /&gt;
&amp;amp;v(1) = 0, &amp;amp;  &lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuya solución es la constante \( v(x)=0 \). De modo que el sistema homogeneizado, coincide con el original, pues \( w(x,t)=u(x,t)-v(x) =u(x,t)-0=u(x,t)\) &lt;br /&gt;
Antes de exigir la condición inicial, la solución coincide con la del primer apartado, pues nos encontramos ante la misma ecuación diferencial, salvo por la función \( u(x,0)\), la cual no toma parte hasta el final de la resolución de esta suponiendo separación de variables. De modo que&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t) = \sum_{k=1}^{\infty} C_k  e^{(-k^2\pi ^2 t )}\sin(k \pi  x)&amp;lt;/math&amp;gt; &lt;br /&gt;
Para hallar el valor de los coeficientes &amp;lt;math&amp;gt; C_k&amp;lt;/math&amp;gt;, buscamos la serie de Fourier de la función &amp;lt;math&amp;gt; max\{0, 1−4|x−1/2|\}&amp;lt;/math&amp;gt; extendida de forma impar. Esto es posible, ya que&lt;br /&gt;
:&amp;lt;math&amp;gt; \int^1_0 (max\{0, 1−4|x−1/2|\})^2 dx=0.1667 &amp;lt; \infty&amp;lt;/math&amp;gt;  &lt;br /&gt;
El cálculo de los coeficientes se ha realizado numéricamente aproximando por la fórmula del trapecio. Los coeficientes se pueden consultar ejecutando el siguiente código en Python&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np &lt;br /&gt;
def f(x):   # Defino función que se quiere aproximar&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x):&lt;br /&gt;
    coefficients = np.zeros(n) # Guardo los coeficientes en una lista&lt;br /&gt;
    for k in range(1,n+1):     # Compiezo en k=1, pues sin(0)=0&lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients&lt;br /&gt;
&lt;br /&gt;
fourier_coefficients(f, 10, np.linspace(0, 1, 1000))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
De modo que ya se ha calculado la solución de este nuevo problema. Visualmente, responde a la siguiente gráfica, resultado de ejecutar este código:&lt;br /&gt;
[[Archivo:Solucion_Celia.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)    # Generar una cuadrícula de puntos&lt;br /&gt;
&lt;br /&gt;
def f(x):    # Defino mi función condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x): # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    coefficients = np.zeros(n)&lt;br /&gt;
    for k in range(1,n+1):         # Comenzamos en 1, pues sen(0)=0&lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients.tolist()   # Convertir a lista&lt;br /&gt;
coef=fourier_coefficients(f, N, x)&lt;br /&gt;
&lt;br /&gt;
def u(x, t, n): # Definir la solución en términos de la serie de Fourier con N términos&lt;br /&gt;
    sum = 0                 # Almacenamos la suma (resultado) hasta el término 10&lt;br /&gt;
    for k in range(1, n+1): # Para cada k calculo el lambda y sumo su coeficiente respectivo&lt;br /&gt;
        lambda_k = k* np.pi&lt;br /&gt;
        sum += coef[k-1] * np.sin(lambda_k * x) * np.exp(-lambda_k**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
Z = u(X, T, N) # Calcular los valores de la función para cada par (x, t)&lt;br /&gt;
&lt;br /&gt;
# Graficar la función en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))  # Cambio aquí para hacer la figura más grande&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z,cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x [m]')&lt;br /&gt;
ax.set_ylabel('Tiempo t [s]')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) [ºC]')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)  #Añado una guía de colores&lt;br /&gt;
surf.set_clim(0, 1)                       # Le introduzco cota inf/sup a los colores&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
​[[Archivo:gifcelia.gif|400px|right|]]&lt;br /&gt;
Vemos como la temperatura sufre una gran variación en tiempos cercanos a 0, y rápidamente tiende a su estado estacionario, &amp;lt;math&amp;gt;v(x)=0&amp;lt;/math&amp;gt;. Para poder visualizarlo mejor mostraremos una un gif donde la imagen cambia a medida que el tiempo pasa, restringido a &amp;lt;math&amp;gt;t \in [0,0.3]&amp;lt;/math&amp;gt;, pues a partir de ahí, la temperatura está suficientemente cerca de la estacionaria y, por tanto, no hay gran variación en la temperatura.&lt;br /&gt;
&lt;br /&gt;
En un inicio, en \(t=0\) la temperatura toma valores negativos. Esto debido a que la exponencial se anula y son los coeficientes de Fourier quienes exigen el signo de la función. Una vez que &amp;lt;math&amp;gt;t&amp;gt;0&amp;lt;/math&amp;gt;, u se hace positivo en todas partes, lo que significa que la temperatura se difunde casi instantáneamente a lo largo del eje x, resultando en una velocidad de propagación infinita. Es decir, cualquier perturbación se siente enseguida en toda parte del dominio.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Terminamos el estudio de esta ecuación de difusión con el estudio del flujo, la inversa de la variación de la variable x de la solución. Para ello derivamos la solución que hemos obtenido. En términos de &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;, puesto que no son dependientes de x, obtenemos:&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{\partial}{\partial x}u(x,t)=\sum_{k=1}^{\infty} C_k  e^{(-k^2\pi ^2 t )}\cos(k \pi  x)\frac{1}{k \pi}&amp;lt;/math&amp;gt; como flujo de la ecuación homogénea. Adjuntamos el código con el cual se ha calculado la expresión de forma numérica y su respectiva representación gráfica:&lt;br /&gt;
[[Archivo:Flujo_Celia.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino la función de la ci para hallar los coef&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x): # Hallo los coef de Fourier  &lt;br /&gt;
    coefficients = np.zeros(n)&lt;br /&gt;
    for k in range(1,n+1): &lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients.tolist()   # Convertir a lista&lt;br /&gt;
coef=fourier_coefficients(f, N, x)&lt;br /&gt;
&lt;br /&gt;
def u(x, t, n):  # Definir la derivada en términos de la serie de Fourier con N términos&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, n+1):&lt;br /&gt;
        lambda_k = k* np.pi&lt;br /&gt;
        sum += coef[k-1] *np.cos(k * np.pi * x)/(k * np.pi) * np.exp(-lambda_k**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
# Graficamos&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(t, u(0,t,N), label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t, u(1,t,N), label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Observamos dos casos parecidos: Uno desciende hasta alcanzar el 0 (rojo) y otro asciende (azul). El primer caso, un flujo positivo que disminuye a cero, significa que el calor está siendo transferido a lo largo de la varilla en una dirección específica, pero la velocidad de transferencia de calor disminuye gradualmente hasta que alcanza cero, lo que indica un equilibrio térmico en la varilla. En el segundo caso, el flujo de calor comienza siendo negativo y alcanza cero, esto implicaría que al principio está ocurriendo una pérdida de calor en la dirección específica a lo largo de la varilla, pero esta pérdida disminuye hasta que se detiene completamente.&lt;br /&gt;
&lt;br /&gt;
==Varilla con extremo aislado==&lt;br /&gt;
En este estudio modelamos la difusión del calor en un alambre. Inicialmente, consideramos un alambre con una temperatura inicial de \( 0^\circ C \) en su extremo izquierdo. En contraste, el extremo derecho del alambre está aislado térmicamente, lo que significa que no hay transferencia de calor a través de este. En nuestro análisis, introducimos una fuente de calor en el centro del alambre en el instante inicial. Luego, examinamos cómo se propaga y se distribuye esta fuente de calor a lo largo del alambre con el tiempo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u_x(1, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = max\{0, 1−4|x−1/2|\}, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que la barra se encuentra aislada térmicamente en su extremo en \( x = 1 \) implica que no hay flujo de calor a través de este extremo. La ley de Fick, establece que el flujo de calor es proporcional al gradiente de temperatura según la ecuación \( q = -k \frac{du}{dx} \), donde \( q \) es el flujo de calor, \( k \) es la conductividad térmica y \( \frac{du}{dx} \) es el gradiente de temperatura a lo largo de la barra. En este contexto, si el flujo en dicho extremo es nulo, el gradiente de temperatura es nulo, por tanto  \( u_x(1, t) = 0 \). Observamos además que la solución estacionaria en nuestro caso es \( v(x) = 0 \), pues es la solución del problema de contorno.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
v''(x) = 0, \quad v(0) = 0, \quad v'(1) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De forma análoga a como ocurría en el apartado anterior, el problema que estamos estudiando en este caso es homogéneo. Por tanto, sin necesidad de hacer ningún cambio, procedemos a resolverlo mediante el método de separación de variables. Suponiendo que \( u(x, t) = X(x) \cdot T(t) \). Obtenemos como solución \( X(x) = A \sin(\pi(1/2+k)x) \) y \( T(t) = B e^{-(\pi^2)(1/2+k)^2 t} \). De modo que, la solución sin tener en cuenta la condición inicial es:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u_k(x, t) = c_k \cdot \sin(\pi(1/2+k)x) \cdot e^{-(\pi^2)(1/2+k)^2 t}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Para asegurar la existencia de solución del problema, es necesario verificar si existen ciertos coeficientes \( c_k \) tal que la solución pueda ser definida como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, t) = \sum_{k=0}^{\infty} c_k \cdot \sin(\pi(1/2+k)x) \cdot e^{-(\pi^2)(1/2+k)^2 t}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Para ello, es necesario verificar que las autofunciones \( \{\sin(\pi(1/2+k)x)\}_{k=0}^{\infty} \) forman un conjunto completo en \( L^2 [0, 1]\)  y ortogonal.&lt;br /&gt;
 &lt;br /&gt;
Para comprobar la ortogonalidad entre las autofunciones, calculamos la integral de su producto, o lo que es igual a calcular el producto escalar de \( L^2 [0,1]\), para dos funciones distintas \( \sin(\pi(1/2+k)x) \) y \( \sin(\pi(1/2+m)x) \) con \( k \neq m \in \mathbb{N}\):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{1} \sin(\pi(1/2+k)x) \sin(\pi(1/2+m)x) \, dx = \frac{\sin((k - m) \pi)}{2 (k - m) \pi} - \frac{\sin((1 + k + m) \pi)}{2 (1 + k + m) \pi}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Esta integral se anula para \( k,m \in  \mathbb{N} \), lo que demuestra que las autofunciones son ortogonales entre sí en el intervalo \([0, 1]\).&lt;br /&gt;
Por otro lado, dado que demostrar que las funciones forman una base completa para el espacio \( L^2[0,1] \) puede ser un proceso complejo y requiere un análisis detallado, en este trabajo supondremos que la forman.&lt;br /&gt;
[[Archivo:Solucion_Pablo.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)    # Generar una cuadrícula de puntos&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino mi fucnión condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficient(f, k, x):  # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    ck = 2* np.trapz(f(x) * np.sin(np.pi*(1/2+k)*x) ,x)&lt;br /&gt;
    return ck&lt;br /&gt;
&lt;br /&gt;
# Definir la solución en términos de la serie de Fourier con N términos&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0                 # Almacenamos la suma hasta el término 10&lt;br /&gt;
    for k in range(0, N+1): # Para cada k cálculo su coeficiente y lo sumo al resultado&lt;br /&gt;
        ck = fourier_coefficient(f, k, x)&lt;br /&gt;
        sum += ck * np.sin(np.pi*(1/2+k)*x) * np.exp(-(np.pi**2)*(1/2+k)**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Z = u(X, T, N)  # Calcular los valores de la función para cada par (x, t)&lt;br /&gt;
&lt;br /&gt;
# Graficar la función en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z,cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x [m]')&lt;br /&gt;
ax.set_ylabel('Tiempo t [s]')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) [ºC]')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)  #Añado una guía de colores&lt;br /&gt;
surf.set_clim(0, 1)                       # Le introduzco cota inf/sup a los colores&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gracias a los desarrollos en serie de Fourier, podemos calcular los coeficientes \( c_k \) para cumplir así la condición inicial. Dichos coeficientes se calculan mediante la integral:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_k := \frac{\int_{0}^{1} \max\{0, 1 - 4(x - 1/2)\} \sin(\pi(1/2+k)x) \, dx}{\int_{0}^{1} \sin^2(\pi(1/2+k)x) \, dx}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Dado que la integral es difícil de calcular analíticamente y en consecuencia es difícil obtener una expresión dependiente del parámetro &amp;lt;math&amp;gt; k&amp;lt;/math&amp;gt;, la resolveremos de forma numérica mediante el método del trapecio, de forma análoga a como se hizo en el modelo sin aislante térmico previo.&lt;br /&gt;
Para una comprensión más completa de la evolución de la temperatura del alambre en cuestión, es importante realizar un análisis visual de la solución propuesta. La representación gráfica de la solución en el intervalo de tiempo \( t \in [0, 1] \), considerando los primeros 10 términos de la serie de Fourier, ofrece una visualización tridimensional de la distribución del calor a lo largo del alambre en función del tiempo.&lt;br /&gt;
 &lt;br /&gt;
Es relevante destacar que a medida que transcurre el tiempo, la solución converge gradualmente hacia su estado estacionario, es decir, \(  v(x)=0 \) . Además, observamos que se verifica el principio del máximo, dado que tanto la temperatura máxima y mínima se alcanza en la frontera parabólica.&lt;br /&gt;
Esta última afirmación la podemos verificar de forma sencilla, obteniendo ambos valores de la función. El código utilizado mostró los siguientes datos.&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# Calcular la temperatura máxima y mínima&lt;br /&gt;
max_temperature = np.max(Z)&lt;br /&gt;
min_temperature = np.min(Z)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Temperatura máxima:&amp;quot;, max_temperature)&lt;br /&gt;
print(&amp;quot;Temperatura mínima:&amp;quot;, min_temperature)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Encontrar las coordenadas donde se alcanza la temperatura máxima y mínima&lt;br /&gt;
max_index = np.unravel_index(np.argmax(Z), Z.shape)&lt;br /&gt;
min_index = np.unravel_index(np.argmin(Z), Z.shape)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
max_x, max_t = x_values[max_index[1]], t_values[max_index[0]]&lt;br /&gt;
min_x, min_t = x_values[min_index[1]], t_values[min_index[0]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Coordenadas de la temperatura máxima: (x={}, t={})&amp;quot;.format(max_x, max_t))&lt;br /&gt;
print(&amp;quot;Coordenadas de la temperatura mínima: (x={}, t={})&amp;quot;.format(min_x, min_t))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Resultados de temperatura máxima y mínima&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parámetro!! Valor&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura máxima|| \(0.92 ^\circ \text{C}\)&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura mínima|| \(-0.03 ^\circ \text{C}\)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Coordenadas de temperatura máxima y mínima&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Coordenadas !! Valor&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura máxima|| \((x=0.50, t=0.00)\)&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura mínima|| \((x=0.81, t=0.00)\)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Observamos que el máximo debería ser de &amp;lt;math&amp;gt; 1^\circ \text{C} &amp;lt;/math&amp;gt;. No obstante, el resultado reportado por el código es &amp;lt;math&amp;gt; 0.92 ^\circ \text{C} &amp;lt;/math&amp;gt;. Esto se debe al uso de la aproximación por series de Fourier. Lo mismo ocurre con el valor mínimo que debería se de &amp;lt;math&amp;gt; 0^\circ \text{C} &amp;lt;/math&amp;gt;, no obstante el código reporta &amp;lt;math&amp;gt;-0.03^\circ \text{C} &amp;lt;/math&amp;gt;. Además dichos puntos están en la frontera parabólica, como afirma el principio del máximo. &lt;br /&gt;
&lt;br /&gt;
En este punto es interesante verificar si nuestro modelo es correcto. En tal caso, el extremo izquierdo de la barra no debería perder calor. Por lo tanto, calculamos la derivada de nuestra expresión y, gracias a la Ley de Fick, sabemos que el flujo de calor es igual a la derivada cambiada de signo. Obtenemos los siguientes resultados:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Flujo_Pablo.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 100     # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x_values = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t_values = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino mi función condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficient(f, k, x):   # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    ck = 2* np.trapz(f(x) * np.sin(np.pi*(1/2+k)*x) ,x)&lt;br /&gt;
    return ck&lt;br /&gt;
&lt;br /&gt;
def derivative_solution_x(x, t, N): # Definir la derivada de la solución respecto a x&lt;br /&gt;
    result = 0&lt;br /&gt;
    for k in range(0, N+1):&lt;br /&gt;
        ck = fourier_coefficient(f, k, x_values)&lt;br /&gt;
        result += ck * np.pi * (1/2 + k) * np.cos(np.pi * (1/2 + k) * x) * np.exp(-1 * (np.pi**2) * (1/2 + k)**2 * t)&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
# Calcular la derivada de la solución respecto a x para los extremos x=0 y x=1 a lo largo del tiempo&lt;br /&gt;
flux_x0 = [-derivative_solution_x(0, t, N) for t in t_values]&lt;br /&gt;
flux_x1 = [-derivative_solution_x(1, t, N) for t in t_values]&lt;br /&gt;
&lt;br /&gt;
# Graficar el flujo en los extremos x=0 y x=1 a lo largo del tiempo&lt;br /&gt;
plt.figure(figsize=(8, 5))&lt;br /&gt;
plt.plot(t_values, flux_x0, label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t_values, flux_x1, label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Observamos que todo el calor aportado en el instante inicial se disipa completamente por la izquierda de la varilla, ya que el flujo en &amp;lt;math&amp;gt; x=1&amp;lt;/math&amp;gt; es nulo, verificando así las condiciones fronteras de nuestro problema.&lt;br /&gt;
&lt;br /&gt;
==Solución fundamental==&lt;br /&gt;
La solución fundamental de la ecuación del calor es una función que describe la distribución de temperatura en un medio en función del tiempo y la posición. Para la ecuación del calor unidimensional, la solución fundamental está dada por la fórmula:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\phi(x, t) = \frac{1}{2 \sqrt{\pi t}} \exp\left(-\frac{x^2}{t}\right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
La solución fundamental describe cómo el calor se propaga y difunde a lo largo del medio a medida que pasa el tiempo, en este caso, por ejemplo, el calor en un alambre. Además la solución general del problema de Cauchy es la solución fundamental de la ecuación del calor.&lt;br /&gt;
El problema de Cauchy es el siguiente:&lt;br /&gt;
Dada la ecuación diferencial parcial:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u_t = k \cdot u_{xx},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
junto con las siguientes condiciones iniciales:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, 0) = f(x)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
donde \( f(x) \) es una función dada en el dominio \( 0 \leq x \leq L \) y \( k \) es una constante positiva que representa la difusividad térmica del medio.&lt;br /&gt;
Para resolver el problema de Cauchy para la ecuación del calor es mediante el uso de la solución fundamental y la técnica de convolución. La solución fundamental \( \phi(x, t) \) de la ecuación del calor es una función especial que satisface la ecuación diferencial parcial y las condiciones iniciales dadas.&lt;br /&gt;
 &lt;br /&gt;
Para resolver el problema de Cauchy, podemos utilizar la solución fundamental \( \phi(x, t) \) en combinación con la función inicial \( u_0(x) \) para obtener la solución general \( u(x, t) \) en cualquier instante de tiempo \( t \). Esto se logra convolucionando la función inicial \( f(x) \) con la solución fundamental \( \phi(x, t) \) .&lt;br /&gt;
La solución \( u(x, t) \) del problema de Cauchy se puede expresar como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, t) = \int_{-\infty}^{\infty} \phi(x - y, t) f(y) \, dy&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
En primer lugar, procederemos a visualizar una representación tridimensional de la solución fundamental  \( \phi(x, t) \).&lt;br /&gt;
[[Archivo:Solfundi.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Definir la función que representa la solución fundamental de la ecuación del calor&lt;br /&gt;
def phi(x, t):&lt;br /&gt;
    return 1 / (2 * np.sqrt(np.pi * t)) * np.exp(-x**2 / t)&lt;br /&gt;
&lt;br /&gt;
# Definir los valores de x y t para la gráfica&lt;br /&gt;
x_values = np.linspace(-1, 1, 100)    # Valores de x&lt;br /&gt;
t_values = np.linspace(0.01, 1, 200)  # Valores de t (tiempo)&lt;br /&gt;
&lt;br /&gt;
# Crear una malla de valores de x y t&lt;br /&gt;
X, T = np.meshgrid(x_values, t_values)&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución fundamental para cada par de valores (x, t)&lt;br /&gt;
Z = phi(X, T)&lt;br /&gt;
&lt;br /&gt;
# Crear una figura en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
# Graficar la superficie 3D&lt;br /&gt;
surf = ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
# Etiquetas y título con el símbolo de &amp;quot;phi&amp;quot;&lt;br /&gt;
ax.set_xlabel(r'$x$')&lt;br /&gt;
ax.set_ylabel(r'$t$')&lt;br /&gt;
ax.set_zlabel(r'$\phi(x, t)$')&lt;br /&gt;
ax.set_title(r'Solución fundamental de la ecuación del calor: $\phi(x, t)$')&lt;br /&gt;
&lt;br /&gt;
# Añadir una barra de colores para indicar los valores de Z&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=8)&lt;br /&gt;
plt.show()    # Mostrar la gráfica&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
En esta ocasión veremos la solución de la ecuación del calor \( u_t - u_{xx} = 0 \) en \( x \in \mathbb{R} \) asociada al dato inicial \( f(x) = 1_{[-1,1]} \), viene dada por la convolución:&lt;br /&gt;
 &lt;br /&gt;
:&amp;lt;math&amp;gt; u(x, t) = \int_{-\infty}^{\infty} \phi(x - y, t) f(y) \, dy = \int_{-\infty}^{\infty} \frac{1}{2 \sqrt{\pi t}} \exp\left(-\frac{(x-y)^2}{t}\right) 1_{[-1,1]} \, dy &amp;lt;/math&amp;gt;&lt;br /&gt;
Dibujaremos la solución en diferentes instantes de tiempo: \( t = 0.001 \), \( t = 0.01 \) , \( t = 0.1 \), \( t = 1 \).  Aproximaremos la integral indefinida utilizando la fórmula del trapecio.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Soluciondiferentet.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Definir la solución fundamental&lt;br /&gt;
def phi(x, t):&lt;br /&gt;
    return 1 / np.sqrt(4 * np.pi * t) * np.exp(-x**2 / (4 * t))&lt;br /&gt;
&lt;br /&gt;
def u0(x):&lt;br /&gt;
    return np.where(np.logical_and(x &amp;gt;= -1, x &amp;lt;= 1), 1, 0)&lt;br /&gt;
&lt;br /&gt;
# Definir el intervalo espacial y los instantes de tiempo&lt;br /&gt;
x = np.linspace(-5, 5, 1000)  # Valores de x&lt;br /&gt;
t_values = [0.001, 0.01, 0.1, 1]  # Valores de t (instantes de tiempo)&lt;br /&gt;
&lt;br /&gt;
# Crear una nueva figura para la gráfica&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
# Calcular y graficar la solución para diferentes instantes de tiempo&lt;br /&gt;
for t in t_values:&lt;br /&gt;
    u_x_t = []&lt;br /&gt;
    for xi in x:&lt;br /&gt;
        # Utilizar np.trapz para calcular la solución integral de la ecuación del calor&lt;br /&gt;
        u_x_t.append(np.trapz(phi(xi - x, t)*u0(x), x))&lt;br /&gt;
    plt.plot(x, u_x_t, label=f't = {t}')&lt;br /&gt;
&lt;br /&gt;
# Etiquetas y título de la gráfica&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('u(x, t)')&lt;br /&gt;
plt.title(f'Solución de $u_t - uxx = 0$ en x ∈ R con u0 (x) = [-1,1] en diferentes instantes de tiempo (usando numpy.trapz)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Por último, la metodología para calcular la solución fundamental de la ecuación del calor es flexible cuando se trata de incorporar condiciones de contorno. Supongamos que deseamos calcular una solución para la ecuación del calor en una dimensión en el semiespacio donde \( x &amp;gt; 0 \), satisfaciendo las condiciones \( u(0, t) = 1 \), \( u(x, t) \rightarrow 0 \) cuando \( x \rightarrow \infty \) y \( u(x, 0) = 0 \) para \( x &amp;gt; 0 \). Podemos modificar la solución fundamental de manera que satisfaga estas condiciones. Al hacerlo, obtenemos la expresión \( u(x,t) = -\text{erf}\left(\frac{x}{2 \cdot \sqrt{t}}\right) + 1 \), donde \( \text{erf}(x) = \frac{2}{\sqrt{\pi}} \int_{0}^{x} e^{-z^2} \, dz \). Esta expresión ajustada permite obtener la solución deseada que cumple con las condiciones de contorno especificadas.&lt;br /&gt;
&lt;br /&gt;
==Solución fundamental dimensión 2==&lt;br /&gt;
&lt;br /&gt;
Veamos el problema de Cauchy para la ecuación del calor en dos dimensiones (\( x_1, x_2 \) y \( t \)). Sea \( u(x_1, x_2, t) \) la función de temperatura en un medio bidimensional, que satisface la ecuación del calor:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u_t = k(u_{x_1 x_1} + u_{x_2 x_2})&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Con las condiciones iniciales dadas por la temperatura inicial \( u(x_1, x_2, 0) = f(x_1, x_2) \) para algún campo de temperatura dado \( f(x_1, x_2)  \text{para} (x_1, x_2) \in \partial \Omega \), donde \( \Omega \) es el dominio bidimensional sobre el cual se define la temperatura.&lt;br /&gt;
La solución general a este problema (sin contar la condición inicial) viene dada por la siguiente expresión: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\phi(x_1, x_2, t) = \frac{1}{4 \pi t} \exp\left( -\frac{x_1^2 + x_2^2}{4t} \right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Procederemos ahora a representar la solución fundamental, donde veremos un gráfico tridimensional, &amp;lt;math&amp;gt; x_1, x_2, \phi(x_1, x_2, t) &amp;lt;/math&amp;gt; donde se ha fijado un tiempo t.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:gifgif.gif|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Definir la solución fundamental en 2D&lt;br /&gt;
def phi_2D(x1, x2, t):&lt;br /&gt;
    if t == 0:&lt;br /&gt;
        return np.zeros_like(x1)  # Devuelve una matriz de ceros si t es cero&lt;br /&gt;
    else:&lt;br /&gt;
        return 1 / (4 * np.pi * t) * np.exp(-(x1**2 + x2**2) / (4 * t))&lt;br /&gt;
&lt;br /&gt;
# Definir el intervalo espacial&lt;br /&gt;
x1_values = np.linspace(-1, 1, 100)  # Valores de x1&lt;br /&gt;
x2_values = np.linspace(-1, 1, 100)  # Valores de x2&lt;br /&gt;
x1, x2 = np.meshgrid(x1_values, x2_values)  # Malla de valores de x1 y x2&lt;br /&gt;
&lt;br /&gt;
# Definir los tiempos&lt;br /&gt;
t_values = np.linspace(0, 0.1, 3)  # Valores de tiempo&lt;br /&gt;
&lt;br /&gt;
# Tamaño de la figura&lt;br /&gt;
fig = plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
# Graficar la solución fundamental en 2D para cada tiempo&lt;br /&gt;
for i, t in enumerate(t_values, 1):&lt;br /&gt;
    ax = fig.add_subplot(1, len(t_values), i, projection='3d')&lt;br /&gt;
    phi = phi_2D(x1, x2, t)&lt;br /&gt;
    ax.plot_surface(x1, x2, phi, cmap='viridis')&lt;br /&gt;
    ax.set_title(f'Tiempo $t=${round(t, 3)}')&lt;br /&gt;
    ax.set_xlabel('x1')&lt;br /&gt;
    ax.set_ylabel('x2')&lt;br /&gt;
    ax.set_zlabel('phi(x1, x2, t)')&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor(Grupo_Eau_De_Parfum(EDP)))&amp;diff=70126</id>
		<title>Ecuación del calor(Grupo Eau De Parfum(EDP)))</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor(Grupo_Eau_De_Parfum(EDP)))&amp;diff=70126"/>
				<updated>2024-03-07T19:08:06Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Solución fundamental */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del Calor. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
==Introducción==&lt;br /&gt;
&lt;br /&gt;
==Conocimientos previos==&lt;br /&gt;
Antes de comenzar será de gran ayuda introducir una serie de conceptos que utilizaremos a lo largo este trabajo:&lt;br /&gt;
&lt;br /&gt;
*'''Ley del calor de Newton''': describe la tasa de pérdida o ganancia de calor de un objeto en relación con el ambiente circundante.La ley se expresa comúnmente como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d T(t)}{d t} = - k (T(t) - T_{\mathrm{a}}) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
siendo &amp;lt;math&amp;gt;T(t) &amp;lt;/math&amp;gt;la temperatura del objeto en un tiempo dado, &amp;lt;math&amp;gt;T_{\mathrm{a}}&amp;lt;/math&amp;gt; la temperatura ambiente y &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; la constante de proporcionalidad.&lt;br /&gt;
&lt;br /&gt;
*'''Principio de conservación de la energía calorífica''': establece que la variación de energía calorífica sobre un cuerpo V se debe al balance entre el calor que entra y sale del cuerpo más una producción externa.&lt;br /&gt;
&lt;br /&gt;
*'''Ley de Fourier''':intaura que el calor fluye desde regiones de alta temperatura a regiones de baja temperatura, y la cantidad de flujo de calor depende de la diferencia de temperatura y las propiedades del material.La expresión matemática de la Ley de Fourier es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{q}  = - k {\nabla} T &amp;lt;/math&amp;gt;,   &lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
donde &amp;lt;math&amp;gt; \mathbf{q}&amp;lt;/math&amp;gt; es el vector de flujo de calor por unidad de superficie y &amp;lt;math&amp;gt;  {\nabla} T &amp;lt;/math&amp;gt; es el gradiente del campo de temperatura en el interior del material.&lt;br /&gt;
*'''Coeficiente de conductividad térmica (D)''':cuantifica la capacidad de un material para conducir el calor. Se define como la cantidad de calor que pasa en un segundo a través de un metro cuadrado de material cuando la diferencia de temperatura a través del material,cuando la diferencia de temperatura a través del material es de un grado(ºC) es de un grado, y el espesor del material es de un metro.&lt;br /&gt;
*'''Principio del máximo''': Sea &amp;lt;math&amp;gt;u \in C^{2,1}(Q_T)\cap (\overline{Q_T})&amp;lt;/math&amp;gt; tal que  &amp;lt;math&amp;gt;u_t - \Delta u \leq 0&amp;lt;/math&amp;gt; en &amp;lt;math&amp;gt;Q_T&amp;lt;/math&amp;gt;. Entonces u alcanza su máximo en la frontera parabólica &amp;lt;math&amp;gt;\partial _p Q_T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\max_{\overline{Q_T}} u = \max_{\partial _p Q_T} u&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nuestro problema original ==&lt;br /&gt;
Consideramos una varilla metálica de 1 metro de longitud , que se encuentra aislada por su superficie lateral, de manera que la conducción de calor únicamente se produce en la dirección longitudinal. La temperatura inicial de la varilla es de 0ºC. En el extremo izquierdo se consigue mantener la temperatura a 0 ºC mientras que en el derecho la temperatura es siempre de 1 ºC. Además  el calor específico toma un valor constante de 1.En cuanto al coeficiente de conductividad térmica,vamos a observar cómo sería nuestro problema para un valor cualquiera y seguidamente especificaremos el valor constante de 1.&lt;br /&gt;
&lt;br /&gt;
Pero antes de abordar matemáticamente nuestro problema, vamos a intentar deducir lo que podría ocurrir. Considerando que la temperatura en el extremo derecho de la varilla es superior a la del extremo izquierdo, el calor comenzará a transferirse desde la zona más cálida, elevando la temperatura a lo largo de la varilla y promoviendo el desplazamiento del calor hacia la región más fría. Simultáneamente, el incremento de la temperatura interna provoca una reducción del flujo de calor entrante y a un aumento del saliente con el tiempo. Anticipamos que, en algún momento, ambos flujos se equilibrarán, conduciendo la temperatura de la varilla a un estado estacionario.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por lo que nuestro problema a resolver queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - Du_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Debemos reescalar en tiempo, para facilitarnos los cálculos, por lo que realizamos el cambio de variable  &amp;lt;math&amp;gt;\tau = \alpha t, \tau \in\mathbb{R} &amp;lt;/math&amp;gt;. Por tanto,  &amp;lt;math&amp;gt; u(x,t)=U(x,\tau)&amp;lt;/math&amp;gt; y entonces &amp;lt;math&amp;gt; \alpha U_{\tau}-DU_{xx}=0&amp;lt;/math&amp;gt; .Tomando &amp;lt;math&amp;gt; \alpha = D&amp;lt;/math&amp;gt; , obtenemos el problema &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;U_{\tau} - U_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(0, \tau) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(1, \tau) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Este problema se resuelve mediante el método de variación de las constantes, pero un factor clave para su implementación es que las condiciones de contorno estén homogeneizadas, es decir, que sean igual a cero. Esto se conseguirá mediante un cambio de variable, en el que es imprescindible la llamada solución estacionaria.&lt;br /&gt;
La solución estacionaria de nuestro problema es aquella que no varía con el tiempo &amp;lt;math&amp;gt; v=\lim_{t \to \infty} U(x,\tau)&amp;lt;/math&amp;gt;y por tanto, su derivada  respecto al tiempo es nula. Nuestro sistema queda ahora:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;-v_{xx}   = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, \\&lt;br /&gt;
&amp;amp;v(0)= 0 \\&lt;br /&gt;
&amp;amp;v(1) = 1, &lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Resolviendo obtenemos que &amp;lt;math&amp;gt; v(x)=x &amp;lt;/math&amp;gt; es nuestra solución estacionaria, cuya expresión gráfica es:&lt;br /&gt;
[[Archivo:sofiaest1.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import numpy as np&lt;br /&gt;
# Define el rango de x entre 0 y 1&lt;br /&gt;
x = np.linspace(0, 1, 100)  &lt;br /&gt;
# Define la función  estacionaria v(x) = x&lt;br /&gt;
v_x = x&lt;br /&gt;
# Crea la gráfica&lt;br /&gt;
plt.plot(x, v_x)&lt;br /&gt;
# Etiquetas de los ejes&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('v(x)')&lt;br /&gt;
# Título de la gráfica&lt;br /&gt;
plt.title('Gráfica de la solución estacionaria v(x)=x')&lt;br /&gt;
# Muestra la gráfica&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Una vez hallada la solución estacionaria, podemos homogeneizar nuestro problema mediante el cambio de variable &amp;lt;math&amp;gt;w(x,t)= U(x,\tau)-v(x)&amp;lt;/math&amp;gt;.Por tanto, sustituyendo en el sistema inicial obtenemos:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;w_{\tau} - w_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(0, \tau) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(1, \tau) = 1-1=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(x, 0) = 0-x=-x, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Nuestro sistema es ya homogéneo,por lo que aplicamos el método de separación de variables (que consiste en expresar la solución como el producto de una función que depende únicamente de la variable espacial x y una función dependiente de la variable temporal) y obtenemos como solución homogénea:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;w(x,\tau) =  \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 \tau}\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Y deshaciendo los dos cambios de variable, nuestra solución al problema original es por tanto:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 Dt }\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Como en nuestro caso, el coeficiente de conductividad térmica es igual a 1, nuestro sistema es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - Du_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
y nuestra solución:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 t }\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Mostramos gráficamente la solución, observando que se cumplen las condiciones de frontera y además según avanza el tiempo, la solución deja de depender del tiempo y alcanza un estado estacionario, determinado justamente por la solución estacionaria obtenida anteriormente, &amp;lt;math&amp;gt; v(x)=x &amp;lt;/math&amp;gt;. Cabe destacar que en &amp;lt;math&amp;gt; t=0 &amp;lt;/math&amp;gt;  obtenemos las oscilaciones correspondientes a la serie de Fourier de la condición inicial, que se aproxima mediante senos.&lt;br /&gt;
[[Archivo:SOFIASOL11.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
# Solución usando los primeros N términos de la serie&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculasmos los coeficientes C_k&lt;br /&gt;
        C_k = 2 * (-1)**(k) / (k * np.pi)  &lt;br /&gt;
        sum += C_k * np.sin(k*np.pi * x) * np.exp(-lambda_k * t*D) &lt;br /&gt;
    return x+sum&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
&lt;br /&gt;
# Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12,8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x (m)')&lt;br /&gt;
ax.set_ylabel('Tiempo t (s)')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) (ºC)')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Flujo===&lt;br /&gt;
Para estudiar el flujo de calor saliente y entrante en ambos extremos de la varilla a lo largo del tiempo, nos debemos basar en la ley de Fourier &amp;lt;math&amp;gt; \mathbf{q}  = - k  u_x(x,t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Por lo que necesitamos obtener la derivada de la solución con respecto al espacio:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(x,t)= 1+\sum_{k=1}^{\infty}(-1)^{k+1}2 e^{-k^2\pi ^2 t }\cos(k\pi  x) &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Ahora, el flujo en los extremos es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(0,t)=1 +\sum_{k=1}^{\infty}(-1)^{k+1}2 e^{-k^2\pi ^2 t } &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(1,t)=1+\sum_{k=1}^{\infty}2 e^{-k^2\pi ^2 t } &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Gráficamente,&lt;br /&gt;
[[Archivo:SOFIAFLUJO1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
# Derivada de nuestra solución respecto al espacio, multiplicado por -k&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculamos los coeficientes C_k mediante extensión impar&lt;br /&gt;
        C_k = 2 * (-1)**(k+1)  &lt;br /&gt;
        sum += C_k * np.cos(k*np.pi * x) * np.exp(-lambda_k * t) &lt;br /&gt;
    return 1+sum&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(t, u(0,t,N), label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t, u(1,t,N), label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Al comenzar con un flujo de calor nulo en el extremo izquierdo, esto  indica que hay una gran diferencia de temperatura entre ambos extremos de la varilla. El extremo izquierdo está perdiendo calor rápidamente hacia la zona más fría. A medida que el calor se va transfiriendo por la varilla, el gradiente de la temperatura cambia y el extremo derecho comienza a calentarse, debido al flujo de calor que proviene del otro extremo. Este cambio conduce a que el flujo en ambos extremos comience a estar en equilibrio. &lt;br /&gt;
Esta estabilización de flujo en -1 refleja que se ha alcanzado un estado estacionario en el sistema, indicando que cualquier calor entrante en la varilla, se compensa con el calor saliente, manteniendo una distribución de temperatura uniforme.&lt;br /&gt;
&lt;br /&gt;
Este comportamiento refleja la Ley de Fourier, donde al principio la gran diferencia de temperatura induce un flujo de calor bastante significativo, que se va estabilizando llegando a un flujo de -1 en ambos extremos, alcanzando así un gradiente de temperatura constante, con la misma cantidad de calor saliendo hacia fuera desde ambos extremos.&lt;br /&gt;
&lt;br /&gt;
==Cambio de coeficiente de conductividad térmica ==&lt;br /&gt;
Hemos estudiado el problema de Cauchy para un coeficiente de difusión de 1,veamos que ocurre si lo disminuimos a su mitad, es decir,&amp;lt;math&amp;gt;D=\frac{1}{2}&amp;lt;/math&amp;gt;.Nuestro nuevo problema por tanto es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - \frac{1}{2}u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuya solución es &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {\frac{-k^2\pi ^2 t}{2}}\sin(k\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gráficamente, únicamente hemos cambiado el valor de D en el código (2)  y obtenemos:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:SOFIASOL22.png|400px|thumb|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1/2       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
# Solución usando los primeros N términos de la serie&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculasmos los coeficientes C_k&lt;br /&gt;
        C_k = 2 * (-1)**(k) / (k * np.pi)  &lt;br /&gt;
        sum += C_k * np.sin(k*np.pi * x) * np.exp(-lambda_k * t*D) &lt;br /&gt;
    return x+sum&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
# Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12,8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
ax.set_xlabel('Posición x (m)')&lt;br /&gt;
ax.set_ylabel('Tiempo t (s)')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) (ºC)')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
No se puede apreciar ninguna diferencia aparente entre las soluciones para los diferentes coeficientes. Para observar algún cambio vamos a dibujar la diferencia entre la solución y el estado estacionario en &amp;lt;math&amp;gt; x = 1/2&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt; t \in [0, 1]&amp;lt;/math&amp;gt;, es decir &amp;lt;math&amp;gt;u(1/2, t) − v(1/2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
[[Archivo:SOFIACCT1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
x=0.5&lt;br /&gt;
# Definir la función de temperatura con un número limitado de términos en la serie&lt;br /&gt;
def u(x, t, alpha, n_terms=10):   &lt;br /&gt;
    sum_series = sum(2 * (-1)**(k + 1) / (k * np.pi) * np.sin(k * np.pi * x) * np.exp(-k**2 * np.pi**2 * alpha * t) for k in range(1, n_terms + 1))&lt;br /&gt;
    return  x - sum_series&lt;br /&gt;
# Intervalo de tiempo&lt;br /&gt;
t = np.linspace(0, 1, 100)&lt;br /&gt;
# Calcular la temperatura en x=1/2 para diferentes alphas&lt;br /&gt;
u_k1 = u(0.5, t, alpha=1)-x  # D=1, correspondiente a alpha=1&lt;br /&gt;
u_k_half = u(0.5, t, alpha=0.5)-x  # D=1/2, correspondiente a alpha=0.5&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.plot(t, u_k1, label='k=1', color='blue')&lt;br /&gt;
plt.plot(t, u_k_half, label='k=1/2', color='red')&lt;br /&gt;
plt.xlabel('Tiempo (s)')&lt;br /&gt;
plt.ylabel('u(1/2, t) − v(1/2)')&lt;br /&gt;
plt.title('Efecto del Coeficiente de Conductividad Térmica ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El coeficiente de conductividad térmica juega un papel fundamental en determinar la velocidad a la que se propaga la temperatura dentro de un material. Al disminuir este coeficiente a la mitad, el proceso de conducción térmica a través de la varilla experimenta una notable ralentización. Esto se traduce en que, en cualquier instante dado t, la distribución de la temperatura a lo largo de la varilla VA avanzando a la mitad de velocidad en comparación con un escenario donde el coeficiente de conductividad térmica es de 1. Dicho cambio incide directamente en la rapidez con que se logra el equilibrio térmico en la varilla, Resultando en una difusión térmica más lenta hacia el equilibrio.&lt;br /&gt;
&lt;br /&gt;
== Cambio de condiciones ==&lt;br /&gt;
Supongamos ahora una barra unidimensional con extremos fijos a una temperatura de &amp;lt;math&amp;gt;0^\circ C&amp;lt;/math&amp;gt;. La temperatura inicial en cualquier punto de la barra está dada por la función &amp;lt;math&amp;gt;u(x,0) = max\{0, 1−4|x−1/2|\}&amp;lt;/math&amp;gt;, lo que significa que inicialmente la temperatura en la barra varía de acuerdo con esta función.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = max\{0, 1−4|x−1/2|\}, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Supongamos que, en tiempo infinito, \( t \rightarrow \infty \), se llega a una solución estacionaria y que, por tanto, ya no varía en tiempo. De modo, que tomando esta suposición llegamos al siguiente sistema con \( u(x,t) \xrightarrow{\text{t tiende a }\infty} v(x) \).&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;v_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,   \\&lt;br /&gt;
&amp;amp;v(0) = 0, &amp;amp; \\&lt;br /&gt;
&amp;amp;v(1) = 0, &amp;amp;  &lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuya solución es la constante \( v(x)=0 \). De modo que el sistema homogeneizado, coincide con el original, pues \( w(x,t)=u(x,t)-v(x) =u(x,t)-0=u(x,t)\) &lt;br /&gt;
Antes de exigir la condición inicial, la solución coincide con la del primer apartado, pues nos encontramos ante la misma ecuación diferencial, salvo por la función \( u(x,0)\), la cual no toma parte hasta el final de la resolución de esta suponiendo separación de variables. De modo que&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t) = \sum_{k=1}^{\infty} C_k  e^{(-k^2\pi ^2 t )}\sin(k \pi  x)&amp;lt;/math&amp;gt; &lt;br /&gt;
Para hallar el valor de los coeficientes &amp;lt;math&amp;gt; C_k&amp;lt;/math&amp;gt;, buscamos la serie de Fourier de la función &amp;lt;math&amp;gt; max\{0, 1−4|x−1/2|\}&amp;lt;/math&amp;gt; extendida de forma impar. Esto es posible, ya que&lt;br /&gt;
:&amp;lt;math&amp;gt; \int^1_0 (max\{0, 1−4|x−1/2|\})^2 dx=0.1667 &amp;lt; \infty&amp;lt;/math&amp;gt;  &lt;br /&gt;
El cálculo de los coeficientes se ha realizado numéricamente aproximando por la fórmula del trapecio. Los coeficientes se pueden consultar ejecutando el siguiente código en Python&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np &lt;br /&gt;
def f(x):   # Defino función que se quiere aproximar&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x):&lt;br /&gt;
    coefficients = np.zeros(n) # Guardo los coeficientes en una lista&lt;br /&gt;
    for k in range(1,n+1):     # Compiezo en k=1, pues sin(0)=0&lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients&lt;br /&gt;
&lt;br /&gt;
fourier_coefficients(f, 10, np.linspace(0, 1, 1000))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
De modo que ya se ha calculado la solución de este nuevo problema. Visualmente, responde a la siguiente gráfica, resultado de ejecutar este código:&lt;br /&gt;
[[Archivo:Solucion_Celia.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)    # Generar una cuadrícula de puntos&lt;br /&gt;
&lt;br /&gt;
def f(x):    # Defino mi función condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x): # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    coefficients = np.zeros(n)&lt;br /&gt;
    for k in range(1,n+1):         # Comenzamos en 1, pues sen(0)=0&lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients.tolist()   # Convertir a lista&lt;br /&gt;
coef=fourier_coefficients(f, N, x)&lt;br /&gt;
&lt;br /&gt;
def u(x, t, n): # Definir la solución en términos de la serie de Fourier con N términos&lt;br /&gt;
    sum = 0                 # Almacenamos la suma (resultado) hasta el término 10&lt;br /&gt;
    for k in range(1, n+1): # Para cada k calculo el lambda y sumo su coeficiente respectivo&lt;br /&gt;
        lambda_k = k* np.pi&lt;br /&gt;
        sum += coef[k-1] * np.sin(lambda_k * x) * np.exp(-lambda_k**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
Z = u(X, T, N) # Calcular los valores de la función para cada par (x, t)&lt;br /&gt;
&lt;br /&gt;
# Graficar la función en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))  # Cambio aquí para hacer la figura más grande&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z,cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x [m]')&lt;br /&gt;
ax.set_ylabel('Tiempo t [s]')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) [ºC]')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)  #Añado una guía de colores&lt;br /&gt;
surf.set_clim(0, 1)                       # Le introduzco cota inf/sup a los colores&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
​[[Archivo:gifcelia.gif|400px|right|]]&lt;br /&gt;
Vemos como la temperatura sufre una gran variación en tiempos cercanos a 0, y rápidamente tiende a su estado estacionario, &amp;lt;math&amp;gt;v(x)=0&amp;lt;/math&amp;gt;. Para poder visualizarlo mejor mostraremos una un gif donde la imagen cambia a medida que el tiempo pasa, restringido a &amp;lt;math&amp;gt;t \in [0,0.3]&amp;lt;/math&amp;gt;, pues a partir de ahí, la temperatura está suficientemente cerca de la estacionaria y, por tanto, no hay gran variación en la temperatura.&lt;br /&gt;
&lt;br /&gt;
En un inicio, en \(t=0\) la temperatura toma valores negativos. Esto debido a que la exponencial se anula y son los coeficientes de Fourier quienes exigen el signo de la función. Una vez que &amp;lt;math&amp;gt;t&amp;gt;0&amp;lt;/math&amp;gt;, u se hace positivo en todas partes, lo que significa que la temperatura se difunde casi instantáneamente a lo largo del eje x, resultando en una velocidad de propagación infinita. Es decir, cualquier perturbación se siente enseguida en toda parte del dominio.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Terminamos el estudio de esta ecuación de difusión con el estudio del flujo, la inversa de la variación de la variable x de la solución. Para ello derivamos la solución que hemos obtenido. En términos de &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;, puesto que no son dependientes de x, obtenemos:&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{\partial}{\partial x}u(x,t)=\sum_{k=1}^{\infty} C_k  e^{(-k^2\pi ^2 t )}\cos(k \pi  x)\frac{1}{k \pi}&amp;lt;/math&amp;gt; como flujo de la ecuación homogénea. Adjuntamos el código con el cual se ha calculado la expresión de forma numérica y su respectiva representación gráfica:&lt;br /&gt;
[[Archivo:Flujo_Celia.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino la función de la ci para hallar los coef&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x): # Hallo los coef de Fourier  &lt;br /&gt;
    coefficients = np.zeros(n)&lt;br /&gt;
    for k in range(1,n+1): &lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients.tolist()   # Convertir a lista&lt;br /&gt;
coef=fourier_coefficients(f, N, x)&lt;br /&gt;
&lt;br /&gt;
def u(x, t, n):  # Definir la derivada en términos de la serie de Fourier con N términos&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, n+1):&lt;br /&gt;
        lambda_k = k* np.pi&lt;br /&gt;
        sum += coef[k-1] *np.cos(k * np.pi * x)/(k * np.pi) * np.exp(-lambda_k**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
# Graficamos&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(t, u(0,t,N), label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t, u(1,t,N), label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Varilla con extremo aislado==&lt;br /&gt;
En este estudio modelamos la difusión del calor en un alambre. Inicialmente, consideramos un alambre con una temperatura inicial de \( 0^\circ C \) en su extremo izquierdo. En contraste, el extremo derecho del alambre está aislado térmicamente, lo que significa que no hay transferencia de calor a través de este. En nuestro análisis, introducimos una fuente de calor en el centro del alambre en el instante inicial. Luego, examinamos cómo se propaga y se distribuye esta fuente de calor a lo largo del alambre con el tiempo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u_x(1, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = max\{0, 1−4|x−1/2|\}, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que la barra se encuentra aislada térmicamente en su extremo en \( x = 1 \) implica que no hay flujo de calor a través de este extremo. La ley de Fick, establece que el flujo de calor es proporcional al gradiente de temperatura según la ecuación \( q = -k \frac{du}{dx} \), donde \( q \) es el flujo de calor, \( k \) es la conductividad térmica y \( \frac{du}{dx} \) es el gradiente de temperatura a lo largo de la barra. En este contexto, si el flujo en dicho extremo es nulo, el gradiente de temperatura es nulo, por tanto  \( u_x(1, t) = 0 \). Observamos además que la solución estacionaria en nuestro caso es \( v(x) = 0 \), pues es la solución del problema de contorno.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
v''(x) = 0, \quad v(0) = 0, \quad v'(1) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De forma análoga a como ocurría en el apartado anterior, el problema que estamos estudiando en este caso es homogéneo. Por tanto, sin necesidad de hacer ningún cambio, procedemos a resolverlo mediante el método de separación de variables. Suponiendo que \( u(x, t) = X(x) \cdot T(t) \). Obtenemos como solución \( X(x) = A \sin(\pi(1/2+k)x) \) y \( T(t) = B e^{-(\pi^2)(1/2+k)^2 t} \). De modo que, la solución sin tener en cuenta la condición inicial es:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u_k(x, t) = c_k \cdot \sin(\pi(1/2+k)x) \cdot e^{-(\pi^2)(1/2+k)^2 t}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Para asegurar la existencia de solución del problema, es necesario verificar si existen ciertos coeficientes \( c_k \) tal que la solución pueda ser definida como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, t) = \sum_{k=0}^{\infty} c_k \cdot \sin(\pi(1/2+k)x) \cdot e^{-(\pi^2)(1/2+k)^2 t}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Para ello, es necesario verificar que las autofunciones \( \{\sin(\pi(1/2+k)x)\}_{k=0}^{\infty} \) forman un conjunto completo en \( L^2 [0, 1]\)  y ortogonal.&lt;br /&gt;
 &lt;br /&gt;
Para comprobar la ortogonalidad entre las autofunciones, calculamos la integral de su producto, o lo que es igual a calcular el producto escalar de \( L^2 [0,1]\), para dos funciones distintas \( \sin(\pi(1/2+k)x) \) y \( \sin(\pi(1/2+m)x) \) con \( k \neq m \in \mathbb{N}\):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{1} \sin(\pi(1/2+k)x) \sin(\pi(1/2+m)x) \, dx = \frac{\sin((k - m) \pi)}{2 (k - m) \pi} - \frac{\sin((1 + k + m) \pi)}{2 (1 + k + m) \pi}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Esta integral se anula para \( k,m \in  \mathbb{N} \), lo que demuestra que las autofunciones son ortogonales entre sí en el intervalo \([0, 1]\).&lt;br /&gt;
Por otro lado, dado que demostrar que las funciones forman una base completa para el espacio \( L^2[0,1] \) puede ser un proceso complejo y requiere un análisis detallado, en este trabajo supondremos que la forman.&lt;br /&gt;
[[Archivo:Solucion_Pablo.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)    # Generar una cuadrícula de puntos&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino mi fucnión condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficient(f, k, x):  # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    ck = 2* np.trapz(f(x) * np.sin(np.pi*(1/2+k)*x) ,x)&lt;br /&gt;
    return ck&lt;br /&gt;
&lt;br /&gt;
# Definir la solución en términos de la serie de Fourier con N términos&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0                 # Almacenamos la suma hasta el término 10&lt;br /&gt;
    for k in range(0, N+1): # Para cada k cálculo su coeficiente y lo sumo al resultado&lt;br /&gt;
        ck = fourier_coefficient(f, k, x)&lt;br /&gt;
        sum += ck * np.sin(np.pi*(1/2+k)*x) * np.exp(-(np.pi**2)*(1/2+k)**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Z = u(X, T, N)  # Calcular los valores de la función para cada par (x, t)&lt;br /&gt;
&lt;br /&gt;
# Graficar la función en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z,cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x [m]')&lt;br /&gt;
ax.set_ylabel('Tiempo t [s]')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) [ºC]')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)  #Añado una guía de colores&lt;br /&gt;
surf.set_clim(0, 1)                       # Le introduzco cota inf/sup a los colores&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gracias a los desarrollos en serie de Fourier, podemos calcular los coeficientes \( c_k \) para cumplir así la condición inicial. Dichos coeficientes se calculan mediante la integral:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_k := \frac{\int_{0}^{1} \max\{0, 1 - 4(x - 1/2)\} \sin(\pi(1/2+k)x) \, dx}{\int_{0}^{1} \sin^2(\pi(1/2+k)x) \, dx}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Dado que la integral es difícil de calcular analíticamente y en consecuencia es difícil obtener una expresión dependiente del parámetro &amp;lt;math&amp;gt; k&amp;lt;/math&amp;gt;, la resolveremos de forma numérica mediante el método del trapecio, de forma análoga a como se hizo en el modelo sin aislante térmico previo.&lt;br /&gt;
Para una comprensión más completa de la evolución de la temperatura del alambre en cuestión, es importante realizar un análisis visual de la solución propuesta. La representación gráfica de la solución en el intervalo de tiempo \( t \in [0, 1] \), considerando los primeros 10 términos de la serie de Fourier, ofrece una visualización tridimensional de la distribución del calor a lo largo del alambre en función del tiempo.&lt;br /&gt;
 &lt;br /&gt;
Es relevante destacar que a medida que transcurre el tiempo, la solución converge gradualmente hacia su estado estacionario, es decir, \(  v(x)=0 \) . Además, observamos que se verifica el principio del máximo, dado que tanto la temperatura máxima y mínima se alcanza en la frontera parabólica.&lt;br /&gt;
Esta última afirmación la podemos verificar de forma sencilla, obteniendo ambos valores de la función. El código utilizado mostró los siguientes datos.&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# Calcular la temperatura máxima y mínima&lt;br /&gt;
max_temperature = np.max(Z)&lt;br /&gt;
min_temperature = np.min(Z)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Temperatura máxima:&amp;quot;, max_temperature)&lt;br /&gt;
print(&amp;quot;Temperatura mínima:&amp;quot;, min_temperature)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Encontrar las coordenadas donde se alcanza la temperatura máxima y mínima&lt;br /&gt;
max_index = np.unravel_index(np.argmax(Z), Z.shape)&lt;br /&gt;
min_index = np.unravel_index(np.argmin(Z), Z.shape)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
max_x, max_t = x_values[max_index[1]], t_values[max_index[0]]&lt;br /&gt;
min_x, min_t = x_values[min_index[1]], t_values[min_index[0]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Coordenadas de la temperatura máxima: (x={}, t={})&amp;quot;.format(max_x, max_t))&lt;br /&gt;
print(&amp;quot;Coordenadas de la temperatura mínima: (x={}, t={})&amp;quot;.format(min_x, min_t))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Resultados de temperatura máxima y mínima&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parámetro!! Valor&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura máxima|| \(0.92 ^\circ \text{C}\)&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura mínima|| \(-0.03 ^\circ \text{C}\)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Coordenadas de temperatura máxima y mínima&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Coordenadas !! Valor&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura máxima|| \((x=0.50, t=0.00)\)&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura mínima|| \((x=0.81, t=0.00)\)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Observamos que el máximo debería ser de &amp;lt;math&amp;gt; 1^\circ \text{C} &amp;lt;/math&amp;gt;. No obstante, el resultado reportado por el código es &amp;lt;math&amp;gt; 0.92 ^\circ \text{C} &amp;lt;/math&amp;gt;. Esto se debe al uso de la aproximación por series de Fourier. Lo mismo ocurre con el valor mínimo que debería se de &amp;lt;math&amp;gt; 0^\circ \text{C} &amp;lt;/math&amp;gt;, no obstante el código reporta &amp;lt;math&amp;gt;-0.03^\circ \text{C} &amp;lt;/math&amp;gt;. Además dichos puntos están en la frontera parabólica, como afirma el principio del máximo. &lt;br /&gt;
&lt;br /&gt;
En este punto es interesante verificar si nuestro modelo es correcto. En tal caso, el extremo izquierdo de la barra no debería perder calor. Por lo tanto, calculamos la derivada de nuestra expresión y, gracias a la Ley de Fick, sabemos que el flujo de calor es igual a la derivada cambiada de signo. Obtenemos los siguientes resultados:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Flujo_Pablo.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 100     # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x_values = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t_values = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino mi función condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficient(f, k, x):   # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    ck = 2* np.trapz(f(x) * np.sin(np.pi*(1/2+k)*x) ,x)&lt;br /&gt;
    return ck&lt;br /&gt;
&lt;br /&gt;
def derivative_solution_x(x, t, N): # Definir la derivada de la solución respecto a x&lt;br /&gt;
    result = 0&lt;br /&gt;
    for k in range(0, N+1):&lt;br /&gt;
        ck = fourier_coefficient(f, k, x_values)&lt;br /&gt;
        result += ck * np.pi * (1/2 + k) * np.cos(np.pi * (1/2 + k) * x) * np.exp(-1 * (np.pi**2) * (1/2 + k)**2 * t)&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
# Calcular la derivada de la solución respecto a x para los extremos x=0 y x=1 a lo largo del tiempo&lt;br /&gt;
flux_x0 = [-derivative_solution_x(0, t, N) for t in t_values]&lt;br /&gt;
flux_x1 = [-derivative_solution_x(1, t, N) for t in t_values]&lt;br /&gt;
&lt;br /&gt;
# Graficar el flujo en los extremos x=0 y x=1 a lo largo del tiempo&lt;br /&gt;
plt.figure(figsize=(8, 5))&lt;br /&gt;
plt.plot(t_values, flux_x0, label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t_values, flux_x1, label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Observamos que todo el calor aportado en el instante inicial se disipa completamente por la izquierda de la varilla, ya que el flujo en &amp;lt;math&amp;gt; x=1&amp;lt;/math&amp;gt; es nulo, verificando así las condiciones fronteras de nuestro problema.&lt;br /&gt;
&lt;br /&gt;
==Solución fundamental==&lt;br /&gt;
La solución fundamental de la ecuación del calor es una función que describe la distribución de temperatura en un medio en función del tiempo y la posición. Para la ecuación del calor unidimensional, la solución fundamental está dada por la fórmula:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\phi(x, t) = \frac{1}{2 \sqrt{\pi t}} \exp\left(-\frac{x^2}{t}\right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
La solución fundamental describe cómo el calor se propaga y difunde a lo largo del medio a medida que pasa el tiempo, en este caso, por ejemplo, el calor en un alambre. Además la solución general del problema de Cauchy es la solución fundamental de la ecuación del calor.&lt;br /&gt;
El problema de Cauchy es el siguiente:&lt;br /&gt;
Dada la ecuación diferencial parcial:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u_t = k \cdot u_{xx},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
junto con las siguientes condiciones iniciales:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, 0) = f(x)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
donde \( f(x) \) es una función dada en el dominio \( 0 \leq x \leq L \) y \( k \) es una constante positiva que representa la difusividad térmica del medio.&lt;br /&gt;
Para resolver el problema de Cauchy para la ecuación del calor es mediante el uso de la solución fundamental y la técnica de convolución. La solución fundamental \( \phi(x, t) \) de la ecuación del calor es una función especial que satisface la ecuación diferencial parcial y las condiciones iniciales dadas.&lt;br /&gt;
 &lt;br /&gt;
Para resolver el problema de Cauchy, podemos utilizar la solución fundamental \( \phi(x, t) \) en combinación con la función inicial \( u_0(x) \) para obtener la solución general \( u(x, t) \) en cualquier instante de tiempo \( t \). Esto se logra convolucionando la función inicial \( f(x) \) con la solución fundamental \( \phi(x, t) \) .&lt;br /&gt;
La solución \( u(x, t) \) del problema de Cauchy se puede expresar como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, t) = \int_{-\infty}^{\infty} \phi(x - y, t) f(y) \, dy&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
En primer lugar, procederemos a visualizar una representación tridimensional de la solución fundamental  \( \phi(x, t) \).&lt;br /&gt;
[[Archivo:Solfundi.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Definir la función que representa la solución fundamental de la ecuación del calor&lt;br /&gt;
def phi(x, t):&lt;br /&gt;
    return 1 / (2 * np.sqrt(np.pi * t)) * np.exp(-x**2 / t)&lt;br /&gt;
&lt;br /&gt;
# Definir los valores de x y t para la gráfica&lt;br /&gt;
x_values = np.linspace(-1, 1, 100)    # Valores de x&lt;br /&gt;
t_values = np.linspace(0.01, 1, 200)  # Valores de t (tiempo)&lt;br /&gt;
&lt;br /&gt;
# Crear una malla de valores de x y t&lt;br /&gt;
X, T = np.meshgrid(x_values, t_values)&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución fundamental para cada par de valores (x, t)&lt;br /&gt;
Z = phi(X, T)&lt;br /&gt;
&lt;br /&gt;
# Crear una figura en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
# Graficar la superficie 3D&lt;br /&gt;
surf = ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
# Etiquetas y título con el símbolo de &amp;quot;phi&amp;quot;&lt;br /&gt;
ax.set_xlabel(r'$x$')&lt;br /&gt;
ax.set_ylabel(r'$t$')&lt;br /&gt;
ax.set_zlabel(r'$\phi(x, t)$')&lt;br /&gt;
ax.set_title(r'Solución fundamental de la ecuación del calor: $\phi(x, t)$')&lt;br /&gt;
&lt;br /&gt;
# Añadir una barra de colores para indicar los valores de Z&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=8)&lt;br /&gt;
plt.show()    # Mostrar la gráfica&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
En esta ocasión veremos la solución de la ecuación del calor \( u_t - u_{xx} = 0 \) en \( x \in \mathbb{R} \) asociada al dato inicial \( f(x) = 1_{[-1,1]} \), viene dada por la convolución:&lt;br /&gt;
 &lt;br /&gt;
:&amp;lt;math&amp;gt; u(x, t) = \int_{-\infty}^{\infty} \phi(x - y, t) f(y) \, dy = \int_{-\infty}^{\infty} \frac{1}{2 \sqrt{\pi t}} \exp\left(-\frac{(x-y)^2}{t}\right) 1_{[-1,1]} \, dy &amp;lt;/math&amp;gt;&lt;br /&gt;
Dibujaremos la solución en diferentes instantes de tiempo: \( t = 0.001 \), \( t = 0.01 \) , \( t = 0.1 \), \( t = 1 \).  Aproximaremos la integral indefinida utilizando la fórmula del trapecio.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Soluciondiferentet.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Definir la solución fundamental&lt;br /&gt;
def phi(x, t):&lt;br /&gt;
    return 1 / np.sqrt(4 * np.pi * t) * np.exp(-x**2 / (4 * t))&lt;br /&gt;
&lt;br /&gt;
def u0(x):&lt;br /&gt;
    return np.where(np.logical_and(x &amp;gt;= -1, x &amp;lt;= 1), 1, 0)&lt;br /&gt;
&lt;br /&gt;
# Definir el intervalo espacial y los instantes de tiempo&lt;br /&gt;
x = np.linspace(-5, 5, 1000)  # Valores de x&lt;br /&gt;
t_values = [0.001, 0.01, 0.1, 1]  # Valores de t (instantes de tiempo)&lt;br /&gt;
&lt;br /&gt;
# Crear una nueva figura para la gráfica&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
# Calcular y graficar la solución para diferentes instantes de tiempo&lt;br /&gt;
for t in t_values:&lt;br /&gt;
    u_x_t = []&lt;br /&gt;
    for xi in x:&lt;br /&gt;
        # Utilizar np.trapz para calcular la solución integral de la ecuación del calor&lt;br /&gt;
        u_x_t.append(np.trapz(phi(xi - x, t)*u0(x), x))&lt;br /&gt;
    plt.plot(x, u_x_t, label=f't = {t}')&lt;br /&gt;
&lt;br /&gt;
# Etiquetas y título de la gráfica&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('u(x, t)')&lt;br /&gt;
plt.title(f'Solución de $u_t - uxx = 0$ en x ∈ R con u0 (x) = [-1,1] en diferentes instantes de tiempo (usando numpy.trapz)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Solución fundamental dimensión 2==&lt;br /&gt;
&lt;br /&gt;
Veamos el problema de Cauchy para la ecuación del calor en dos dimensiones (\( x_1, x_2 \) y \( t \)). Sea \( u(x_1, x_2, t) \) la función de temperatura en un medio bidimensional, que satisface la ecuación del calor:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u_t = k(u_{x_1 x_1} + u_{x_2 x_2})&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Con las condiciones iniciales dadas por la temperatura inicial \( u(x_1, x_2, 0) = f(x_1, x_2) \) para algún campo de temperatura dado \( f(x_1, x_2)  \text{para} (x_1, x_2) \in \partial \Omega \), donde \( \Omega \) es el dominio bidimensional sobre el cual se define la temperatura.&lt;br /&gt;
La solución general a este problema (sin contar la condición inicial) viene dada por la siguiente expresión: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\phi(x_1, x_2, t) = \frac{1}{4 \pi t} \exp\left( -\frac{x_1^2 + x_2^2}{4t} \right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Procederemos ahora a representar la solución fundamental, donde veremos un gráfico tridimensional, &amp;lt;math&amp;gt; x_1, x_2, \phi(x_1, x_2, t) &amp;lt;/math&amp;gt; donde se ha fijado un tiempo t.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:gifgif.gif|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Definir la solución fundamental en 2D&lt;br /&gt;
def phi_2D(x1, x2, t):&lt;br /&gt;
    if t == 0:&lt;br /&gt;
        return np.zeros_like(x1)  # Devuelve una matriz de ceros si t es cero&lt;br /&gt;
    else:&lt;br /&gt;
        return 1 / (4 * np.pi * t) * np.exp(-(x1**2 + x2**2) / (4 * t))&lt;br /&gt;
&lt;br /&gt;
# Definir el intervalo espacial&lt;br /&gt;
x1_values = np.linspace(-1, 1, 100)  # Valores de x1&lt;br /&gt;
x2_values = np.linspace(-1, 1, 100)  # Valores de x2&lt;br /&gt;
x1, x2 = np.meshgrid(x1_values, x2_values)  # Malla de valores de x1 y x2&lt;br /&gt;
&lt;br /&gt;
# Definir los tiempos&lt;br /&gt;
t_values = np.linspace(0, 0.1, 3)  # Valores de tiempo&lt;br /&gt;
&lt;br /&gt;
# Tamaño de la figura&lt;br /&gt;
fig = plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
# Graficar la solución fundamental en 2D para cada tiempo&lt;br /&gt;
for i, t in enumerate(t_values, 1):&lt;br /&gt;
    ax = fig.add_subplot(1, len(t_values), i, projection='3d')&lt;br /&gt;
    phi = phi_2D(x1, x2, t)&lt;br /&gt;
    ax.plot_surface(x1, x2, phi, cmap='viridis')&lt;br /&gt;
    ax.set_title(f'Tiempo $t=${round(t, 3)}')&lt;br /&gt;
    ax.set_xlabel('x1')&lt;br /&gt;
    ax.set_ylabel('x2')&lt;br /&gt;
    ax.set_zlabel('phi(x1, x2, t)')&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor(Grupo_Eau_De_Parfum(EDP)))&amp;diff=70125</id>
		<title>Ecuación del calor(Grupo Eau De Parfum(EDP)))</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor(Grupo_Eau_De_Parfum(EDP)))&amp;diff=70125"/>
				<updated>2024-03-07T19:07:12Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Solución fundamental dimensión 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del Calor. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
==Introducción==&lt;br /&gt;
&lt;br /&gt;
==Conocimientos previos==&lt;br /&gt;
Antes de comenzar será de gran ayuda introducir una serie de conceptos que utilizaremos a lo largo este trabajo:&lt;br /&gt;
&lt;br /&gt;
*'''Ley del calor de Newton''': describe la tasa de pérdida o ganancia de calor de un objeto en relación con el ambiente circundante.La ley se expresa comúnmente como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d T(t)}{d t} = - k (T(t) - T_{\mathrm{a}}) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
siendo &amp;lt;math&amp;gt;T(t) &amp;lt;/math&amp;gt;la temperatura del objeto en un tiempo dado, &amp;lt;math&amp;gt;T_{\mathrm{a}}&amp;lt;/math&amp;gt; la temperatura ambiente y &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; la constante de proporcionalidad.&lt;br /&gt;
&lt;br /&gt;
*'''Principio de conservación de la energía calorífica''': establece que la variación de energía calorífica sobre un cuerpo V se debe al balance entre el calor que entra y sale del cuerpo más una producción externa.&lt;br /&gt;
&lt;br /&gt;
*'''Ley de Fourier''':intaura que el calor fluye desde regiones de alta temperatura a regiones de baja temperatura, y la cantidad de flujo de calor depende de la diferencia de temperatura y las propiedades del material.La expresión matemática de la Ley de Fourier es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{q}  = - k {\nabla} T &amp;lt;/math&amp;gt;,   &lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
donde &amp;lt;math&amp;gt; \mathbf{q}&amp;lt;/math&amp;gt; es el vector de flujo de calor por unidad de superficie y &amp;lt;math&amp;gt;  {\nabla} T &amp;lt;/math&amp;gt; es el gradiente del campo de temperatura en el interior del material.&lt;br /&gt;
*'''Coeficiente de conductividad térmica (D)''':cuantifica la capacidad de un material para conducir el calor. Se define como la cantidad de calor que pasa en un segundo a través de un metro cuadrado de material cuando la diferencia de temperatura a través del material,cuando la diferencia de temperatura a través del material es de un grado(ºC) es de un grado, y el espesor del material es de un metro.&lt;br /&gt;
*'''Principio del máximo''': Sea &amp;lt;math&amp;gt;u \in C^{2,1}(Q_T)\cap (\overline{Q_T})&amp;lt;/math&amp;gt; tal que  &amp;lt;math&amp;gt;u_t - \Delta u \leq 0&amp;lt;/math&amp;gt; en &amp;lt;math&amp;gt;Q_T&amp;lt;/math&amp;gt;. Entonces u alcanza su máximo en la frontera parabólica &amp;lt;math&amp;gt;\partial _p Q_T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\max_{\overline{Q_T}} u = \max_{\partial _p Q_T} u&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nuestro problema original ==&lt;br /&gt;
Consideramos una varilla metálica de 1 metro de longitud , que se encuentra aislada por su superficie lateral, de manera que la conducción de calor únicamente se produce en la dirección longitudinal. La temperatura inicial de la varilla es de 0ºC. En el extremo izquierdo se consigue mantener la temperatura a 0 ºC mientras que en el derecho la temperatura es siempre de 1 ºC. Además  el calor específico toma un valor constante de 1.En cuanto al coeficiente de conductividad térmica,vamos a observar cómo sería nuestro problema para un valor cualquiera y seguidamente especificaremos el valor constante de 1.&lt;br /&gt;
&lt;br /&gt;
Pero antes de abordar matemáticamente nuestro problema, vamos a intentar deducir lo que podría ocurrir. Considerando que la temperatura en el extremo derecho de la varilla es superior a la del extremo izquierdo, el calor comenzará a transferirse desde la zona más cálida, elevando la temperatura a lo largo de la varilla y promoviendo el desplazamiento del calor hacia la región más fría. Simultáneamente, el incremento de la temperatura interna provoca una reducción del flujo de calor entrante y a un aumento del saliente con el tiempo. Anticipamos que, en algún momento, ambos flujos se equilibrarán, conduciendo la temperatura de la varilla a un estado estacionario.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por lo que nuestro problema a resolver queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - Du_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Debemos reescalar en tiempo, para facilitarnos los cálculos, por lo que realizamos el cambio de variable  &amp;lt;math&amp;gt;\tau = \alpha t, \tau \in\mathbb{R} &amp;lt;/math&amp;gt;. Por tanto,  &amp;lt;math&amp;gt; u(x,t)=U(x,\tau)&amp;lt;/math&amp;gt; y entonces &amp;lt;math&amp;gt; \alpha U_{\tau}-DU_{xx}=0&amp;lt;/math&amp;gt; .Tomando &amp;lt;math&amp;gt; \alpha = D&amp;lt;/math&amp;gt; , obtenemos el problema &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;U_{\tau} - U_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(0, \tau) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(1, \tau) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Este problema se resuelve mediante el método de variación de las constantes, pero un factor clave para su implementación es que las condiciones de contorno estén homogeneizadas, es decir, que sean igual a cero. Esto se conseguirá mediante un cambio de variable, en el que es imprescindible la llamada solución estacionaria.&lt;br /&gt;
La solución estacionaria de nuestro problema es aquella que no varía con el tiempo &amp;lt;math&amp;gt; v=\lim_{t \to \infty} U(x,\tau)&amp;lt;/math&amp;gt;y por tanto, su derivada  respecto al tiempo es nula. Nuestro sistema queda ahora:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;-v_{xx}   = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, \\&lt;br /&gt;
&amp;amp;v(0)= 0 \\&lt;br /&gt;
&amp;amp;v(1) = 1, &lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Resolviendo obtenemos que &amp;lt;math&amp;gt; v(x)=x &amp;lt;/math&amp;gt; es nuestra solución estacionaria, cuya expresión gráfica es:&lt;br /&gt;
[[Archivo:sofiaest1.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import numpy as np&lt;br /&gt;
# Define el rango de x entre 0 y 1&lt;br /&gt;
x = np.linspace(0, 1, 100)  &lt;br /&gt;
# Define la función  estacionaria v(x) = x&lt;br /&gt;
v_x = x&lt;br /&gt;
# Crea la gráfica&lt;br /&gt;
plt.plot(x, v_x)&lt;br /&gt;
# Etiquetas de los ejes&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('v(x)')&lt;br /&gt;
# Título de la gráfica&lt;br /&gt;
plt.title('Gráfica de la solución estacionaria v(x)=x')&lt;br /&gt;
# Muestra la gráfica&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Una vez hallada la solución estacionaria, podemos homogeneizar nuestro problema mediante el cambio de variable &amp;lt;math&amp;gt;w(x,t)= U(x,\tau)-v(x)&amp;lt;/math&amp;gt;.Por tanto, sustituyendo en el sistema inicial obtenemos:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;w_{\tau} - w_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(0, \tau) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(1, \tau) = 1-1=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(x, 0) = 0-x=-x, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Nuestro sistema es ya homogéneo,por lo que aplicamos el método de separación de variables (que consiste en expresar la solución como el producto de una función que depende únicamente de la variable espacial x y una función dependiente de la variable temporal) y obtenemos como solución homogénea:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;w(x,\tau) =  \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 \tau}\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Y deshaciendo los dos cambios de variable, nuestra solución al problema original es por tanto:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 Dt }\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Como en nuestro caso, el coeficiente de conductividad térmica es igual a 1, nuestro sistema es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - Du_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
y nuestra solución:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 t }\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Mostramos gráficamente la solución, observando que se cumplen las condiciones de frontera y además según avanza el tiempo, la solución deja de depender del tiempo y alcanza un estado estacionario, determinado justamente por la solución estacionaria obtenida anteriormente, &amp;lt;math&amp;gt; v(x)=x &amp;lt;/math&amp;gt;. Cabe destacar que en &amp;lt;math&amp;gt; t=0 &amp;lt;/math&amp;gt;  obtenemos las oscilaciones correspondientes a la serie de Fourier de la condición inicial, que se aproxima mediante senos.&lt;br /&gt;
[[Archivo:SOFIASOL11.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
# Solución usando los primeros N términos de la serie&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculasmos los coeficientes C_k&lt;br /&gt;
        C_k = 2 * (-1)**(k) / (k * np.pi)  &lt;br /&gt;
        sum += C_k * np.sin(k*np.pi * x) * np.exp(-lambda_k * t*D) &lt;br /&gt;
    return x+sum&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
&lt;br /&gt;
# Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12,8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x (m)')&lt;br /&gt;
ax.set_ylabel('Tiempo t (s)')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) (ºC)')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Flujo===&lt;br /&gt;
Para estudiar el flujo de calor saliente y entrante en ambos extremos de la varilla a lo largo del tiempo, nos debemos basar en la ley de Fourier &amp;lt;math&amp;gt; \mathbf{q}  = - k  u_x(x,t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Por lo que necesitamos obtener la derivada de la solución con respecto al espacio:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(x,t)= 1+\sum_{k=1}^{\infty}(-1)^{k+1}2 e^{-k^2\pi ^2 t }\cos(k\pi  x) &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Ahora, el flujo en los extremos es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(0,t)=1 +\sum_{k=1}^{\infty}(-1)^{k+1}2 e^{-k^2\pi ^2 t } &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(1,t)=1+\sum_{k=1}^{\infty}2 e^{-k^2\pi ^2 t } &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Gráficamente,&lt;br /&gt;
[[Archivo:SOFIAFLUJO1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
# Derivada de nuestra solución respecto al espacio, multiplicado por -k&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculamos los coeficientes C_k mediante extensión impar&lt;br /&gt;
        C_k = 2 * (-1)**(k+1)  &lt;br /&gt;
        sum += C_k * np.cos(k*np.pi * x) * np.exp(-lambda_k * t) &lt;br /&gt;
    return 1+sum&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(t, u(0,t,N), label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t, u(1,t,N), label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Al comenzar con un flujo de calor nulo en el extremo izquierdo, esto  indica que hay una gran diferencia de temperatura entre ambos extremos de la varilla. El extremo izquierdo está perdiendo calor rápidamente hacia la zona más fría. A medida que el calor se va transfiriendo por la varilla, el gradiente de la temperatura cambia y el extremo derecho comienza a calentarse, debido al flujo de calor que proviene del otro extremo. Este cambio conduce a que el flujo en ambos extremos comience a estar en equilibrio. &lt;br /&gt;
Esta estabilización de flujo en -1 refleja que se ha alcanzado un estado estacionario en el sistema, indicando que cualquier calor entrante en la varilla, se compensa con el calor saliente, manteniendo una distribución de temperatura uniforme.&lt;br /&gt;
&lt;br /&gt;
Este comportamiento refleja la Ley de Fourier, donde al principio la gran diferencia de temperatura induce un flujo de calor bastante significativo, que se va estabilizando llegando a un flujo de -1 en ambos extremos, alcanzando así un gradiente de temperatura constante, con la misma cantidad de calor saliendo hacia fuera desde ambos extremos.&lt;br /&gt;
&lt;br /&gt;
==Cambio de coeficiente de conductividad térmica ==&lt;br /&gt;
Hemos estudiado el problema de Cauchy para un coeficiente de difusión de 1,veamos que ocurre si lo disminuimos a su mitad, es decir,&amp;lt;math&amp;gt;D=\frac{1}{2}&amp;lt;/math&amp;gt;.Nuestro nuevo problema por tanto es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - \frac{1}{2}u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuya solución es &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {\frac{-k^2\pi ^2 t}{2}}\sin(k\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gráficamente, únicamente hemos cambiado el valor de D en el código (2)  y obtenemos:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:SOFIASOL22.png|400px|thumb|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1/2       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
# Solución usando los primeros N términos de la serie&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculasmos los coeficientes C_k&lt;br /&gt;
        C_k = 2 * (-1)**(k) / (k * np.pi)  &lt;br /&gt;
        sum += C_k * np.sin(k*np.pi * x) * np.exp(-lambda_k * t*D) &lt;br /&gt;
    return x+sum&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
# Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12,8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
ax.set_xlabel('Posición x (m)')&lt;br /&gt;
ax.set_ylabel('Tiempo t (s)')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) (ºC)')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
No se puede apreciar ninguna diferencia aparente entre las soluciones para los diferentes coeficientes. Para observar algún cambio vamos a dibujar la diferencia entre la solución y el estado estacionario en &amp;lt;math&amp;gt; x = 1/2&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt; t \in [0, 1]&amp;lt;/math&amp;gt;, es decir &amp;lt;math&amp;gt;u(1/2, t) − v(1/2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
[[Archivo:SOFIACCT1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
x=0.5&lt;br /&gt;
# Definir la función de temperatura con un número limitado de términos en la serie&lt;br /&gt;
def u(x, t, alpha, n_terms=10):   &lt;br /&gt;
    sum_series = sum(2 * (-1)**(k + 1) / (k * np.pi) * np.sin(k * np.pi * x) * np.exp(-k**2 * np.pi**2 * alpha * t) for k in range(1, n_terms + 1))&lt;br /&gt;
    return  x - sum_series&lt;br /&gt;
# Intervalo de tiempo&lt;br /&gt;
t = np.linspace(0, 1, 100)&lt;br /&gt;
# Calcular la temperatura en x=1/2 para diferentes alphas&lt;br /&gt;
u_k1 = u(0.5, t, alpha=1)-x  # D=1, correspondiente a alpha=1&lt;br /&gt;
u_k_half = u(0.5, t, alpha=0.5)-x  # D=1/2, correspondiente a alpha=0.5&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.plot(t, u_k1, label='k=1', color='blue')&lt;br /&gt;
plt.plot(t, u_k_half, label='k=1/2', color='red')&lt;br /&gt;
plt.xlabel('Tiempo (s)')&lt;br /&gt;
plt.ylabel('u(1/2, t) − v(1/2)')&lt;br /&gt;
plt.title('Efecto del Coeficiente de Conductividad Térmica ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El coeficiente de conductividad térmica juega un papel fundamental en determinar la velocidad a la que se propaga la temperatura dentro de un material. Al disminuir este coeficiente a la mitad, el proceso de conducción térmica a través de la varilla experimenta una notable ralentización. Esto se traduce en que, en cualquier instante dado t, la distribución de la temperatura a lo largo de la varilla VA avanzando a la mitad de velocidad en comparación con un escenario donde el coeficiente de conductividad térmica es de 1. Dicho cambio incide directamente en la rapidez con que se logra el equilibrio térmico en la varilla, Resultando en una difusión térmica más lenta hacia el equilibrio.&lt;br /&gt;
&lt;br /&gt;
== Cambio de condiciones ==&lt;br /&gt;
Supongamos ahora una barra unidimensional con extremos fijos a una temperatura de &amp;lt;math&amp;gt;0^\circ C&amp;lt;/math&amp;gt;. La temperatura inicial en cualquier punto de la barra está dada por la función &amp;lt;math&amp;gt;u(x,0) = max\{0, 1−4|x−1/2|\}&amp;lt;/math&amp;gt;, lo que significa que inicialmente la temperatura en la barra varía de acuerdo con esta función.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = max\{0, 1−4|x−1/2|\}, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Supongamos que, en tiempo infinito, \( t \rightarrow \infty \), se llega a una solución estacionaria y que, por tanto, ya no varía en tiempo. De modo, que tomando esta suposición llegamos al siguiente sistema con \( u(x,t) \xrightarrow{\text{t tiende a }\infty} v(x) \).&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;v_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,   \\&lt;br /&gt;
&amp;amp;v(0) = 0, &amp;amp; \\&lt;br /&gt;
&amp;amp;v(1) = 0, &amp;amp;  &lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuya solución es la constante \( v(x)=0 \). De modo que el sistema homogeneizado, coincide con el original, pues \( w(x,t)=u(x,t)-v(x) =u(x,t)-0=u(x,t)\) &lt;br /&gt;
Antes de exigir la condición inicial, la solución coincide con la del primer apartado, pues nos encontramos ante la misma ecuación diferencial, salvo por la función \( u(x,0)\), la cual no toma parte hasta el final de la resolución de esta suponiendo separación de variables. De modo que&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t) = \sum_{k=1}^{\infty} C_k  e^{(-k^2\pi ^2 t )}\sin(k \pi  x)&amp;lt;/math&amp;gt; &lt;br /&gt;
Para hallar el valor de los coeficientes &amp;lt;math&amp;gt; C_k&amp;lt;/math&amp;gt;, buscamos la serie de Fourier de la función &amp;lt;math&amp;gt; max\{0, 1−4|x−1/2|\}&amp;lt;/math&amp;gt; extendida de forma impar. Esto es posible, ya que&lt;br /&gt;
:&amp;lt;math&amp;gt; \int^1_0 (max\{0, 1−4|x−1/2|\})^2 dx=0.1667 &amp;lt; \infty&amp;lt;/math&amp;gt;  &lt;br /&gt;
El cálculo de los coeficientes se ha realizado numéricamente aproximando por la fórmula del trapecio. Los coeficientes se pueden consultar ejecutando el siguiente código en Python&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np &lt;br /&gt;
def f(x):   # Defino función que se quiere aproximar&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x):&lt;br /&gt;
    coefficients = np.zeros(n) # Guardo los coeficientes en una lista&lt;br /&gt;
    for k in range(1,n+1):     # Compiezo en k=1, pues sin(0)=0&lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients&lt;br /&gt;
&lt;br /&gt;
fourier_coefficients(f, 10, np.linspace(0, 1, 1000))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
De modo que ya se ha calculado la solución de este nuevo problema. Visualmente, responde a la siguiente gráfica, resultado de ejecutar este código:&lt;br /&gt;
[[Archivo:Solucion_Celia.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)    # Generar una cuadrícula de puntos&lt;br /&gt;
&lt;br /&gt;
def f(x):    # Defino mi función condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x): # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    coefficients = np.zeros(n)&lt;br /&gt;
    for k in range(1,n+1):         # Comenzamos en 1, pues sen(0)=0&lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients.tolist()   # Convertir a lista&lt;br /&gt;
coef=fourier_coefficients(f, N, x)&lt;br /&gt;
&lt;br /&gt;
def u(x, t, n): # Definir la solución en términos de la serie de Fourier con N términos&lt;br /&gt;
    sum = 0                 # Almacenamos la suma (resultado) hasta el término 10&lt;br /&gt;
    for k in range(1, n+1): # Para cada k calculo el lambda y sumo su coeficiente respectivo&lt;br /&gt;
        lambda_k = k* np.pi&lt;br /&gt;
        sum += coef[k-1] * np.sin(lambda_k * x) * np.exp(-lambda_k**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
Z = u(X, T, N) # Calcular los valores de la función para cada par (x, t)&lt;br /&gt;
&lt;br /&gt;
# Graficar la función en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))  # Cambio aquí para hacer la figura más grande&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z,cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x [m]')&lt;br /&gt;
ax.set_ylabel('Tiempo t [s]')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) [ºC]')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)  #Añado una guía de colores&lt;br /&gt;
surf.set_clim(0, 1)                       # Le introduzco cota inf/sup a los colores&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
​[[Archivo:gifcelia.gif|400px|right|]]&lt;br /&gt;
Vemos como la temperatura sufre una gran variación en tiempos cercanos a 0, y rápidamente tiende a su estado estacionario, &amp;lt;math&amp;gt;v(x)=0&amp;lt;/math&amp;gt;. Para poder visualizarlo mejor mostraremos una un gif donde la imagen cambia a medida que el tiempo pasa, restringido a &amp;lt;math&amp;gt;t \in [0,0.3]&amp;lt;/math&amp;gt;, pues a partir de ahí, la temperatura está suficientemente cerca de la estacionaria y, por tanto, no hay gran variación en la temperatura.&lt;br /&gt;
&lt;br /&gt;
En un inicio, en \(t=0\) la temperatura toma valores negativos. Esto debido a que la exponencial se anula y son los coeficientes de Fourier quienes exigen el signo de la función. Una vez que &amp;lt;math&amp;gt;t&amp;gt;0&amp;lt;/math&amp;gt;, u se hace positivo en todas partes, lo que significa que la temperatura se difunde casi instantáneamente a lo largo del eje x, resultando en una velocidad de propagación infinita. Es decir, cualquier perturbación se siente enseguida en toda parte del dominio.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Terminamos el estudio de esta ecuación de difusión con el estudio del flujo, la inversa de la variación de la variable x de la solución. Para ello derivamos la solución que hemos obtenido. En términos de &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;, puesto que no son dependientes de x, obtenemos:&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{\partial}{\partial x}u(x,t)=\sum_{k=1}^{\infty} C_k  e^{(-k^2\pi ^2 t )}\cos(k \pi  x)\frac{1}{k \pi}&amp;lt;/math&amp;gt; como flujo de la ecuación homogénea. Adjuntamos el código con el cual se ha calculado la expresión de forma numérica y su respectiva representación gráfica:&lt;br /&gt;
[[Archivo:Flujo_Celia.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino la función de la ci para hallar los coef&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x): # Hallo los coef de Fourier  &lt;br /&gt;
    coefficients = np.zeros(n)&lt;br /&gt;
    for k in range(1,n+1): &lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients.tolist()   # Convertir a lista&lt;br /&gt;
coef=fourier_coefficients(f, N, x)&lt;br /&gt;
&lt;br /&gt;
def u(x, t, n):  # Definir la derivada en términos de la serie de Fourier con N términos&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, n+1):&lt;br /&gt;
        lambda_k = k* np.pi&lt;br /&gt;
        sum += coef[k-1] *np.cos(k * np.pi * x)/(k * np.pi) * np.exp(-lambda_k**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
# Graficamos&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(t, u(0,t,N), label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t, u(1,t,N), label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Varilla con extremo aislado==&lt;br /&gt;
En este estudio modelamos la difusión del calor en un alambre. Inicialmente, consideramos un alambre con una temperatura inicial de \( 0^\circ C \) en su extremo izquierdo. En contraste, el extremo derecho del alambre está aislado térmicamente, lo que significa que no hay transferencia de calor a través de este. En nuestro análisis, introducimos una fuente de calor en el centro del alambre en el instante inicial. Luego, examinamos cómo se propaga y se distribuye esta fuente de calor a lo largo del alambre con el tiempo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u_x(1, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = max\{0, 1−4|x−1/2|\}, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que la barra se encuentra aislada térmicamente en su extremo en \( x = 1 \) implica que no hay flujo de calor a través de este extremo. La ley de Fick, establece que el flujo de calor es proporcional al gradiente de temperatura según la ecuación \( q = -k \frac{du}{dx} \), donde \( q \) es el flujo de calor, \( k \) es la conductividad térmica y \( \frac{du}{dx} \) es el gradiente de temperatura a lo largo de la barra. En este contexto, si el flujo en dicho extremo es nulo, el gradiente de temperatura es nulo, por tanto  \( u_x(1, t) = 0 \). Observamos además que la solución estacionaria en nuestro caso es \( v(x) = 0 \), pues es la solución del problema de contorno.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
v''(x) = 0, \quad v(0) = 0, \quad v'(1) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De forma análoga a como ocurría en el apartado anterior, el problema que estamos estudiando en este caso es homogéneo. Por tanto, sin necesidad de hacer ningún cambio, procedemos a resolverlo mediante el método de separación de variables. Suponiendo que \( u(x, t) = X(x) \cdot T(t) \). Obtenemos como solución \( X(x) = A \sin(\pi(1/2+k)x) \) y \( T(t) = B e^{-(\pi^2)(1/2+k)^2 t} \). De modo que, la solución sin tener en cuenta la condición inicial es:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u_k(x, t) = c_k \cdot \sin(\pi(1/2+k)x) \cdot e^{-(\pi^2)(1/2+k)^2 t}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Para asegurar la existencia de solución del problema, es necesario verificar si existen ciertos coeficientes \( c_k \) tal que la solución pueda ser definida como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, t) = \sum_{k=0}^{\infty} c_k \cdot \sin(\pi(1/2+k)x) \cdot e^{-(\pi^2)(1/2+k)^2 t}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Para ello, es necesario verificar que las autofunciones \( \{\sin(\pi(1/2+k)x)\}_{k=0}^{\infty} \) forman un conjunto completo en \( L^2 [0, 1]\)  y ortogonal.&lt;br /&gt;
 &lt;br /&gt;
Para comprobar la ortogonalidad entre las autofunciones, calculamos la integral de su producto, o lo que es igual a calcular el producto escalar de \( L^2 [0,1]\), para dos funciones distintas \( \sin(\pi(1/2+k)x) \) y \( \sin(\pi(1/2+m)x) \) con \( k \neq m \in \mathbb{N}\):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{1} \sin(\pi(1/2+k)x) \sin(\pi(1/2+m)x) \, dx = \frac{\sin((k - m) \pi)}{2 (k - m) \pi} - \frac{\sin((1 + k + m) \pi)}{2 (1 + k + m) \pi}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Esta integral se anula para \( k,m \in  \mathbb{N} \), lo que demuestra que las autofunciones son ortogonales entre sí en el intervalo \([0, 1]\).&lt;br /&gt;
Por otro lado, dado que demostrar que las funciones forman una base completa para el espacio \( L^2[0,1] \) puede ser un proceso complejo y requiere un análisis detallado, en este trabajo supondremos que la forman.&lt;br /&gt;
[[Archivo:Solucion_Pablo.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)    # Generar una cuadrícula de puntos&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino mi fucnión condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficient(f, k, x):  # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    ck = 2* np.trapz(f(x) * np.sin(np.pi*(1/2+k)*x) ,x)&lt;br /&gt;
    return ck&lt;br /&gt;
&lt;br /&gt;
# Definir la solución en términos de la serie de Fourier con N términos&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0                 # Almacenamos la suma hasta el término 10&lt;br /&gt;
    for k in range(0, N+1): # Para cada k cálculo su coeficiente y lo sumo al resultado&lt;br /&gt;
        ck = fourier_coefficient(f, k, x)&lt;br /&gt;
        sum += ck * np.sin(np.pi*(1/2+k)*x) * np.exp(-(np.pi**2)*(1/2+k)**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Z = u(X, T, N)  # Calcular los valores de la función para cada par (x, t)&lt;br /&gt;
&lt;br /&gt;
# Graficar la función en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z,cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x [m]')&lt;br /&gt;
ax.set_ylabel('Tiempo t [s]')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) [ºC]')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)  #Añado una guía de colores&lt;br /&gt;
surf.set_clim(0, 1)                       # Le introduzco cota inf/sup a los colores&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gracias a los desarrollos en serie de Fourier, podemos calcular los coeficientes \( c_k \) para cumplir así la condición inicial. Dichos coeficientes se calculan mediante la integral:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_k := \frac{\int_{0}^{1} \max\{0, 1 - 4(x - 1/2)\} \sin(\pi(1/2+k)x) \, dx}{\int_{0}^{1} \sin^2(\pi(1/2+k)x) \, dx}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Dado que la integral es difícil de calcular analíticamente y en consecuencia es difícil obtener una expresión dependiente del parámetro &amp;lt;math&amp;gt; k&amp;lt;/math&amp;gt;, la resolveremos de forma numérica mediante el método del trapecio, de forma análoga a como se hizo en el modelo sin aislante térmico previo.&lt;br /&gt;
Para una comprensión más completa de la evolución de la temperatura del alambre en cuestión, es importante realizar un análisis visual de la solución propuesta. La representación gráfica de la solución en el intervalo de tiempo \( t \in [0, 1] \), considerando los primeros 10 términos de la serie de Fourier, ofrece una visualización tridimensional de la distribución del calor a lo largo del alambre en función del tiempo.&lt;br /&gt;
 &lt;br /&gt;
Es relevante destacar que a medida que transcurre el tiempo, la solución converge gradualmente hacia su estado estacionario, es decir, \(  v(x)=0 \) . Además, observamos que se verifica el principio del máximo, dado que tanto la temperatura máxima y mínima se alcanza en la frontera parabólica.&lt;br /&gt;
Esta última afirmación la podemos verificar de forma sencilla, obteniendo ambos valores de la función. El código utilizado mostró los siguientes datos.&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# Calcular la temperatura máxima y mínima&lt;br /&gt;
max_temperature = np.max(Z)&lt;br /&gt;
min_temperature = np.min(Z)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Temperatura máxima:&amp;quot;, max_temperature)&lt;br /&gt;
print(&amp;quot;Temperatura mínima:&amp;quot;, min_temperature)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Encontrar las coordenadas donde se alcanza la temperatura máxima y mínima&lt;br /&gt;
max_index = np.unravel_index(np.argmax(Z), Z.shape)&lt;br /&gt;
min_index = np.unravel_index(np.argmin(Z), Z.shape)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
max_x, max_t = x_values[max_index[1]], t_values[max_index[0]]&lt;br /&gt;
min_x, min_t = x_values[min_index[1]], t_values[min_index[0]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Coordenadas de la temperatura máxima: (x={}, t={})&amp;quot;.format(max_x, max_t))&lt;br /&gt;
print(&amp;quot;Coordenadas de la temperatura mínima: (x={}, t={})&amp;quot;.format(min_x, min_t))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Resultados de temperatura máxima y mínima&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parámetro!! Valor&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura máxima|| \(0.92 ^\circ \text{C}\)&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura mínima|| \(-0.03 ^\circ \text{C}\)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Coordenadas de temperatura máxima y mínima&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Coordenadas !! Valor&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura máxima|| \((x=0.50, t=0.00)\)&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura mínima|| \((x=0.81, t=0.00)\)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Observamos que el máximo debería ser de &amp;lt;math&amp;gt; 1^\circ \text{C} &amp;lt;/math&amp;gt;. No obstante, el resultado reportado por el código es &amp;lt;math&amp;gt; 0.92 ^\circ \text{C} &amp;lt;/math&amp;gt;. Esto se debe al uso de la aproximación por series de Fourier. Lo mismo ocurre con el valor mínimo que debería se de &amp;lt;math&amp;gt; 0^\circ \text{C} &amp;lt;/math&amp;gt;, no obstante el código reporta &amp;lt;math&amp;gt;-0.03^\circ \text{C} &amp;lt;/math&amp;gt;. Además dichos puntos están en la frontera parabólica, como afirma el principio del máximo. &lt;br /&gt;
&lt;br /&gt;
En este punto es interesante verificar si nuestro modelo es correcto. En tal caso, el extremo izquierdo de la barra no debería perder calor. Por lo tanto, calculamos la derivada de nuestra expresión y, gracias a la Ley de Fick, sabemos que el flujo de calor es igual a la derivada cambiada de signo. Obtenemos los siguientes resultados:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Flujo_Pablo.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 100     # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x_values = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t_values = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino mi función condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficient(f, k, x):   # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    ck = 2* np.trapz(f(x) * np.sin(np.pi*(1/2+k)*x) ,x)&lt;br /&gt;
    return ck&lt;br /&gt;
&lt;br /&gt;
def derivative_solution_x(x, t, N): # Definir la derivada de la solución respecto a x&lt;br /&gt;
    result = 0&lt;br /&gt;
    for k in range(0, N+1):&lt;br /&gt;
        ck = fourier_coefficient(f, k, x_values)&lt;br /&gt;
        result += ck * np.pi * (1/2 + k) * np.cos(np.pi * (1/2 + k) * x) * np.exp(-1 * (np.pi**2) * (1/2 + k)**2 * t)&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
# Calcular la derivada de la solución respecto a x para los extremos x=0 y x=1 a lo largo del tiempo&lt;br /&gt;
flux_x0 = [-derivative_solution_x(0, t, N) for t in t_values]&lt;br /&gt;
flux_x1 = [-derivative_solution_x(1, t, N) for t in t_values]&lt;br /&gt;
&lt;br /&gt;
# Graficar el flujo en los extremos x=0 y x=1 a lo largo del tiempo&lt;br /&gt;
plt.figure(figsize=(8, 5))&lt;br /&gt;
plt.plot(t_values, flux_x0, label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t_values, flux_x1, label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Observamos que todo el calor aportado en el instante inicial se disipa completamente por la izquierda de la varilla, ya que el flujo en &amp;lt;math&amp;gt; x=1&amp;lt;/math&amp;gt; es nulo, verificando así las condiciones fronteras de nuestro problema.&lt;br /&gt;
&lt;br /&gt;
==Solución fundamental==&lt;br /&gt;
La solución fundamental de la ecuación del calor es una función que describe la distribución de temperatura en un medio en función del tiempo y la posición. Para la ecuación del calor unidimensional, la solución fundamental está dada por la fórmula:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\phi(x, t) = \frac{1}{2 \sqrt{\pi t}} \exp\left(-\frac{x^2}{t}\right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
La solución fundamental describe cómo el calor se propaga y difunde a lo largo del medio a medida que pasa el tiempo, en este caso, por ejemplo, el calor en un alambre. Además la solución general del problema de Cauchy es la solución fundamental de la ecuación del calor.&lt;br /&gt;
El problema de Cauchy es el siguiente:&lt;br /&gt;
Dada la ecuación diferencial parcial:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u_t = k \cdot u_{xx},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
junto con las siguientes condiciones iniciales:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, 0) = f(x)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
donde \( f(x) \) es una función dada en el dominio \( 0 \leq x \leq L \) y \( k \) es una constante positiva que representa la difusividad térmica del medio.&lt;br /&gt;
Para resolver el problema de Cauchy para la ecuación del calor es mediante el uso de la solución fundamental y la técnica de convolución. La solución fundamental \( \phi(x, t) \) de la ecuación del calor es una función especial que satisface la ecuación diferencial parcial y las condiciones iniciales dadas.&lt;br /&gt;
 &lt;br /&gt;
Para resolver el problema de Cauchy, podemos utilizar la solución fundamental \( \phi(x, t) \) en combinación con la función inicial \( u_0(x) \) para obtener la solución general \( u(x, t) \) en cualquier instante de tiempo \( t \). Esto se logra convolucionando la función inicial \( f(x) \) con la solución fundamental \( \phi(x, t) \) .&lt;br /&gt;
La solución \( u(x, t) \) del problema de Cauchy se puede expresar como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, t) = \int_{-\infty}^{\infty} \phi(x - y, t) f(y) \, dy&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
En primer lugar, procederemos a visualizar una representación tridimensional de la solución fundamental  \( \phi(x, t) \).&lt;br /&gt;
[[Archivo:Solfundi.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Definir la función que representa la solución fundamental de la ecuación del calor&lt;br /&gt;
def phi(x, t):&lt;br /&gt;
    return 1 / (2 * np.sqrt(np.pi * t)) * np.exp(-x**2 / t)&lt;br /&gt;
&lt;br /&gt;
# Definir los valores de x y t para la gráfica&lt;br /&gt;
x_values = np.linspace(-1, 1, 100)    # Valores de x&lt;br /&gt;
t_values = np.linspace(0.01, 1, 200)  # Valores de t (tiempo)&lt;br /&gt;
&lt;br /&gt;
# Crear una malla de valores de x y t&lt;br /&gt;
X, T = np.meshgrid(x_values, t_values)&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución fundamental para cada par de valores (x, t)&lt;br /&gt;
Z = phi(X, T)&lt;br /&gt;
&lt;br /&gt;
# Crear una figura en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
# Graficar la superficie 3D&lt;br /&gt;
surf = ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
# Etiquetas y título con el símbolo de &amp;quot;phi&amp;quot;&lt;br /&gt;
ax.set_xlabel(r'$x$')&lt;br /&gt;
ax.set_ylabel(r'$t$')&lt;br /&gt;
ax.set_zlabel(r'$\phi(x, t)$')&lt;br /&gt;
ax.set_title(r'Solución fundamental de la ecuación del calor: $\phi(x, t)$')&lt;br /&gt;
&lt;br /&gt;
# Añadir una barra de colores para indicar los valores de Z&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=8)&lt;br /&gt;
plt.show()    # Mostrar la gráfica&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
En esta ocasión veremos la solución de la ecuación del calor \( u_t - u_{xx} = 0 \) en \( x \in \mathbb{R} \) asociada al dato inicial \( f(x) = 1_{[-1,1]} \), viene dada por la convolución:&lt;br /&gt;
 &lt;br /&gt;
:&amp;lt;math&amp;gt; u(x, t) = \int_{-\infty}^{\infty} \phi(x - y, t) f(y) \, dy = \int_{-\infty}^{\infty} \frac{1}{2 \sqrt{\pi t}} \exp\left(-\frac{(x-y)^2}{t}\right) 1_{[-1,1]} \, dy &amp;lt;/math&amp;gt;&lt;br /&gt;
Dibujaremos la solución en diferentes instantes de tiempo: \( t = 0.001 \), \( t = 0.01 \) , \( t = 0.1 \), \( t = 1 \).  Aproximaremos la integral indefinida utilizando la fórmula del trapecio.&lt;br /&gt;
&lt;br /&gt;
[[Soluciondiferentet.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Definir la solución fundamental&lt;br /&gt;
def phi(x, t):&lt;br /&gt;
    return 1 / np.sqrt(4 * np.pi * t) * np.exp(-x**2 / (4 * t))&lt;br /&gt;
&lt;br /&gt;
def u0(x):&lt;br /&gt;
    return np.where(np.logical_and(x &amp;gt;= -1, x &amp;lt;= 1), 1, 0)&lt;br /&gt;
&lt;br /&gt;
# Definir el intervalo espacial y los instantes de tiempo&lt;br /&gt;
x = np.linspace(-5, 5, 1000)  # Valores de x&lt;br /&gt;
t_values = [0.001, 0.01, 0.1, 1]  # Valores de t (instantes de tiempo)&lt;br /&gt;
&lt;br /&gt;
# Crear una nueva figura para la gráfica&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
# Calcular y graficar la solución para diferentes instantes de tiempo&lt;br /&gt;
for t in t_values:&lt;br /&gt;
    u_x_t = []&lt;br /&gt;
    for xi in x:&lt;br /&gt;
        # Utilizar np.trapz para calcular la solución integral de la ecuación del calor&lt;br /&gt;
        u_x_t.append(np.trapz(phi(xi - x, t)*u0(x), x))&lt;br /&gt;
    plt.plot(x, u_x_t, label=f't = {t}')&lt;br /&gt;
&lt;br /&gt;
# Etiquetas y título de la gráfica&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('u(x, t)')&lt;br /&gt;
plt.title(f'Solución de $u_t - uxx = 0$ en x ∈ R con u0 (x) = [-1,1] en diferentes instantes de tiempo (usando numpy.trapz)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Solución fundamental dimensión 2==&lt;br /&gt;
&lt;br /&gt;
Veamos el problema de Cauchy para la ecuación del calor en dos dimensiones (\( x_1, x_2 \) y \( t \)). Sea \( u(x_1, x_2, t) \) la función de temperatura en un medio bidimensional, que satisface la ecuación del calor:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u_t = k(u_{x_1 x_1} + u_{x_2 x_2})&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Con las condiciones iniciales dadas por la temperatura inicial \( u(x_1, x_2, 0) = f(x_1, x_2) \) para algún campo de temperatura dado \( f(x_1, x_2)  \text{para} (x_1, x_2) \in \partial \Omega \), donde \( \Omega \) es el dominio bidimensional sobre el cual se define la temperatura.&lt;br /&gt;
La solución general a este problema (sin contar la condición inicial) viene dada por la siguiente expresión: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\phi(x_1, x_2, t) = \frac{1}{4 \pi t} \exp\left( -\frac{x_1^2 + x_2^2}{4t} \right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Procederemos ahora a representar la solución fundamental, donde veremos un gráfico tridimensional, &amp;lt;math&amp;gt; x_1, x_2, \phi(x_1, x_2, t) &amp;lt;/math&amp;gt; donde se ha fijado un tiempo t.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:gifgif.gif|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Definir la solución fundamental en 2D&lt;br /&gt;
def phi_2D(x1, x2, t):&lt;br /&gt;
    if t == 0:&lt;br /&gt;
        return np.zeros_like(x1)  # Devuelve una matriz de ceros si t es cero&lt;br /&gt;
    else:&lt;br /&gt;
        return 1 / (4 * np.pi * t) * np.exp(-(x1**2 + x2**2) / (4 * t))&lt;br /&gt;
&lt;br /&gt;
# Definir el intervalo espacial&lt;br /&gt;
x1_values = np.linspace(-1, 1, 100)  # Valores de x1&lt;br /&gt;
x2_values = np.linspace(-1, 1, 100)  # Valores de x2&lt;br /&gt;
x1, x2 = np.meshgrid(x1_values, x2_values)  # Malla de valores de x1 y x2&lt;br /&gt;
&lt;br /&gt;
# Definir los tiempos&lt;br /&gt;
t_values = np.linspace(0, 0.1, 3)  # Valores de tiempo&lt;br /&gt;
&lt;br /&gt;
# Tamaño de la figura&lt;br /&gt;
fig = plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
# Graficar la solución fundamental en 2D para cada tiempo&lt;br /&gt;
for i, t in enumerate(t_values, 1):&lt;br /&gt;
    ax = fig.add_subplot(1, len(t_values), i, projection='3d')&lt;br /&gt;
    phi = phi_2D(x1, x2, t)&lt;br /&gt;
    ax.plot_surface(x1, x2, phi, cmap='viridis')&lt;br /&gt;
    ax.set_title(f'Tiempo $t=${round(t, 3)}')&lt;br /&gt;
    ax.set_xlabel('x1')&lt;br /&gt;
    ax.set_ylabel('x2')&lt;br /&gt;
    ax.set_zlabel('phi(x1, x2, t)')&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor(Grupo_Eau_De_Parfum(EDP)))&amp;diff=70124</id>
		<title>Ecuación del calor(Grupo Eau De Parfum(EDP)))</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor(Grupo_Eau_De_Parfum(EDP)))&amp;diff=70124"/>
				<updated>2024-03-07T19:06:59Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Solución fundamental */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del Calor. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
==Introducción==&lt;br /&gt;
&lt;br /&gt;
==Conocimientos previos==&lt;br /&gt;
Antes de comenzar será de gran ayuda introducir una serie de conceptos que utilizaremos a lo largo este trabajo:&lt;br /&gt;
&lt;br /&gt;
*'''Ley del calor de Newton''': describe la tasa de pérdida o ganancia de calor de un objeto en relación con el ambiente circundante.La ley se expresa comúnmente como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d T(t)}{d t} = - k (T(t) - T_{\mathrm{a}}) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
siendo &amp;lt;math&amp;gt;T(t) &amp;lt;/math&amp;gt;la temperatura del objeto en un tiempo dado, &amp;lt;math&amp;gt;T_{\mathrm{a}}&amp;lt;/math&amp;gt; la temperatura ambiente y &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; la constante de proporcionalidad.&lt;br /&gt;
&lt;br /&gt;
*'''Principio de conservación de la energía calorífica''': establece que la variación de energía calorífica sobre un cuerpo V se debe al balance entre el calor que entra y sale del cuerpo más una producción externa.&lt;br /&gt;
&lt;br /&gt;
*'''Ley de Fourier''':intaura que el calor fluye desde regiones de alta temperatura a regiones de baja temperatura, y la cantidad de flujo de calor depende de la diferencia de temperatura y las propiedades del material.La expresión matemática de la Ley de Fourier es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{q}  = - k {\nabla} T &amp;lt;/math&amp;gt;,   &lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
donde &amp;lt;math&amp;gt; \mathbf{q}&amp;lt;/math&amp;gt; es el vector de flujo de calor por unidad de superficie y &amp;lt;math&amp;gt;  {\nabla} T &amp;lt;/math&amp;gt; es el gradiente del campo de temperatura en el interior del material.&lt;br /&gt;
*'''Coeficiente de conductividad térmica (D)''':cuantifica la capacidad de un material para conducir el calor. Se define como la cantidad de calor que pasa en un segundo a través de un metro cuadrado de material cuando la diferencia de temperatura a través del material,cuando la diferencia de temperatura a través del material es de un grado(ºC) es de un grado, y el espesor del material es de un metro.&lt;br /&gt;
*'''Principio del máximo''': Sea &amp;lt;math&amp;gt;u \in C^{2,1}(Q_T)\cap (\overline{Q_T})&amp;lt;/math&amp;gt; tal que  &amp;lt;math&amp;gt;u_t - \Delta u \leq 0&amp;lt;/math&amp;gt; en &amp;lt;math&amp;gt;Q_T&amp;lt;/math&amp;gt;. Entonces u alcanza su máximo en la frontera parabólica &amp;lt;math&amp;gt;\partial _p Q_T&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\max_{\overline{Q_T}} u = \max_{\partial _p Q_T} u&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nuestro problema original ==&lt;br /&gt;
Consideramos una varilla metálica de 1 metro de longitud , que se encuentra aislada por su superficie lateral, de manera que la conducción de calor únicamente se produce en la dirección longitudinal. La temperatura inicial de la varilla es de 0ºC. En el extremo izquierdo se consigue mantener la temperatura a 0 ºC mientras que en el derecho la temperatura es siempre de 1 ºC. Además  el calor específico toma un valor constante de 1.En cuanto al coeficiente de conductividad térmica,vamos a observar cómo sería nuestro problema para un valor cualquiera y seguidamente especificaremos el valor constante de 1.&lt;br /&gt;
&lt;br /&gt;
Pero antes de abordar matemáticamente nuestro problema, vamos a intentar deducir lo que podría ocurrir. Considerando que la temperatura en el extremo derecho de la varilla es superior a la del extremo izquierdo, el calor comenzará a transferirse desde la zona más cálida, elevando la temperatura a lo largo de la varilla y promoviendo el desplazamiento del calor hacia la región más fría. Simultáneamente, el incremento de la temperatura interna provoca una reducción del flujo de calor entrante y a un aumento del saliente con el tiempo. Anticipamos que, en algún momento, ambos flujos se equilibrarán, conduciendo la temperatura de la varilla a un estado estacionario.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por lo que nuestro problema a resolver queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - Du_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Debemos reescalar en tiempo, para facilitarnos los cálculos, por lo que realizamos el cambio de variable  &amp;lt;math&amp;gt;\tau = \alpha t, \tau \in\mathbb{R} &amp;lt;/math&amp;gt;. Por tanto,  &amp;lt;math&amp;gt; u(x,t)=U(x,\tau)&amp;lt;/math&amp;gt; y entonces &amp;lt;math&amp;gt; \alpha U_{\tau}-DU_{xx}=0&amp;lt;/math&amp;gt; .Tomando &amp;lt;math&amp;gt; \alpha = D&amp;lt;/math&amp;gt; , obtenemos el problema &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;U_{\tau} - U_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(0, \tau) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(1, \tau) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Este problema se resuelve mediante el método de variación de las constantes, pero un factor clave para su implementación es que las condiciones de contorno estén homogeneizadas, es decir, que sean igual a cero. Esto se conseguirá mediante un cambio de variable, en el que es imprescindible la llamada solución estacionaria.&lt;br /&gt;
La solución estacionaria de nuestro problema es aquella que no varía con el tiempo &amp;lt;math&amp;gt; v=\lim_{t \to \infty} U(x,\tau)&amp;lt;/math&amp;gt;y por tanto, su derivada  respecto al tiempo es nula. Nuestro sistema queda ahora:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;-v_{xx}   = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, \\&lt;br /&gt;
&amp;amp;v(0)= 0 \\&lt;br /&gt;
&amp;amp;v(1) = 1, &lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Resolviendo obtenemos que &amp;lt;math&amp;gt; v(x)=x &amp;lt;/math&amp;gt; es nuestra solución estacionaria, cuya expresión gráfica es:&lt;br /&gt;
[[Archivo:sofiaest1.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import numpy as np&lt;br /&gt;
# Define el rango de x entre 0 y 1&lt;br /&gt;
x = np.linspace(0, 1, 100)  &lt;br /&gt;
# Define la función  estacionaria v(x) = x&lt;br /&gt;
v_x = x&lt;br /&gt;
# Crea la gráfica&lt;br /&gt;
plt.plot(x, v_x)&lt;br /&gt;
# Etiquetas de los ejes&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('v(x)')&lt;br /&gt;
# Título de la gráfica&lt;br /&gt;
plt.title('Gráfica de la solución estacionaria v(x)=x')&lt;br /&gt;
# Muestra la gráfica&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Una vez hallada la solución estacionaria, podemos homogeneizar nuestro problema mediante el cambio de variable &amp;lt;math&amp;gt;w(x,t)= U(x,\tau)-v(x)&amp;lt;/math&amp;gt;.Por tanto, sustituyendo en el sistema inicial obtenemos:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;w_{\tau} - w_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(0, \tau) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(1, \tau) = 1-1=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(x, 0) = 0-x=-x, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Nuestro sistema es ya homogéneo,por lo que aplicamos el método de separación de variables (que consiste en expresar la solución como el producto de una función que depende únicamente de la variable espacial x y una función dependiente de la variable temporal) y obtenemos como solución homogénea:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;w(x,\tau) =  \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 \tau}\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Y deshaciendo los dos cambios de variable, nuestra solución al problema original es por tanto:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 Dt }\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Como en nuestro caso, el coeficiente de conductividad térmica es igual a 1, nuestro sistema es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - Du_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
y nuestra solución:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 t }\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Mostramos gráficamente la solución, observando que se cumplen las condiciones de frontera y además según avanza el tiempo, la solución deja de depender del tiempo y alcanza un estado estacionario, determinado justamente por la solución estacionaria obtenida anteriormente, &amp;lt;math&amp;gt; v(x)=x &amp;lt;/math&amp;gt;. Cabe destacar que en &amp;lt;math&amp;gt; t=0 &amp;lt;/math&amp;gt;  obtenemos las oscilaciones correspondientes a la serie de Fourier de la condición inicial, que se aproxima mediante senos.&lt;br /&gt;
[[Archivo:SOFIASOL11.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
# Solución usando los primeros N términos de la serie&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculasmos los coeficientes C_k&lt;br /&gt;
        C_k = 2 * (-1)**(k) / (k * np.pi)  &lt;br /&gt;
        sum += C_k * np.sin(k*np.pi * x) * np.exp(-lambda_k * t*D) &lt;br /&gt;
    return x+sum&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
&lt;br /&gt;
# Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12,8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x (m)')&lt;br /&gt;
ax.set_ylabel('Tiempo t (s)')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) (ºC)')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Flujo===&lt;br /&gt;
Para estudiar el flujo de calor saliente y entrante en ambos extremos de la varilla a lo largo del tiempo, nos debemos basar en la ley de Fourier &amp;lt;math&amp;gt; \mathbf{q}  = - k  u_x(x,t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Por lo que necesitamos obtener la derivada de la solución con respecto al espacio:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(x,t)= 1+\sum_{k=1}^{\infty}(-1)^{k+1}2 e^{-k^2\pi ^2 t }\cos(k\pi  x) &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Ahora, el flujo en los extremos es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(0,t)=1 +\sum_{k=1}^{\infty}(-1)^{k+1}2 e^{-k^2\pi ^2 t } &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(1,t)=1+\sum_{k=1}^{\infty}2 e^{-k^2\pi ^2 t } &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Gráficamente,&lt;br /&gt;
[[Archivo:SOFIAFLUJO1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
# Derivada de nuestra solución respecto al espacio, multiplicado por -k&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculamos los coeficientes C_k mediante extensión impar&lt;br /&gt;
        C_k = 2 * (-1)**(k+1)  &lt;br /&gt;
        sum += C_k * np.cos(k*np.pi * x) * np.exp(-lambda_k * t) &lt;br /&gt;
    return 1+sum&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(t, u(0,t,N), label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t, u(1,t,N), label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Al comenzar con un flujo de calor nulo en el extremo izquierdo, esto  indica que hay una gran diferencia de temperatura entre ambos extremos de la varilla. El extremo izquierdo está perdiendo calor rápidamente hacia la zona más fría. A medida que el calor se va transfiriendo por la varilla, el gradiente de la temperatura cambia y el extremo derecho comienza a calentarse, debido al flujo de calor que proviene del otro extremo. Este cambio conduce a que el flujo en ambos extremos comience a estar en equilibrio. &lt;br /&gt;
Esta estabilización de flujo en -1 refleja que se ha alcanzado un estado estacionario en el sistema, indicando que cualquier calor entrante en la varilla, se compensa con el calor saliente, manteniendo una distribución de temperatura uniforme.&lt;br /&gt;
&lt;br /&gt;
Este comportamiento refleja la Ley de Fourier, donde al principio la gran diferencia de temperatura induce un flujo de calor bastante significativo, que se va estabilizando llegando a un flujo de -1 en ambos extremos, alcanzando así un gradiente de temperatura constante, con la misma cantidad de calor saliendo hacia fuera desde ambos extremos.&lt;br /&gt;
&lt;br /&gt;
==Cambio de coeficiente de conductividad térmica ==&lt;br /&gt;
Hemos estudiado el problema de Cauchy para un coeficiente de difusión de 1,veamos que ocurre si lo disminuimos a su mitad, es decir,&amp;lt;math&amp;gt;D=\frac{1}{2}&amp;lt;/math&amp;gt;.Nuestro nuevo problema por tanto es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - \frac{1}{2}u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuya solución es &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {\frac{-k^2\pi ^2 t}{2}}\sin(k\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gráficamente, únicamente hemos cambiado el valor de D en el código (2)  y obtenemos:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:SOFIASOL22.png|400px|thumb|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1/2       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
# Solución usando los primeros N términos de la serie&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculasmos los coeficientes C_k&lt;br /&gt;
        C_k = 2 * (-1)**(k) / (k * np.pi)  &lt;br /&gt;
        sum += C_k * np.sin(k*np.pi * x) * np.exp(-lambda_k * t*D) &lt;br /&gt;
    return x+sum&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
# Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12,8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
ax.set_xlabel('Posición x (m)')&lt;br /&gt;
ax.set_ylabel('Tiempo t (s)')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) (ºC)')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
No se puede apreciar ninguna diferencia aparente entre las soluciones para los diferentes coeficientes. Para observar algún cambio vamos a dibujar la diferencia entre la solución y el estado estacionario en &amp;lt;math&amp;gt; x = 1/2&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt; t \in [0, 1]&amp;lt;/math&amp;gt;, es decir &amp;lt;math&amp;gt;u(1/2, t) − v(1/2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
[[Archivo:SOFIACCT1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
x=0.5&lt;br /&gt;
# Definir la función de temperatura con un número limitado de términos en la serie&lt;br /&gt;
def u(x, t, alpha, n_terms=10):   &lt;br /&gt;
    sum_series = sum(2 * (-1)**(k + 1) / (k * np.pi) * np.sin(k * np.pi * x) * np.exp(-k**2 * np.pi**2 * alpha * t) for k in range(1, n_terms + 1))&lt;br /&gt;
    return  x - sum_series&lt;br /&gt;
# Intervalo de tiempo&lt;br /&gt;
t = np.linspace(0, 1, 100)&lt;br /&gt;
# Calcular la temperatura en x=1/2 para diferentes alphas&lt;br /&gt;
u_k1 = u(0.5, t, alpha=1)-x  # D=1, correspondiente a alpha=1&lt;br /&gt;
u_k_half = u(0.5, t, alpha=0.5)-x  # D=1/2, correspondiente a alpha=0.5&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.plot(t, u_k1, label='k=1', color='blue')&lt;br /&gt;
plt.plot(t, u_k_half, label='k=1/2', color='red')&lt;br /&gt;
plt.xlabel('Tiempo (s)')&lt;br /&gt;
plt.ylabel('u(1/2, t) − v(1/2)')&lt;br /&gt;
plt.title('Efecto del Coeficiente de Conductividad Térmica ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El coeficiente de conductividad térmica juega un papel fundamental en determinar la velocidad a la que se propaga la temperatura dentro de un material. Al disminuir este coeficiente a la mitad, el proceso de conducción térmica a través de la varilla experimenta una notable ralentización. Esto se traduce en que, en cualquier instante dado t, la distribución de la temperatura a lo largo de la varilla VA avanzando a la mitad de velocidad en comparación con un escenario donde el coeficiente de conductividad térmica es de 1. Dicho cambio incide directamente en la rapidez con que se logra el equilibrio térmico en la varilla, Resultando en una difusión térmica más lenta hacia el equilibrio.&lt;br /&gt;
&lt;br /&gt;
== Cambio de condiciones ==&lt;br /&gt;
Supongamos ahora una barra unidimensional con extremos fijos a una temperatura de &amp;lt;math&amp;gt;0^\circ C&amp;lt;/math&amp;gt;. La temperatura inicial en cualquier punto de la barra está dada por la función &amp;lt;math&amp;gt;u(x,0) = max\{0, 1−4|x−1/2|\}&amp;lt;/math&amp;gt;, lo que significa que inicialmente la temperatura en la barra varía de acuerdo con esta función.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = max\{0, 1−4|x−1/2|\}, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Supongamos que, en tiempo infinito, \( t \rightarrow \infty \), se llega a una solución estacionaria y que, por tanto, ya no varía en tiempo. De modo, que tomando esta suposición llegamos al siguiente sistema con \( u(x,t) \xrightarrow{\text{t tiende a }\infty} v(x) \).&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;v_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,   \\&lt;br /&gt;
&amp;amp;v(0) = 0, &amp;amp; \\&lt;br /&gt;
&amp;amp;v(1) = 0, &amp;amp;  &lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuya solución es la constante \( v(x)=0 \). De modo que el sistema homogeneizado, coincide con el original, pues \( w(x,t)=u(x,t)-v(x) =u(x,t)-0=u(x,t)\) &lt;br /&gt;
Antes de exigir la condición inicial, la solución coincide con la del primer apartado, pues nos encontramos ante la misma ecuación diferencial, salvo por la función \( u(x,0)\), la cual no toma parte hasta el final de la resolución de esta suponiendo separación de variables. De modo que&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t) = \sum_{k=1}^{\infty} C_k  e^{(-k^2\pi ^2 t )}\sin(k \pi  x)&amp;lt;/math&amp;gt; &lt;br /&gt;
Para hallar el valor de los coeficientes &amp;lt;math&amp;gt; C_k&amp;lt;/math&amp;gt;, buscamos la serie de Fourier de la función &amp;lt;math&amp;gt; max\{0, 1−4|x−1/2|\}&amp;lt;/math&amp;gt; extendida de forma impar. Esto es posible, ya que&lt;br /&gt;
:&amp;lt;math&amp;gt; \int^1_0 (max\{0, 1−4|x−1/2|\})^2 dx=0.1667 &amp;lt; \infty&amp;lt;/math&amp;gt;  &lt;br /&gt;
El cálculo de los coeficientes se ha realizado numéricamente aproximando por la fórmula del trapecio. Los coeficientes se pueden consultar ejecutando el siguiente código en Python&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np &lt;br /&gt;
def f(x):   # Defino función que se quiere aproximar&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x):&lt;br /&gt;
    coefficients = np.zeros(n) # Guardo los coeficientes en una lista&lt;br /&gt;
    for k in range(1,n+1):     # Compiezo en k=1, pues sin(0)=0&lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients&lt;br /&gt;
&lt;br /&gt;
fourier_coefficients(f, 10, np.linspace(0, 1, 1000))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
De modo que ya se ha calculado la solución de este nuevo problema. Visualmente, responde a la siguiente gráfica, resultado de ejecutar este código:&lt;br /&gt;
[[Archivo:Solucion_Celia.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)    # Generar una cuadrícula de puntos&lt;br /&gt;
&lt;br /&gt;
def f(x):    # Defino mi función condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x): # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    coefficients = np.zeros(n)&lt;br /&gt;
    for k in range(1,n+1):         # Comenzamos en 1, pues sen(0)=0&lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients.tolist()   # Convertir a lista&lt;br /&gt;
coef=fourier_coefficients(f, N, x)&lt;br /&gt;
&lt;br /&gt;
def u(x, t, n): # Definir la solución en términos de la serie de Fourier con N términos&lt;br /&gt;
    sum = 0                 # Almacenamos la suma (resultado) hasta el término 10&lt;br /&gt;
    for k in range(1, n+1): # Para cada k calculo el lambda y sumo su coeficiente respectivo&lt;br /&gt;
        lambda_k = k* np.pi&lt;br /&gt;
        sum += coef[k-1] * np.sin(lambda_k * x) * np.exp(-lambda_k**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
Z = u(X, T, N) # Calcular los valores de la función para cada par (x, t)&lt;br /&gt;
&lt;br /&gt;
# Graficar la función en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))  # Cambio aquí para hacer la figura más grande&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z,cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x [m]')&lt;br /&gt;
ax.set_ylabel('Tiempo t [s]')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) [ºC]')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)  #Añado una guía de colores&lt;br /&gt;
surf.set_clim(0, 1)                       # Le introduzco cota inf/sup a los colores&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
​[[Archivo:gifcelia.gif|400px|right|]]&lt;br /&gt;
Vemos como la temperatura sufre una gran variación en tiempos cercanos a 0, y rápidamente tiende a su estado estacionario, &amp;lt;math&amp;gt;v(x)=0&amp;lt;/math&amp;gt;. Para poder visualizarlo mejor mostraremos una un gif donde la imagen cambia a medida que el tiempo pasa, restringido a &amp;lt;math&amp;gt;t \in [0,0.3]&amp;lt;/math&amp;gt;, pues a partir de ahí, la temperatura está suficientemente cerca de la estacionaria y, por tanto, no hay gran variación en la temperatura.&lt;br /&gt;
&lt;br /&gt;
En un inicio, en \(t=0\) la temperatura toma valores negativos. Esto debido a que la exponencial se anula y son los coeficientes de Fourier quienes exigen el signo de la función. Una vez que &amp;lt;math&amp;gt;t&amp;gt;0&amp;lt;/math&amp;gt;, u se hace positivo en todas partes, lo que significa que la temperatura se difunde casi instantáneamente a lo largo del eje x, resultando en una velocidad de propagación infinita. Es decir, cualquier perturbación se siente enseguida en toda parte del dominio.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Terminamos el estudio de esta ecuación de difusión con el estudio del flujo, la inversa de la variación de la variable x de la solución. Para ello derivamos la solución que hemos obtenido. En términos de &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;, puesto que no son dependientes de x, obtenemos:&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{\partial}{\partial x}u(x,t)=\sum_{k=1}^{\infty} C_k  e^{(-k^2\pi ^2 t )}\cos(k \pi  x)\frac{1}{k \pi}&amp;lt;/math&amp;gt; como flujo de la ecuación homogénea. Adjuntamos el código con el cual se ha calculado la expresión de forma numérica y su respectiva representación gráfica:&lt;br /&gt;
[[Archivo:Flujo_Celia.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino la función de la ci para hallar los coef&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x): # Hallo los coef de Fourier  &lt;br /&gt;
    coefficients = np.zeros(n)&lt;br /&gt;
    for k in range(1,n+1): &lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients.tolist()   # Convertir a lista&lt;br /&gt;
coef=fourier_coefficients(f, N, x)&lt;br /&gt;
&lt;br /&gt;
def u(x, t, n):  # Definir la derivada en términos de la serie de Fourier con N términos&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, n+1):&lt;br /&gt;
        lambda_k = k* np.pi&lt;br /&gt;
        sum += coef[k-1] *np.cos(k * np.pi * x)/(k * np.pi) * np.exp(-lambda_k**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
# Graficamos&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(t, u(0,t,N), label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t, u(1,t,N), label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Varilla con extremo aislado==&lt;br /&gt;
En este estudio modelamos la difusión del calor en un alambre. Inicialmente, consideramos un alambre con una temperatura inicial de \( 0^\circ C \) en su extremo izquierdo. En contraste, el extremo derecho del alambre está aislado térmicamente, lo que significa que no hay transferencia de calor a través de este. En nuestro análisis, introducimos una fuente de calor en el centro del alambre en el instante inicial. Luego, examinamos cómo se propaga y se distribuye esta fuente de calor a lo largo del alambre con el tiempo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u_x(1, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = max\{0, 1−4|x−1/2|\}, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que la barra se encuentra aislada térmicamente en su extremo en \( x = 1 \) implica que no hay flujo de calor a través de este extremo. La ley de Fick, establece que el flujo de calor es proporcional al gradiente de temperatura según la ecuación \( q = -k \frac{du}{dx} \), donde \( q \) es el flujo de calor, \( k \) es la conductividad térmica y \( \frac{du}{dx} \) es el gradiente de temperatura a lo largo de la barra. En este contexto, si el flujo en dicho extremo es nulo, el gradiente de temperatura es nulo, por tanto  \( u_x(1, t) = 0 \). Observamos además que la solución estacionaria en nuestro caso es \( v(x) = 0 \), pues es la solución del problema de contorno.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
v''(x) = 0, \quad v(0) = 0, \quad v'(1) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De forma análoga a como ocurría en el apartado anterior, el problema que estamos estudiando en este caso es homogéneo. Por tanto, sin necesidad de hacer ningún cambio, procedemos a resolverlo mediante el método de separación de variables. Suponiendo que \( u(x, t) = X(x) \cdot T(t) \). Obtenemos como solución \( X(x) = A \sin(\pi(1/2+k)x) \) y \( T(t) = B e^{-(\pi^2)(1/2+k)^2 t} \). De modo que, la solución sin tener en cuenta la condición inicial es:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u_k(x, t) = c_k \cdot \sin(\pi(1/2+k)x) \cdot e^{-(\pi^2)(1/2+k)^2 t}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Para asegurar la existencia de solución del problema, es necesario verificar si existen ciertos coeficientes \( c_k \) tal que la solución pueda ser definida como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, t) = \sum_{k=0}^{\infty} c_k \cdot \sin(\pi(1/2+k)x) \cdot e^{-(\pi^2)(1/2+k)^2 t}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Para ello, es necesario verificar que las autofunciones \( \{\sin(\pi(1/2+k)x)\}_{k=0}^{\infty} \) forman un conjunto completo en \( L^2 [0, 1]\)  y ortogonal.&lt;br /&gt;
 &lt;br /&gt;
Para comprobar la ortogonalidad entre las autofunciones, calculamos la integral de su producto, o lo que es igual a calcular el producto escalar de \( L^2 [0,1]\), para dos funciones distintas \( \sin(\pi(1/2+k)x) \) y \( \sin(\pi(1/2+m)x) \) con \( k \neq m \in \mathbb{N}\):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{1} \sin(\pi(1/2+k)x) \sin(\pi(1/2+m)x) \, dx = \frac{\sin((k - m) \pi)}{2 (k - m) \pi} - \frac{\sin((1 + k + m) \pi)}{2 (1 + k + m) \pi}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Esta integral se anula para \( k,m \in  \mathbb{N} \), lo que demuestra que las autofunciones son ortogonales entre sí en el intervalo \([0, 1]\).&lt;br /&gt;
Por otro lado, dado que demostrar que las funciones forman una base completa para el espacio \( L^2[0,1] \) puede ser un proceso complejo y requiere un análisis detallado, en este trabajo supondremos que la forman.&lt;br /&gt;
[[Archivo:Solucion_Pablo.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)    # Generar una cuadrícula de puntos&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino mi fucnión condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficient(f, k, x):  # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    ck = 2* np.trapz(f(x) * np.sin(np.pi*(1/2+k)*x) ,x)&lt;br /&gt;
    return ck&lt;br /&gt;
&lt;br /&gt;
# Definir la solución en términos de la serie de Fourier con N términos&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0                 # Almacenamos la suma hasta el término 10&lt;br /&gt;
    for k in range(0, N+1): # Para cada k cálculo su coeficiente y lo sumo al resultado&lt;br /&gt;
        ck = fourier_coefficient(f, k, x)&lt;br /&gt;
        sum += ck * np.sin(np.pi*(1/2+k)*x) * np.exp(-(np.pi**2)*(1/2+k)**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Z = u(X, T, N)  # Calcular los valores de la función para cada par (x, t)&lt;br /&gt;
&lt;br /&gt;
# Graficar la función en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z,cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x [m]')&lt;br /&gt;
ax.set_ylabel('Tiempo t [s]')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) [ºC]')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)  #Añado una guía de colores&lt;br /&gt;
surf.set_clim(0, 1)                       # Le introduzco cota inf/sup a los colores&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gracias a los desarrollos en serie de Fourier, podemos calcular los coeficientes \( c_k \) para cumplir así la condición inicial. Dichos coeficientes se calculan mediante la integral:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_k := \frac{\int_{0}^{1} \max\{0, 1 - 4(x - 1/2)\} \sin(\pi(1/2+k)x) \, dx}{\int_{0}^{1} \sin^2(\pi(1/2+k)x) \, dx}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Dado que la integral es difícil de calcular analíticamente y en consecuencia es difícil obtener una expresión dependiente del parámetro &amp;lt;math&amp;gt; k&amp;lt;/math&amp;gt;, la resolveremos de forma numérica mediante el método del trapecio, de forma análoga a como se hizo en el modelo sin aislante térmico previo.&lt;br /&gt;
Para una comprensión más completa de la evolución de la temperatura del alambre en cuestión, es importante realizar un análisis visual de la solución propuesta. La representación gráfica de la solución en el intervalo de tiempo \( t \in [0, 1] \), considerando los primeros 10 términos de la serie de Fourier, ofrece una visualización tridimensional de la distribución del calor a lo largo del alambre en función del tiempo.&lt;br /&gt;
 &lt;br /&gt;
Es relevante destacar que a medida que transcurre el tiempo, la solución converge gradualmente hacia su estado estacionario, es decir, \(  v(x)=0 \) . Además, observamos que se verifica el principio del máximo, dado que tanto la temperatura máxima y mínima se alcanza en la frontera parabólica.&lt;br /&gt;
Esta última afirmación la podemos verificar de forma sencilla, obteniendo ambos valores de la función. El código utilizado mostró los siguientes datos.&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# Calcular la temperatura máxima y mínima&lt;br /&gt;
max_temperature = np.max(Z)&lt;br /&gt;
min_temperature = np.min(Z)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Temperatura máxima:&amp;quot;, max_temperature)&lt;br /&gt;
print(&amp;quot;Temperatura mínima:&amp;quot;, min_temperature)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Encontrar las coordenadas donde se alcanza la temperatura máxima y mínima&lt;br /&gt;
max_index = np.unravel_index(np.argmax(Z), Z.shape)&lt;br /&gt;
min_index = np.unravel_index(np.argmin(Z), Z.shape)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
max_x, max_t = x_values[max_index[1]], t_values[max_index[0]]&lt;br /&gt;
min_x, min_t = x_values[min_index[1]], t_values[min_index[0]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Coordenadas de la temperatura máxima: (x={}, t={})&amp;quot;.format(max_x, max_t))&lt;br /&gt;
print(&amp;quot;Coordenadas de la temperatura mínima: (x={}, t={})&amp;quot;.format(min_x, min_t))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Resultados de temperatura máxima y mínima&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parámetro!! Valor&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura máxima|| \(0.92 ^\circ \text{C}\)&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura mínima|| \(-0.03 ^\circ \text{C}\)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Coordenadas de temperatura máxima y mínima&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Coordenadas !! Valor&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura máxima|| \((x=0.50, t=0.00)\)&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura mínima|| \((x=0.81, t=0.00)\)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Observamos que el máximo debería ser de &amp;lt;math&amp;gt; 1^\circ \text{C} &amp;lt;/math&amp;gt;. No obstante, el resultado reportado por el código es &amp;lt;math&amp;gt; 0.92 ^\circ \text{C} &amp;lt;/math&amp;gt;. Esto se debe al uso de la aproximación por series de Fourier. Lo mismo ocurre con el valor mínimo que debería se de &amp;lt;math&amp;gt; 0^\circ \text{C} &amp;lt;/math&amp;gt;, no obstante el código reporta &amp;lt;math&amp;gt;-0.03^\circ \text{C} &amp;lt;/math&amp;gt;. Además dichos puntos están en la frontera parabólica, como afirma el principio del máximo. &lt;br /&gt;
&lt;br /&gt;
En este punto es interesante verificar si nuestro modelo es correcto. En tal caso, el extremo izquierdo de la barra no debería perder calor. Por lo tanto, calculamos la derivada de nuestra expresión y, gracias a la Ley de Fick, sabemos que el flujo de calor es igual a la derivada cambiada de signo. Obtenemos los siguientes resultados:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Flujo_Pablo.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 100     # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x_values = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t_values = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino mi función condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficient(f, k, x):   # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    ck = 2* np.trapz(f(x) * np.sin(np.pi*(1/2+k)*x) ,x)&lt;br /&gt;
    return ck&lt;br /&gt;
&lt;br /&gt;
def derivative_solution_x(x, t, N): # Definir la derivada de la solución respecto a x&lt;br /&gt;
    result = 0&lt;br /&gt;
    for k in range(0, N+1):&lt;br /&gt;
        ck = fourier_coefficient(f, k, x_values)&lt;br /&gt;
        result += ck * np.pi * (1/2 + k) * np.cos(np.pi * (1/2 + k) * x) * np.exp(-1 * (np.pi**2) * (1/2 + k)**2 * t)&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
# Calcular la derivada de la solución respecto a x para los extremos x=0 y x=1 a lo largo del tiempo&lt;br /&gt;
flux_x0 = [-derivative_solution_x(0, t, N) for t in t_values]&lt;br /&gt;
flux_x1 = [-derivative_solution_x(1, t, N) for t in t_values]&lt;br /&gt;
&lt;br /&gt;
# Graficar el flujo en los extremos x=0 y x=1 a lo largo del tiempo&lt;br /&gt;
plt.figure(figsize=(8, 5))&lt;br /&gt;
plt.plot(t_values, flux_x0, label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t_values, flux_x1, label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Observamos que todo el calor aportado en el instante inicial se disipa completamente por la izquierda de la varilla, ya que el flujo en &amp;lt;math&amp;gt; x=1&amp;lt;/math&amp;gt; es nulo, verificando así las condiciones fronteras de nuestro problema.&lt;br /&gt;
&lt;br /&gt;
==Solución fundamental==&lt;br /&gt;
La solución fundamental de la ecuación del calor es una función que describe la distribución de temperatura en un medio en función del tiempo y la posición. Para la ecuación del calor unidimensional, la solución fundamental está dada por la fórmula:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\phi(x, t) = \frac{1}{2 \sqrt{\pi t}} \exp\left(-\frac{x^2}{t}\right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
La solución fundamental describe cómo el calor se propaga y difunde a lo largo del medio a medida que pasa el tiempo, en este caso, por ejemplo, el calor en un alambre. Además la solución general del problema de Cauchy es la solución fundamental de la ecuación del calor.&lt;br /&gt;
El problema de Cauchy es el siguiente:&lt;br /&gt;
Dada la ecuación diferencial parcial:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u_t = k \cdot u_{xx},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
junto con las siguientes condiciones iniciales:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, 0) = f(x)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
donde \( f(x) \) es una función dada en el dominio \( 0 \leq x \leq L \) y \( k \) es una constante positiva que representa la difusividad térmica del medio.&lt;br /&gt;
Para resolver el problema de Cauchy para la ecuación del calor es mediante el uso de la solución fundamental y la técnica de convolución. La solución fundamental \( \phi(x, t) \) de la ecuación del calor es una función especial que satisface la ecuación diferencial parcial y las condiciones iniciales dadas.&lt;br /&gt;
 &lt;br /&gt;
Para resolver el problema de Cauchy, podemos utilizar la solución fundamental \( \phi(x, t) \) en combinación con la función inicial \( u_0(x) \) para obtener la solución general \( u(x, t) \) en cualquier instante de tiempo \( t \). Esto se logra convolucionando la función inicial \( f(x) \) con la solución fundamental \( \phi(x, t) \) .&lt;br /&gt;
La solución \( u(x, t) \) del problema de Cauchy se puede expresar como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, t) = \int_{-\infty}^{\infty} \phi(x - y, t) f(y) \, dy&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
En primer lugar, procederemos a visualizar una representación tridimensional de la solución fundamental  \( \phi(x, t) \).&lt;br /&gt;
[[Archivo:Solfundi.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Definir la función que representa la solución fundamental de la ecuación del calor&lt;br /&gt;
def phi(x, t):&lt;br /&gt;
    return 1 / (2 * np.sqrt(np.pi * t)) * np.exp(-x**2 / t)&lt;br /&gt;
&lt;br /&gt;
# Definir los valores de x y t para la gráfica&lt;br /&gt;
x_values = np.linspace(-1, 1, 100)    # Valores de x&lt;br /&gt;
t_values = np.linspace(0.01, 1, 200)  # Valores de t (tiempo)&lt;br /&gt;
&lt;br /&gt;
# Crear una malla de valores de x y t&lt;br /&gt;
X, T = np.meshgrid(x_values, t_values)&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución fundamental para cada par de valores (x, t)&lt;br /&gt;
Z = phi(X, T)&lt;br /&gt;
&lt;br /&gt;
# Crear una figura en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
# Graficar la superficie 3D&lt;br /&gt;
surf = ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
# Etiquetas y título con el símbolo de &amp;quot;phi&amp;quot;&lt;br /&gt;
ax.set_xlabel(r'$x$')&lt;br /&gt;
ax.set_ylabel(r'$t$')&lt;br /&gt;
ax.set_zlabel(r'$\phi(x, t)$')&lt;br /&gt;
ax.set_title(r'Solución fundamental de la ecuación del calor: $\phi(x, t)$')&lt;br /&gt;
&lt;br /&gt;
# Añadir una barra de colores para indicar los valores de Z&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=8)&lt;br /&gt;
plt.show()    # Mostrar la gráfica&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
En esta ocasión veremos la solución de la ecuación del calor \( u_t - u_{xx} = 0 \) en \( x \in \mathbb{R} \) asociada al dato inicial \( f(x) = 1_{[-1,1]} \), viene dada por la convolución:&lt;br /&gt;
 &lt;br /&gt;
:&amp;lt;math&amp;gt; u(x, t) = \int_{-\infty}^{\infty} \phi(x - y, t) f(y) \, dy = \int_{-\infty}^{\infty} \frac{1}{2 \sqrt{\pi t}} \exp\left(-\frac{(x-y)^2}{t}\right) 1_{[-1,1]} \, dy &amp;lt;/math&amp;gt;&lt;br /&gt;
Dibujaremos la solución en diferentes instantes de tiempo: \( t = 0.001 \), \( t = 0.01 \) , \( t = 0.1 \), \( t = 1 \).  Aproximaremos la integral indefinida utilizando la fórmula del trapecio.&lt;br /&gt;
&lt;br /&gt;
[[Soluciondiferentet.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Definir la solución fundamental&lt;br /&gt;
def phi(x, t):&lt;br /&gt;
    return 1 / np.sqrt(4 * np.pi * t) * np.exp(-x**2 / (4 * t))&lt;br /&gt;
&lt;br /&gt;
def u0(x):&lt;br /&gt;
    return np.where(np.logical_and(x &amp;gt;= -1, x &amp;lt;= 1), 1, 0)&lt;br /&gt;
&lt;br /&gt;
# Definir el intervalo espacial y los instantes de tiempo&lt;br /&gt;
x = np.linspace(-5, 5, 1000)  # Valores de x&lt;br /&gt;
t_values = [0.001, 0.01, 0.1, 1]  # Valores de t (instantes de tiempo)&lt;br /&gt;
&lt;br /&gt;
# Crear una nueva figura para la gráfica&lt;br /&gt;
plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
# Calcular y graficar la solución para diferentes instantes de tiempo&lt;br /&gt;
for t in t_values:&lt;br /&gt;
    u_x_t = []&lt;br /&gt;
    for xi in x:&lt;br /&gt;
        # Utilizar np.trapz para calcular la solución integral de la ecuación del calor&lt;br /&gt;
        u_x_t.append(np.trapz(phi(xi - x, t)*u0(x), x))&lt;br /&gt;
    plt.plot(x, u_x_t, label=f't = {t}')&lt;br /&gt;
&lt;br /&gt;
# Etiquetas y título de la gráfica&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('u(x, t)')&lt;br /&gt;
plt.title(f'Solución de $u_t - uxx = 0$ en x ∈ R con u0 (x) = [-1,1] en diferentes instantes de tiempo (usando numpy.trapz)')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Solución fundamental dimensión 2==&lt;br /&gt;
&lt;br /&gt;
Veamos el problema de Cauchy para la ecuación del calor en dos dimensiones (\( x_1, x_2 \) y \( t \)). Sea \( u(x_1, x_2, t) \) la función de temperatura en un medio bidimensional, que satisface la ecuación del calor:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u_t = k(u_{x_1 x_1} + u_{x_2 x_2})&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Con las condiciones iniciales dadas por la temperatura inicial \( u(x_1, x_2, 0) = f(x_1, x_2) \) para algún campo de temperatura dado \( f(x_1, x_2)  \text{para} (x_1, x_2) \in \partial \Omega \), donde \( \Omega \) es el dominio bidimensional sobre el cual se define la temperatura.&lt;br /&gt;
La solución general a este problema (sin contar la condición inicial) viene dada por la siguiente expresión: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\phi(x_1, x_2, t) = \frac{1}{4 \pi t} \exp\left( -\frac{x_1^2 + x_2^2}{4t} \right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Procederemos ahora a representar la solución fundamental, donde veremos un gráfico tridimensional, &amp;lt;math&amp;gt; x_1, x_2, \phi(x_1, x_2, t) &amp;lt;/math&amp;gt; donde se ha fijado un tiempo t.&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Soluciondiferentet.png&amp;diff=70122</id>
		<title>Archivo:Soluciondiferentet.png</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Soluciondiferentet.png&amp;diff=70122"/>
				<updated>2024-03-07T19:05:37Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor(Grupo_Eau_De_Parfum(EDP)))&amp;diff=70117</id>
		<title>Ecuación del calor(Grupo Eau De Parfum(EDP)))</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor(Grupo_Eau_De_Parfum(EDP)))&amp;diff=70117"/>
				<updated>2024-03-07T19:01:18Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Cambio de condiciones */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del Calor. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
==Introducción==&lt;br /&gt;
&lt;br /&gt;
==Conocimientos previos==&lt;br /&gt;
Antes de comenzar será de gran ayuda introducir una serie de conceptos que utilizaremos a lo largo este trabajo:&lt;br /&gt;
&lt;br /&gt;
*'''Ley del calor de Newton''': describe la tasa de pérdida o ganancia de calor de un objeto en relación con el ambiente circundante.La ley se expresa comúnmente como:&lt;br /&gt;
:&amp;lt;math&amp;gt; \frac{d T(t)}{d t} = - k (T(t) - T_{\mathrm{a}}) &amp;lt;/math&amp;gt;,&lt;br /&gt;
siendo &amp;lt;math&amp;gt;T(t) &amp;lt;/math&amp;gt;la temperatura del objeto en un tiempo dado, &amp;lt;math&amp;gt;T_{\mathrm{a}}&amp;lt;/math&amp;gt; la temperatura ambiente y &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; la constante de proporcionalidad.&lt;br /&gt;
&lt;br /&gt;
*'''Principio de conservación de la energía calorífica''': establece que la variación de energía calorífica sobre un cuerpo V se debe al balance entre el calor que entra y sale del cuerpo más una producción externa.&lt;br /&gt;
&lt;br /&gt;
*'''Ley de Fourier''':intaura que el calor fluye desde regiones de alta temperatura a regiones de baja temperatura, y la cantidad de flujo de calor depende de la diferencia de temperatura y las propiedades del material.La expresión matemática de la Ley de Fourier es:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathbf{q}  = - k {\nabla} T &amp;lt;/math&amp;gt;,   &lt;br /&gt;
donde &amp;lt;math&amp;gt; \mathbf{q}&amp;lt;/math&amp;gt; es el vector de flujo de calor por unidad de superficie y &amp;lt;math&amp;gt;  {\nabla} T &amp;lt;/math&amp;gt; es el gradiente del campo de temperatura en el interior del material.&lt;br /&gt;
*'''Coeficiente de conductividad térmica (D)''':cuantifica la capacidad de un material para conducir el calor. Se define como la cantidad de calor que pasa en un segundo a través de un metro cuadrado de material cuando la diferencia de temperatura a través del material,cuando la diferencia de temperatura a través del material es de un grado(ºC) es de un grado, y el espesor del material es de un metro.&lt;br /&gt;
*'''Principio del máximo''': Sea &amp;lt;math&amp;gt;u \in C^{2,1}(Q_T)\cap (\overline{Q_T})&amp;lt;/math&amp;gt; tal que  &amp;lt;math&amp;gt;u_t - \Delta u \leq 0&amp;lt;/math&amp;gt; en &amp;lt;math&amp;gt;Q_T&amp;lt;/math&amp;gt;. Entonces u alcanza su máximo en la frontera parabólica &amp;lt;math&amp;gt;\partial _p Q_T&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\max_{\overline{Q_T}} u = \max_{\partial _p Q_T} u&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nuestro problema original ==&lt;br /&gt;
Consideramos una varilla metálica de 1 metro de longitud , que se encuentra aislada por su superficie lateral, de manera que la conducción de calor únicamente se produce en la dirección longitudinal. La temperatura inicial de la varilla es de 0ºC. En el extremo izquierdo se consigue mantener la temperatura a 0 ºC mientras que en el derecho la temperatura es siempre de 1 ºC. Además  el calor específico toma un valor constante de 1.En cuanto al coeficiente de conductividad térmica,vamos a observar cómo sería nuestro problema para un valor cualquiera y seguidamente especificaremos el valor constante de 1.&lt;br /&gt;
&lt;br /&gt;
Pero antes de abordar matemáticamente nuestro problema, vamos a intentar deducir lo que podría ocurrir. Considerando que la temperatura en el extremo derecho de la varilla es superior a la del extremo izquierdo, el calor comenzará a transferirse desde la zona más cálida, elevando la temperatura a lo largo de la varilla y promoviendo el desplazamiento del calor hacia la región más fría. Simultáneamente, el incremento de la temperatura interna provoca una reducción del flujo de calor entrante y a un aumento del saliente con el tiempo. Anticipamos que, en algún momento, ambos flujos se equilibrarán, conduciendo la temperatura de la varilla a un estado estacionario.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por lo que nuestro problema a resolver queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - Du_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Debemos reescalar en tiempo, para facilitarnos los cálculos, por lo que realizamos el cambio de variable  &amp;lt;math&amp;gt;\tau = \alpha t, \tau \in\mathbb{R} &amp;lt;/math&amp;gt;. Por tanto,  &amp;lt;math&amp;gt; u(x,t)=U(x,\tau)&amp;lt;/math&amp;gt; y entonces &amp;lt;math&amp;gt; \alpha U_{\tau}-DU_{xx}=0&amp;lt;/math&amp;gt; .Tomando &amp;lt;math&amp;gt; \alpha = D&amp;lt;/math&amp;gt; , obtenemos el problema &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;U_{\tau} - U_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(0, \tau) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(1, \tau) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Este problema se resuelve mediante el método de variación de las constantes, pero un factor clave para su implementación es que las condiciones de contorno estén homogeneizadas, es decir, que sean igual a cero. Esto se conseguirá mediante un cambio de variable, en el que es imprescindible la llamada solución estacionaria.&lt;br /&gt;
La solución estacionaria de nuestro problema es aquella que no varía con el tiempo &amp;lt;math&amp;gt; v=\lim_{t \to \infty} U(x,\tau)&amp;lt;/math&amp;gt;y por tanto, su derivada  respecto al tiempo es nula. Nuestro sistema queda ahora:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;-v_{xx}   = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, \\&lt;br /&gt;
&amp;amp;v(0)= 0 \\&lt;br /&gt;
&amp;amp;v(1) = 1, &lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Resolviendo obtenemos que &amp;lt;math&amp;gt; v(x)=x &amp;lt;/math&amp;gt; es nuestra solución estacionaria, cuya expresión gráfica es:&lt;br /&gt;
[[Archivo:sofiaest1.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import numpy as np&lt;br /&gt;
# Define el rango de x entre 0 y 1&lt;br /&gt;
x = np.linspace(0, 1, 100)  &lt;br /&gt;
# Define la función  estacionaria v(x) = x&lt;br /&gt;
v_x = x&lt;br /&gt;
# Crea la gráfica&lt;br /&gt;
plt.plot(x, v_x)&lt;br /&gt;
# Etiquetas de los ejes&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('v(x)')&lt;br /&gt;
# Título de la gráfica&lt;br /&gt;
plt.title('Gráfica de la solución estacionaria v(x)=x')&lt;br /&gt;
# Muestra la gráfica&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Una vez hallada la solución estacionaria, podemos homogeneizar nuestro problema mediante el cambio de variable &amp;lt;math&amp;gt;w(x,t)= U(x,\tau)-v(x)&amp;lt;/math&amp;gt;.Por tanto, sustituyendo en el sistema inicial obtenemos:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;w_{\tau} - w_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(0, \tau) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(1, \tau) = 1-1=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(x, 0) = 0-x=-x, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Nuestro sistema es ya homogéneo,por lo que aplicamos el método de separación de variables (que consiste en expresar la solución como el producto de una función que depende únicamente de la variable espacial x y una función dependiente de la variable temporal) y obtenemos como solución homogénea:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;w(x,\tau) =  \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 \tau}\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Y deshaciendo los dos cambios de variable, nuestra solución al problema original es por tanto:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 Dt }\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Como en nuestro caso, el coeficiente de conductividad térmica es igual a 1, nuestro sistema es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - Du_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
y nuestra solución:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 t }\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Mostramos gráficamente la solución, observando que se cumplen las condiciones de frontera y además según avanza el tiempo, la solución deja de depender del tiempo y alcanza un estado estacionario, determinado justamente por la solución estacionaria obtenida anteriormente, &amp;lt;math&amp;gt; v(x)=x &amp;lt;/math&amp;gt;. Cabe destacar que en &amp;lt;math&amp;gt; t=0 &amp;lt;/math&amp;gt;  obtenemos las oscilaciones correspondientes a la serie de Fourier de la condición inicial, que se aproxima mediante senos.&lt;br /&gt;
[[Archivo:SOFIASOL11.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
# Solución usando los primeros N términos de la serie&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculasmos los coeficientes C_k&lt;br /&gt;
        C_k = 2 * (-1)**(k) / (k * np.pi)  &lt;br /&gt;
        sum += C_k * np.sin(k*np.pi * x) * np.exp(-lambda_k * t*D) &lt;br /&gt;
    return x+sum&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
&lt;br /&gt;
# Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12,8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x (m)')&lt;br /&gt;
ax.set_ylabel('Tiempo t (s)')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) (ºC)')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Flujo===&lt;br /&gt;
Para estudiar el flujo de calor saliente y entrante en ambos extremos de la varilla a lo largo del tiempo, nos debemos basar en la ley de Fourier &amp;lt;math&amp;gt; \mathbf{q}  = - k  u_x(x,t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Por lo que necesitamos obtener la derivada de la solución con respecto al espacio:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(x,t)= 1+\sum_{k=1}^{\infty}(-1)^(k+1)2 e^(-k^2\pi ^2 t )\cos(k\pi  x) &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Ahora, el flujo en los extremos es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(0,t)=1 +\sum_{k=1}^{\infty}(-1)^(k+1)2 e^{-k^2\pi ^2 t } &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(1,t)=1+\sum_{k=1}^{\infty}(2) e^{-k^2\pi ^2 t } &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Gráficamente,&lt;br /&gt;
[[Archivo:SOFIAFLUJO1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
# Derivada de nuestra solución respecto al espacio, multiplicado por -k&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculamos los coeficientes C_k mediante extensión impar&lt;br /&gt;
        C_k = 2 * (-1)**(k+1)  &lt;br /&gt;
        sum += C_k * np.cos(k*np.pi * x) * np.exp(-lambda_k * t) &lt;br /&gt;
    return 1+sum&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(t, u(0,t,N), label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t, u(1,t,N), label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Al comenzar con un flujo de calor nulo en el extremo izquierdo, esto  indica que hay una gran diferencia de temperatura entre ambos extremos de la varilla. El extremo izquierdo está perdiendo calor rápidamente hacia la zona más fría. A medida que el calor se va transfiriendo por la varilla, el gradiente de la temperatura cambia y el extremo derecho comienza a calentarse, debido al flujo de calor que proviene del otro extremo. Este cambio conduce a que el flujo en ambos extremos comience a estar en equilibrio. &lt;br /&gt;
Esta estabilización de flujo en -1 refleja que se ha alcanzado un estado estacionario en el sistema, indicando que cualquier calor entrante en la varilla, se compensa con el calor saliente, manteniendo una distribución de temperatura uniforme.&lt;br /&gt;
&lt;br /&gt;
Este comportamiento refleja la Ley de Fourier, donde al principio la gran diferencia de temperatura induce un flujo de calor bastante significativo, que se va estabilizando llegando a un flujo de -1 en ambos extremos, alcanzando así un gradiente de temperatura constante, con la misma cantidad de calor saliendo hacia fuera desde ambos extremos.&lt;br /&gt;
&lt;br /&gt;
==Cambio de coeficiente de conductividad térmica ==&lt;br /&gt;
Hemos estudiado el problema de Cauchy para un coeficiente de difusión de 1,veamos que ocurre si lo disminuimos a su mitad, es decir,&amp;lt;math&amp;gt;D=\frac{1}{2}&amp;lt;/math&amp;gt;.Nuestro nuevo problema por tanto es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - \frac{1}{2}u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuya solución es &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {\frac{-k^2\pi ^2 t}{2}}\sin(k\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gráficamente, únicamente hemos cambiado el valor de D en el código (2)  y obtenemos:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:SOFIASOL22.png|400px|thumb|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1/2       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
# Solución usando los primeros N términos de la serie&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculasmos los coeficientes C_k&lt;br /&gt;
        C_k = 2 * (-1)**(k) / (k * np.pi)  &lt;br /&gt;
        sum += C_k * np.sin(k*np.pi * x) * np.exp(-lambda_k * t*D) &lt;br /&gt;
    return x+sum&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
# Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12,8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
ax.set_xlabel('Posición x (m)')&lt;br /&gt;
ax.set_ylabel('Tiempo t (s)')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) (ºC)')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
No se puede apreciar ninguna diferencia aparente entre las soluciones para los diferentes coeficientes. Para observar algún cambio vamos a dibujar la diferencia entre la solución y el estado estacionario en &amp;lt;math&amp;gt; x = 1/2&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt; t \in [0, 1]&amp;lt;/math&amp;gt;, es decir &amp;lt;math&amp;gt;u(1/2, t) − v(1/2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
[[Archivo:SOFIACCT1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
x=0.5&lt;br /&gt;
# Definir la función de temperatura con un número limitado de términos en la serie&lt;br /&gt;
def u(x, t, alpha, n_terms=10):   &lt;br /&gt;
    sum_series = sum(2 * (-1)**(k + 1) / (k * np.pi) * np.sin(k * np.pi * x) * np.exp(-k**2 * np.pi**2 * alpha * t) for k in range(1, n_terms + 1))&lt;br /&gt;
    return  x - sum_series&lt;br /&gt;
# Intervalo de tiempo&lt;br /&gt;
t = np.linspace(0, 1, 100)&lt;br /&gt;
# Calcular la temperatura en x=1/2 para diferentes alphas&lt;br /&gt;
u_k1 = u(0.5, t, alpha=1)-x  # D=1, correspondiente a alpha=1&lt;br /&gt;
u_k_half = u(0.5, t, alpha=0.5)-x  # D=1/2, correspondiente a alpha=0.5&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.plot(t, u_k1, label='k=1', color='blue')&lt;br /&gt;
plt.plot(t, u_k_half, label='k=1/2', color='red')&lt;br /&gt;
plt.xlabel('Tiempo (s)')&lt;br /&gt;
plt.ylabel('u(1/2, t) − v(1/2)')&lt;br /&gt;
plt.title('Efecto del Coeficiente de Conductividad Térmica ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El coeficiente de conductividad térmica juega un papel fundamental en determinar la velocidad a la que se propaga la temperatura dentro de un material. Al disminuir este coeficiente a la mitad, el proceso de conducción térmica a través de la varilla experimenta una notable ralentización. Esto se traduce en que, en cualquier instante dado t, la distribución de la temperatura a lo largo de la varilla VA avanzando a la mitad de velocidad en comparación con un escenario donde el coeficiente de conductividad térmica es de 1. Dicho cambio incide directamente en la rapidez con que se logra el equilibrio térmico en la varilla, Resultando en una difusión térmica más lenta hacia el equilibrio.&lt;br /&gt;
&lt;br /&gt;
== Cambio de condiciones ==&lt;br /&gt;
Supongamos ahora una barra unidimensional con extremos fijos a una temperatura de &amp;lt;math&amp;gt;0^\circ C&amp;lt;/math&amp;gt;. La temperatura inicial en cualquier punto de la barra está dada por la función &amp;lt;math&amp;gt;u(x,0) = max\{0, 1−4|x−1/2|\}&amp;lt;/math&amp;gt;, lo que significa que inicialmente la temperatura en la barra varía de acuerdo con esta función.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = max\{0, 1−4|x−1/2|\}, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Supongamos que, en tiempo infinito, \( t \rightarrow \infty \), se llega a una solución estacionaria y que, por tanto, ya no varía en tiempo. De modo, que tomando esta suposición llegamos al siguiente sistema con \( u(x,t) \xrightarrow{\text{t tiende a }\infty} v(x) \).&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;v_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,   \\&lt;br /&gt;
&amp;amp;v(0) = 0, &amp;amp; \\&lt;br /&gt;
&amp;amp;v(1) = 0, &amp;amp;  &lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuya solución es la constante \( v(x)=0 \). De modo que el sistema homogeneizado, coincide con el original, pues \( w(x,t)=u(x,t)-v(x) =u(x,t)-0=u(x,t)\) &lt;br /&gt;
Antes de exigir la condición inicial, la solución coincide con la del primer apartado, pues nos encontramos ante la misma ecuación diferencial, salvo por la función \( u(x,0)\), la cual no toma parte hasta el final de la resolución de esta suponiendo separación de variables. De modo que&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t) = \sum_{k=1}^{\infty} C_k  e^{(-k^2\pi ^2 t )}\sin(k \pi  x)&amp;lt;/math&amp;gt; &lt;br /&gt;
Para hallar el valor de los coeficientes &amp;lt;math&amp;gt; C_k&amp;lt;/math&amp;gt;, buscamos la serie de Fourier de la función &amp;lt;math&amp;gt; max\{0, 1−4|x−1/2|\}&amp;lt;/math&amp;gt; extendida de forma impar. Esto es posible, ya que&lt;br /&gt;
:&amp;lt;math&amp;gt; \int^1_0 (max\{0, 1−4|x−1/2|\})^2 dx=0.1667 &amp;lt; \infty&amp;lt;/math&amp;gt;  &lt;br /&gt;
El cálculo de los coeficientes se ha realizado numéricamente aproximando por la fórmula del trapecio. Los coeficientes se pueden consultar ejecutando el siguiente código en Python&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np &lt;br /&gt;
def f(x):   # Defino función que se quiere aproximar&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x):&lt;br /&gt;
    coefficients = np.zeros(n) # Guardo los coeficientes en una lista&lt;br /&gt;
    for k in range(1,n+1):     # Compiezo en k=1, pues sin(0)=0&lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients&lt;br /&gt;
&lt;br /&gt;
fourier_coefficients(f, 10, np.linspace(0, 1, 1000))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
De modo que ya se ha calculado la solución de este nuevo problema. Visualmente, responde a la siguiente gráfica, resultado de ejecutar este código:&lt;br /&gt;
[[Archivo:Solucion_Celia.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)    # Generar una cuadrícula de puntos&lt;br /&gt;
&lt;br /&gt;
def f(x):    # Defino mi función condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x): # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    coefficients = np.zeros(n)&lt;br /&gt;
    for k in range(1,n+1):         # Comenzamos en 1, pues sen(0)=0&lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients.tolist()   # Convertir a lista&lt;br /&gt;
coef=fourier_coefficients(f, N, x)&lt;br /&gt;
&lt;br /&gt;
def u(x, t, n): # Definir la solución en términos de la serie de Fourier con N términos&lt;br /&gt;
    sum = 0                 # Almacenamos la suma (resultado) hasta el término 10&lt;br /&gt;
    for k in range(1, n+1): # Para cada k calculo el lambda y sumo su coeficiente respectivo&lt;br /&gt;
        lambda_k = k* np.pi&lt;br /&gt;
        sum += coef[k-1] * np.sin(lambda_k * x) * np.exp(-lambda_k**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
Z = u(X, T, N) # Calcular los valores de la función para cada par (x, t)&lt;br /&gt;
&lt;br /&gt;
# Graficar la función en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))  # Cambio aquí para hacer la figura más grande&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z,cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x [m]')&lt;br /&gt;
ax.set_ylabel('Tiempo t [s]')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) [ºC]')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)  #Añado una guía de colores&lt;br /&gt;
surf.set_clim(0, 1)                       # Le introduzco cota inf/sup a los colores&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
​[[Archivo:gifcelia.gif|400px|right|]]&lt;br /&gt;
Vemos como la temperatura sufre una gran variación en tiempos cercanos a 0, y rápidamente tiende a su estado estacionario, &amp;lt;math&amp;gt;v(x)=0&amp;lt;/math&amp;gt;. Para poder visualizarlo mejor mostraremos una un gif donde la imagen cambia a medida que el tiempo pasa, restringido a &amp;lt;math&amp;gt;t \in [0,0.3]&amp;lt;/math&amp;gt;, pues a partir de ahí, la temperatura está suficientemente cerca de la estacionaria y, por tanto, no hay gran variación en la temperatura.&lt;br /&gt;
&lt;br /&gt;
En un inicio, en \(t=0\) la temperatura toma valores negativos. Esto debido a que la exponencial se anula y son los coeficientes de Fourier quienes exigen el signo de la función. Una vez que &amp;lt;math&amp;gt;t&amp;gt;0&amp;lt;/math&amp;gt;, u se hace positivo en todas partes, lo que significa que la temperatura se difunde casi instantáneamente a lo largo del eje x, resultando en una velocidad de propagación infinita. Es decir, cualquier perturbación se siente enseguida en toda parte del dominio.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Terminamos el estudio de esta ecuación de difusión con el estudio del flujo, la inversa de la variación de la variable x de la solución. Para ello derivamos la solución que hemos obtenido. En términos de &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;, puesto que no son dependientes de x, obtenemos:&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{\partial}{\partial x}u(x,t)=\sum_{k=1}^{\infty} C_k  e^{(-k^2\pi ^2 t )}\cos(k \pi  x)\frac{1}{k \pi}&amp;lt;/math&amp;gt; como flujo de la ecuación homogénea. Adjuntamos el código con el cual se ha calculado la expresión de forma numérica y su respectiva representación gráfica:&lt;br /&gt;
[[Archivo:Flujo_Celia.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino la función de la ci para hallar los coef&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x): # Hallo los coef de Fourier  &lt;br /&gt;
    coefficients = np.zeros(n)&lt;br /&gt;
    for k in range(1,n+1): &lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients.tolist()   # Convertir a lista&lt;br /&gt;
coef=fourier_coefficients(f, N, x)&lt;br /&gt;
&lt;br /&gt;
def u(x, t, n):  # Definir la derivada en términos de la serie de Fourier con N términos&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, n+1):&lt;br /&gt;
        lambda_k = k* np.pi&lt;br /&gt;
        sum += coef[k-1] *np.cos(k * np.pi * x)/(k * np.pi) * np.exp(-lambda_k**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
# Graficamos&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(t, u(0,t,N), label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t, u(1,t,N), label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Varilla con extremo aislado==&lt;br /&gt;
En este estudio modelamos la difusión del calor en un alambre. Inicialmente, consideramos un alambre con una temperatura inicial de \( 0^\circ C \) en su extremo izquierdo. En contraste, el extremo derecho del alambre está aislado térmicamente, lo que significa que no hay transferencia de calor a través de este. En nuestro análisis, introducimos una fuente de calor en el centro del alambre en el instante inicial. Luego, examinamos cómo se propaga y se distribuye esta fuente de calor a lo largo del alambre con el tiempo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u_x(1, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = max\{0, 1−4|x−1/2|\}, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que la barra se encuentra aislada térmicamente en su extremo en \( x = 1 \) implica que no hay flujo de calor a través de este extremo. La ley de Fick, establece que el flujo de calor es proporcional al gradiente de temperatura según la ecuación \( q = -k \frac{du}{dx} \), donde \( q \) es el flujo de calor, \( k \) es la conductividad térmica y \( \frac{du}{dx} \) es el gradiente de temperatura a lo largo de la barra. En este contexto, si el flujo en dicho extremo es nulo, el gradiente de temperatura es nulo, por tanto  \( u_x(1, t) = 0 \). Observamos además que la solución estacionaria en nuestro caso es \( v(x) = 0 \), pues es la solución del problema de contorno.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
v''(x) = 0, \quad v(0) = 0, \quad v'(1) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De forma análoga a como ocurría en el apartado anterior, el problema que estamos estudiando en este caso es homogéneo. Por tanto, sin necesidad de hacer ningún cambio, procedemos a resolverlo mediante el método de separación de variables. Suponiendo que \( u(x, t) = X(x) \cdot T(t) \). Obtenemos como solución \( X(x) = A \sin(\pi(1/2+k)x) \) y \( T(t) = B e^{-(\pi^2)(1/2+k)^2 t} \). De modo que, la solución sin tener en cuenta la condición inicial es:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u_k(x, t) = c_k \cdot \sin(\pi(1/2+k)x) \cdot e^{-(\pi^2)(1/2+k)^2 t}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Para asegurar la existencia de solución del problema, es necesario verificar si existen ciertos coeficientes \( c_k \) tal que la solución pueda ser definida como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, t) = \sum_{k=0}^{\infty} c_k \cdot \sin(\pi(1/2+k)x) \cdot e^{-(\pi^2)(1/2+k)^2 t}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Para ello, es necesario verificar que las autofunciones \( \{\sin(\pi(1/2+k)x)\}_{k=0}^{\infty} \) forman un conjunto completo en \( L^2 [0, 1]\)  y ortogonal.&lt;br /&gt;
 &lt;br /&gt;
Para comprobar la ortogonalidad entre las autofunciones, calculamos la integral de su producto, o lo que es igual a calcular el producto escalar de \( L^2 [0,1]\), para dos funciones distintas \( \sin(\pi(1/2+k)x) \) y \( \sin(\pi(1/2+m)x) \) con \( k \neq m \in \mathbb{N}\):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{1} \sin(\pi(1/2+k)x) \sin(\pi(1/2+m)x) \, dx = \frac{\sin((k - m) \pi)}{2 (k - m) \pi} - \frac{\sin((1 + k + m) \pi)}{2 (1 + k + m) \pi}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Esta integral se anula para \( k,m \in  \mathbb{N} \), lo que demuestra que las autofunciones son ortogonales entre sí en el intervalo \([0, 1]\).&lt;br /&gt;
Por otro lado, dado que demostrar que las funciones forman una base completa para el espacio \( L^2[0,1] \) puede ser un proceso complejo y requiere un análisis detallado, en este trabajo supondremos que la forman.&lt;br /&gt;
[[Archivo:Solucion_Pablo.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)    # Generar una cuadrícula de puntos&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino mi fucnión condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficient(f, k, x):  # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    ck = 2* np.trapz(f(x) * np.sin(np.pi*(1/2+k)*x) ,x)&lt;br /&gt;
    return ck&lt;br /&gt;
&lt;br /&gt;
# Definir la solución en términos de la serie de Fourier con N términos&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0                 # Almacenamos la suma hasta el término 10&lt;br /&gt;
    for k in range(0, N+1): # Para cada k cálculo su coeficiente y lo sumo al resultado&lt;br /&gt;
        ck = fourier_coefficient(f, k, x)&lt;br /&gt;
        sum += ck * np.sin(np.pi*(1/2+k)*x) * np.exp(-(np.pi**2)*(1/2+k)**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Z = u(X, T, N)  # Calcular los valores de la función para cada par (x, t)&lt;br /&gt;
&lt;br /&gt;
# Graficar la función en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z,cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x [m]')&lt;br /&gt;
ax.set_ylabel('Tiempo t [s]')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) [ºC]')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)  #Añado una guía de colores&lt;br /&gt;
surf.set_clim(0, 1)                       # Le introduzco cota inf/sup a los colores&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gracias a los desarrollos en serie de Fourier, podemos calcular los coeficientes \( c_k \) para cumplir así la condición inicial. Dichos coeficientes se calculan mediante la integral:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_k := \frac{\int_{0}^{1} \max\{0, 1 - 4(x - 1/2)\} \sin(\pi(1/2+k)x) \, dx}{\int_{0}^{1} \sin^2(\pi(1/2+k)x) \, dx}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Dado que la integral es difícil de calcular analíticamente y en consecuencia es difícil obtener una expresión dependiente del parámetro &amp;lt;math&amp;gt; k&amp;lt;/math&amp;gt;, la resolveremos de forma numérica mediante el método del trapecio, de forma análoga a como se hizo en el modelo sin aislante térmico previo.&lt;br /&gt;
Para una comprensión más completa de la evolución de la temperatura del alambre en cuestión, es importante realizar un análisis visual de la solución propuesta. La representación gráfica de la solución en el intervalo de tiempo \( t \in [0, 1] \), considerando los primeros 10 términos de la serie de Fourier, ofrece una visualización tridimensional de la distribución del calor a lo largo del alambre en función del tiempo.&lt;br /&gt;
 &lt;br /&gt;
Es relevante destacar que a medida que transcurre el tiempo, la solución converge gradualmente hacia su estado estacionario, es decir, \(  v(x)=0 \) . Además, observamos que se verifica el principio del máximo, dado que tanto la temperatura máxima y mínima se alcanza en la frontera parabólica.&lt;br /&gt;
Esta última afirmación la podemos verificar de forma sencilla, obteniendo ambos valores de la función. El código utilizado mostró los siguientes datos.&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# Calcular la temperatura máxima y mínima&lt;br /&gt;
max_temperature = np.max(Z)&lt;br /&gt;
min_temperature = np.min(Z)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Temperatura máxima:&amp;quot;, max_temperature)&lt;br /&gt;
print(&amp;quot;Temperatura mínima:&amp;quot;, min_temperature)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Encontrar las coordenadas donde se alcanza la temperatura máxima y mínima&lt;br /&gt;
max_index = np.unravel_index(np.argmax(Z), Z.shape)&lt;br /&gt;
min_index = np.unravel_index(np.argmin(Z), Z.shape)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
max_x, max_t = x_values[max_index[1]], t_values[max_index[0]]&lt;br /&gt;
min_x, min_t = x_values[min_index[1]], t_values[min_index[0]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Coordenadas de la temperatura máxima: (x={}, t={})&amp;quot;.format(max_x, max_t))&lt;br /&gt;
print(&amp;quot;Coordenadas de la temperatura mínima: (x={}, t={})&amp;quot;.format(min_x, min_t))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Resultados de temperatura máxima y mínima&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parámetro!! Valor&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura máxima|| \(0.92 ^\circ \text{C}\)&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura mínima|| \(-0.03 ^\circ \text{C}\)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Coordenadas de temperatura máxima y mínima&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Coordenadas !! Valor&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura máxima|| \((x=0.50, t=0.00)\)&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura mínima|| \((x=0.81, t=0.00)\)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Observamos que el máximo debería ser de &amp;lt;math&amp;gt; 1^\circ \text{C} &amp;lt;/math&amp;gt;. No obstante, el resultado reportado por el código es &amp;lt;math&amp;gt; 0.92 ^\circ \text{C} &amp;lt;/math&amp;gt;. Esto se debe al uso de la aproximación por series de Fourier. Lo mismo ocurre con el valor mínimo que debería se de &amp;lt;math&amp;gt; 0^\circ \text{C} &amp;lt;/math&amp;gt;, no obstante el código reporta &amp;lt;math&amp;gt;-0.03^\circ \text{C} &amp;lt;/math&amp;gt;. Además dichos puntos están en la frontera parabólica, como afirma el principio del máximo. &lt;br /&gt;
&lt;br /&gt;
En este punto es interesante verificar si nuestro modelo es correcto. En tal caso, el extremo izquierdo de la barra no debería perder calor. Por lo tanto, calculamos la derivada de nuestra expresión y, gracias a la Ley de Fick, sabemos que el flujo de calor es igual a la derivada cambiada de signo. Obtenemos los siguientes resultados:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Flujo_Pablo.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 100     # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x_values = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t_values = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino mi función condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficient(f, k, x):   # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    ck = 2* np.trapz(f(x) * np.sin(np.pi*(1/2+k)*x) ,x)&lt;br /&gt;
    return ck&lt;br /&gt;
&lt;br /&gt;
def derivative_solution_x(x, t, N): # Definir la derivada de la solución respecto a x&lt;br /&gt;
    result = 0&lt;br /&gt;
    for k in range(0, N+1):&lt;br /&gt;
        ck = fourier_coefficient(f, k, x_values)&lt;br /&gt;
        result += ck * np.pi * (1/2 + k) * np.cos(np.pi * (1/2 + k) * x) * np.exp(-1 * (np.pi**2) * (1/2 + k)**2 * t)&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
# Calcular la derivada de la solución respecto a x para los extremos x=0 y x=1 a lo largo del tiempo&lt;br /&gt;
flux_x0 = [-derivative_solution_x(0, t, N) for t in t_values]&lt;br /&gt;
flux_x1 = [-derivative_solution_x(1, t, N) for t in t_values]&lt;br /&gt;
&lt;br /&gt;
# Graficar el flujo en los extremos x=0 y x=1 a lo largo del tiempo&lt;br /&gt;
plt.figure(figsize=(8, 5))&lt;br /&gt;
plt.plot(t_values, flux_x0, label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t_values, flux_x1, label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Observamos que todo el calor aportado en el instante inicial se disipa completamente por la izquierda de la varilla, ya que el flujo en &amp;lt;math&amp;gt; x=1&amp;lt;/math&amp;gt; es nulo, verificando así las condiciones fronteras de nuestro problema.&lt;br /&gt;
&lt;br /&gt;
==Solución fundamental==&lt;br /&gt;
La solución fundamental de la ecuación del calor es una función que describe la distribución de temperatura en un medio en función del tiempo y la posición. Para la ecuación del calor unidimensional, la solución fundamental está dada por la fórmula:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\phi(x, t) = \frac{1}{2 \sqrt{\pi t}} \exp\left(-\frac{x^2}{t}\right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
La solución fundamental describe cómo el calor se propaga y difunde a lo largo del medio a medida que pasa el tiempo, en este caso, por ejemplo, el calor en un alambre. Además la solución general del problema de Cauchy es la solución fundamental de la ecuación del calor.&lt;br /&gt;
El problema de Cauchy es el siguiente:&lt;br /&gt;
Dada la ecuación diferencial parcial:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u_t = k \cdot u_{xx},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
junto con las siguientes condiciones iniciales:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, 0) = f(x)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
donde \( f(x) \) es una función dada en el dominio \( 0 \leq x \leq L \) y \( k \) es una constante positiva que representa la difusividad térmica del medio.&lt;br /&gt;
Para resolver el problema de Cauchy para la ecuación del calor es mediante el uso de la solución fundamental y la técnica de convolución. La solución fundamental \( \phi(x, t) \) de la ecuación del calor es una función especial que satisface la ecuación diferencial parcial y las condiciones iniciales dadas.&lt;br /&gt;
 &lt;br /&gt;
Para resolver el problema de Cauchy, podemos utilizar la solución fundamental \( \phi(x, t) \) en combinación con la función inicial \( u_0(x) \) para obtener la solución general \( u(x, t) \) en cualquier instante de tiempo \( t \). Esto se logra convolucionando la función inicial \( f(x) \) con la solución fundamental \( \phi(x, t) \) .&lt;br /&gt;
La solución \( u(x, t) \) del problema de Cauchy se puede expresar como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, t) = \int_{-\infty}^{\infty} \phi(x - y, t) f(y) \, dy&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
En primer lugar, procederemos a visualizar una representación tridimensional de la solución fundamental  \( \phi(x, t) \).&lt;br /&gt;
[[Archivo:Solfundi.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Definir la función que representa la solución fundamental de la ecuación del calor&lt;br /&gt;
def phi(x, t):&lt;br /&gt;
    return 1 / (2 * np.sqrt(np.pi * t)) * np.exp(-x**2 / t)&lt;br /&gt;
&lt;br /&gt;
# Definir los valores de x y t para la gráfica&lt;br /&gt;
x_values = np.linspace(-1, 1, 100)    # Valores de x&lt;br /&gt;
t_values = np.linspace(0.01, 1, 200)  # Valores de t (tiempo)&lt;br /&gt;
&lt;br /&gt;
# Crear una malla de valores de x y t&lt;br /&gt;
X, T = np.meshgrid(x_values, t_values)&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución fundamental para cada par de valores (x, t)&lt;br /&gt;
Z = phi(X, T)&lt;br /&gt;
&lt;br /&gt;
# Crear una figura en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
# Graficar la superficie 3D&lt;br /&gt;
surf = ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
# Etiquetas y título con el símbolo de &amp;quot;phi&amp;quot;&lt;br /&gt;
ax.set_xlabel(r'$x$')&lt;br /&gt;
ax.set_ylabel(r'$t$')&lt;br /&gt;
ax.set_zlabel(r'$\phi(x, t)$')&lt;br /&gt;
ax.set_title(r'Solución fundamental de la ecuación del calor: $\phi(x, t)$')&lt;br /&gt;
&lt;br /&gt;
# Añadir una barra de colores para indicar los valores de Z&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=8)&lt;br /&gt;
plt.show()    # Mostrar la gráfica&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
En esta ocasión veremos la solución de la ecuación del calor \( u_t - u_{xx} = 0 \) en \( x \in \mathbb{R} \) asociada al dato inicial \( f(x) = 1_{[-1,1]} \), viene dada por la convolución:&lt;br /&gt;
 &lt;br /&gt;
:&amp;lt;math&amp;gt; u(x, t) = \int_{-\infty}^{\infty} \phi(x - y, t) f(y) \, dy = \int_{-\infty}^{\infty} \frac{1}{2 \sqrt{\pi t}} \exp\left(-\frac{(x-y)^2}{t}\right) 1_{[-1,1]} \, dy &amp;lt;/math&amp;gt;&lt;br /&gt;
Dibujaremos la solución en diferentes instantes de tiempo: \( t = 0.001 \), \( t = 0.01 \) , \( t = 0.1 \), \( t = 1 \).  Aproximaremos la integral indefinida utilizando la fórmula del trapecio.&lt;br /&gt;
[[Archivo:gifgif.gif|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# Importar las bibliotecas necesarias&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Definir la solución fundamental en 2D&lt;br /&gt;
def phi_2D(x1, x2, t):&lt;br /&gt;
    if t == 0:&lt;br /&gt;
        return np.zeros_like(x1)  # Devuelve una matriz de ceros si t es cero&lt;br /&gt;
    else:&lt;br /&gt;
        return 1 / (4 * np.pi * t) * np.exp(-(x1**2 + x2**2) / (4 * t))&lt;br /&gt;
&lt;br /&gt;
# Definir el intervalo espacial&lt;br /&gt;
x1_values = np.linspace(-1, 1, 100)  # Valores de x1&lt;br /&gt;
x2_values = np.linspace(-1, 1, 100)  # Valores de x2&lt;br /&gt;
x1, x2 = np.meshgrid(x1_values, x2_values)  # Malla de valores de x1 y x2&lt;br /&gt;
&lt;br /&gt;
# Definir los tiempos&lt;br /&gt;
t_values = np.linspace(0, 0.1, 3)  # Valores de tiempo&lt;br /&gt;
&lt;br /&gt;
# Tamaño de la figura&lt;br /&gt;
fig = plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
# Graficar la solución fundamental en 2D para cada tiempo&lt;br /&gt;
for i, t in enumerate(t_values, 1):&lt;br /&gt;
    ax = fig.add_subplot(1, len(t_values), i, projection='3d')&lt;br /&gt;
    phi = phi_2D(x1, x2, t)&lt;br /&gt;
    ax.plot_surface(x1, x2, phi, cmap='viridis')&lt;br /&gt;
    ax.set_title(f'Tiempo $t=${round(t, 3)}')&lt;br /&gt;
    ax.set_xlabel('x1')&lt;br /&gt;
    ax.set_ylabel('x2')&lt;br /&gt;
    ax.set_zlabel('phi(x1, x2, t)')&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Solución fundamental dimensión 2==&lt;br /&gt;
&lt;br /&gt;
Veamos el problema de Cauchy para la ecuación del calor en dos dimensiones (\( x_1, x_2 \) y \( t \)). Sea \( u(x_1, x_2, t) \) la función de temperatura en un medio bidimensional, que satisface la ecuación del calor:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u_t = k(u_{x_1 x_1} + u_{x_2 x_2})&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Con las condiciones iniciales dadas por la temperatura inicial \( u(x_1, x_2, 0) = f(x_1, x_2) \) para algún campo de temperatura dado \( f(x_1, x_2)  \text{para} (x_1, x_2) \in \partial \Omega \), donde \( \Omega \) es el dominio bidimensional sobre el cual se define la temperatura.&lt;br /&gt;
La solución general a este problema (sin contar la condición inicial) viene dada por la siguiente expresión: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\phi(x_1, x_2, t) = \frac{1}{4 \pi t} \exp\left( -\frac{x_1^2 + x_2^2}{4t} \right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Procederemos ahora a representar la solución fundamental, donde veremos un gráfico tridimensional, &amp;lt;math&amp;gt; x_1, x_2, \phi(x_1, x_2, t) &amp;lt;/math&amp;gt; donde se ha fijado un tiempo t.&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor(Grupo_Eau_De_Parfum(EDP)))&amp;diff=70116</id>
		<title>Ecuación del calor(Grupo Eau De Parfum(EDP)))</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor(Grupo_Eau_De_Parfum(EDP)))&amp;diff=70116"/>
				<updated>2024-03-07T18:59:20Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Cambio de condiciones */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del Calor. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
==Introducción==&lt;br /&gt;
&lt;br /&gt;
==Conocimientos previos==&lt;br /&gt;
Antes de comenzar será de gran ayuda introducir una serie de conceptos que utilizaremos a lo largo este trabajo:&lt;br /&gt;
&lt;br /&gt;
*'''Ley del calor de Newton''': describe la tasa de pérdida o ganancia de calor de un objeto en relación con el ambiente circundante.La ley se expresa comúnmente como:&lt;br /&gt;
:&amp;lt;math&amp;gt; \frac{d T(t)}{d t} = - k (T(t) - T_{\mathrm{a}}) &amp;lt;/math&amp;gt;,&lt;br /&gt;
siendo &amp;lt;math&amp;gt;T(t) &amp;lt;/math&amp;gt;la temperatura del objeto en un tiempo dado, &amp;lt;math&amp;gt;T_{\mathrm{a}}&amp;lt;/math&amp;gt; la temperatura ambiente y &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; la constante de proporcionalidad.&lt;br /&gt;
&lt;br /&gt;
*'''Principio de conservación de la energía calorífica''': establece que la variación de energía calorífica sobre un cuerpo V se debe al balance entre el calor que entra y sale del cuerpo más una producción externa.&lt;br /&gt;
&lt;br /&gt;
*'''Ley de Fourier''':intaura que el calor fluye desde regiones de alta temperatura a regiones de baja temperatura, y la cantidad de flujo de calor depende de la diferencia de temperatura y las propiedades del material.La expresión matemática de la Ley de Fourier es:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathbf{q}  = - k {\nabla} T &amp;lt;/math&amp;gt;,   &lt;br /&gt;
donde &amp;lt;math&amp;gt; \mathbf{q}&amp;lt;/math&amp;gt; es el vector de flujo de calor por unidad de superficie y &amp;lt;math&amp;gt;  {\nabla} T &amp;lt;/math&amp;gt; es el gradiente del campo de temperatura en el interior del material.&lt;br /&gt;
*'''Coeficiente de conductividad térmica (D)''':cuantifica la capacidad de un material para conducir el calor. Se define como la cantidad de calor que pasa en un segundo a través de un metro cuadrado de material cuando la diferencia de temperatura a través del material,cuando la diferencia de temperatura a través del material es de un grado(ºC) es de un grado, y el espesor del material es de un metro.&lt;br /&gt;
*'''Principio del máximo''': Sea &amp;lt;math&amp;gt;u \in C^{2,1}(Q_T)\cap (\overline{Q_T})&amp;lt;/math&amp;gt; tal que  &amp;lt;math&amp;gt;u_t - \Delta u \leq 0&amp;lt;/math&amp;gt; en &amp;lt;math&amp;gt;Q_T&amp;lt;/math&amp;gt;. Entonces u alcanza su máximo en la frontera parabólica &amp;lt;math&amp;gt;\partial _p Q_T&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\max_{\overline{Q_T}} u = \max_{\partial _p Q_T} u&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nuestro problema original ==&lt;br /&gt;
Consideramos una varilla metálica de 1 metro de longitud , que se encuentra aislada por su superficie lateral, de manera que la conducción de calor únicamente se produce en la dirección longitudinal. La temperatura inicial de la varilla es de 0ºC. En el extremo izquierdo se consigue mantener la temperatura a 0 ºC mientras que en el derecho la temperatura es siempre de 1 ºC. Además  el calor específico toma un valor constante de 1.En cuanto al coeficiente de conductividad térmica,vamos a observar cómo sería nuestro problema para un valor cualquiera y seguidamente especificaremos el valor constante de 1.&lt;br /&gt;
&lt;br /&gt;
Pero antes de abordar matemáticamente nuestro problema, vamos a intentar deducir lo que podría ocurrir. Considerando que la temperatura en el extremo derecho de la varilla es superior a la del extremo izquierdo, el calor comenzará a transferirse desde la zona más cálida, elevando la temperatura a lo largo de la varilla y promoviendo el desplazamiento del calor hacia la región más fría. Simultáneamente, el incremento de la temperatura interna provoca una reducción del flujo de calor entrante y a un aumento del saliente con el tiempo. Anticipamos que, en algún momento, ambos flujos se equilibrarán, conduciendo la temperatura de la varilla a un estado estacionario.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por lo que nuestro problema a resolver queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - Du_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Debemos reescalar en tiempo, para facilitarnos los cálculos, por lo que realizamos el cambio de variable  &amp;lt;math&amp;gt;\tau = \alpha t, \tau \in\mathbb{R} &amp;lt;/math&amp;gt;. Por tanto,  &amp;lt;math&amp;gt; u(x,t)=U(x,\tau)&amp;lt;/math&amp;gt; y entonces &amp;lt;math&amp;gt; \alpha U_{\tau}-DU_{xx}=0&amp;lt;/math&amp;gt; .Tomando &amp;lt;math&amp;gt; \alpha = D&amp;lt;/math&amp;gt; , obtenemos el problema &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;U_{\tau} - U_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(0, \tau) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(1, \tau) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Este problema se resuelve mediante el método de variación de las constantes, pero un factor clave para su implementación es que las condiciones de contorno estén homogeneizadas, es decir, que sean igual a cero. Esto se conseguirá mediante un cambio de variable, en el que es imprescindible la llamada solución estacionaria.&lt;br /&gt;
La solución estacionaria de nuestro problema es aquella que no varía con el tiempo &amp;lt;math&amp;gt; v=\lim_{t \to \infty} U(x,\tau)&amp;lt;/math&amp;gt;y por tanto, su derivada  respecto al tiempo es nula. Nuestro sistema queda ahora:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;-v_{xx}   = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, \\&lt;br /&gt;
&amp;amp;v(0)= 0 \\&lt;br /&gt;
&amp;amp;v(1) = 1, &lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Resolviendo obtenemos que &amp;lt;math&amp;gt; v(x)=x &amp;lt;/math&amp;gt; es nuestra solución estacionaria, cuya expresión gráfica es:&lt;br /&gt;
[[Archivo:sofiaest1.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import numpy as np&lt;br /&gt;
# Define el rango de x entre 0 y 1&lt;br /&gt;
x = np.linspace(0, 1, 100)  &lt;br /&gt;
# Define la función  estacionaria v(x) = x&lt;br /&gt;
v_x = x&lt;br /&gt;
# Crea la gráfica&lt;br /&gt;
plt.plot(x, v_x)&lt;br /&gt;
# Etiquetas de los ejes&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('v(x)')&lt;br /&gt;
# Título de la gráfica&lt;br /&gt;
plt.title('Gráfica de la solución estacionaria v(x)=x')&lt;br /&gt;
# Muestra la gráfica&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Una vez hallada la solución estacionaria, podemos homogeneizar nuestro problema mediante el cambio de variable &amp;lt;math&amp;gt;w(x,t)= U(x,\tau)-v(x)&amp;lt;/math&amp;gt;.Por tanto, sustituyendo en el sistema inicial obtenemos:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;w_{\tau} - w_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(0, \tau) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(1, \tau) = 1-1=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(x, 0) = 0-x=-x, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Nuestro sistema es ya homogéneo,por lo que aplicamos el método de separación de variables (que consiste en expresar la solución como el producto de una función que depende únicamente de la variable espacial x y una función dependiente de la variable temporal) y obtenemos como solución homogénea:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;w(x,\tau) =  \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 \tau}\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Y deshaciendo los dos cambios de variable, nuestra solución al problema original es por tanto:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 Dt }\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Como en nuestro caso, el coeficiente de conductividad térmica es igual a 1, nuestro sistema es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - Du_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
y nuestra solución:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 t }\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Mostramos gráficamente la solución, observando que se cumplen las condiciones de frontera y además según avanza el tiempo, la solución deja de depender del tiempo y alcanza un estado estacionario, determinado justamente por la solución estacionaria obtenida anteriormente, &amp;lt;math&amp;gt; v(x)=x &amp;lt;/math&amp;gt;. Cabe destacar que en &amp;lt;math&amp;gt; t=0 &amp;lt;/math&amp;gt;  obtenemos las oscilaciones correspondientes a la serie de Fourier de la condición inicial, que se aproxima mediante senos.&lt;br /&gt;
[[Archivo:SOFIASOL11.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
# Solución usando los primeros N términos de la serie&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculasmos los coeficientes C_k&lt;br /&gt;
        C_k = 2 * (-1)**(k) / (k * np.pi)  &lt;br /&gt;
        sum += C_k * np.sin(k*np.pi * x) * np.exp(-lambda_k * t*D) &lt;br /&gt;
    return x+sum&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
&lt;br /&gt;
# Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12,8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x (m)')&lt;br /&gt;
ax.set_ylabel('Tiempo t (s)')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) (ºC)')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Flujo===&lt;br /&gt;
Para estudiar el flujo de calor saliente y entrante en ambos extremos de la varilla a lo largo del tiempo, nos debemos basar en la ley de Fourier &amp;lt;math&amp;gt; \mathbf{q}  = - k  u_x(x,t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Por lo que necesitamos obtener la derivada de la solución con respecto al espacio:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(x,t)= 1+\sum_{k=1}^{\infty}(-1)^(k+1)2 e^(-k^2\pi ^2 t )\cos(k\pi  x) &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Ahora, el flujo en los extremos es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(0,t)=1 +\sum_{k=1}^{\infty}(-1)^(k+1)2 e^{-k^2\pi ^2 t } &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(1,t)=1+\sum_{k=1}^{\infty}(2) e^{-k^2\pi ^2 t } &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Gráficamente,&lt;br /&gt;
[[Archivo:SOFIAFLUJO1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
# Derivada de nuestra solución respecto al espacio, multiplicado por -k&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculamos los coeficientes C_k mediante extensión impar&lt;br /&gt;
        C_k = 2 * (-1)**(k+1)  &lt;br /&gt;
        sum += C_k * np.cos(k*np.pi * x) * np.exp(-lambda_k * t) &lt;br /&gt;
    return 1+sum&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(t, u(0,t,N), label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t, u(1,t,N), label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Al comenzar con un flujo de calor nulo en el extremo izquierdo, esto  indica que hay una gran diferencia de temperatura entre ambos extremos de la varilla. El extremo izquierdo está perdiendo calor rápidamente hacia la zona más fría. A medida que el calor se va transfiriendo por la varilla, el gradiente de la temperatura cambia y el extremo derecho comienza a calentarse, debido al flujo de calor que proviene del otro extremo. Este cambio conduce a que el flujo en ambos extremos comience a estar en equilibrio. &lt;br /&gt;
Esta estabilización de flujo en -1 refleja que se ha alcanzado un estado estacionario en el sistema, indicando que cualquier calor entrante en la varilla, se compensa con el calor saliente, manteniendo una distribución de temperatura uniforme.&lt;br /&gt;
&lt;br /&gt;
Este comportamiento refleja la Ley de Fourier, donde al principio la gran diferencia de temperatura induce un flujo de calor bastante significativo, que se va estabilizando llegando a un flujo de -1 en ambos extremos, alcanzando así un gradiente de temperatura constante, con la misma cantidad de calor saliendo hacia fuera desde ambos extremos.&lt;br /&gt;
&lt;br /&gt;
==Cambio de coeficiente de conductividad térmica ==&lt;br /&gt;
Hemos estudiado el problema de Cauchy para un coeficiente de difusión de 1,veamos que ocurre si lo disminuimos a su mitad, es decir,&amp;lt;math&amp;gt;D=\frac{1}{2}&amp;lt;/math&amp;gt;.Nuestro nuevo problema por tanto es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - \frac{1}{2}u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuya solución es &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {\frac{-k^2\pi ^2 t}{2}}\sin(k\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gráficamente, únicamente hemos cambiado el valor de D en el código (2)  y obtenemos:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:SOFIASOL22.png|400px|thumb|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1/2       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
# Solución usando los primeros N términos de la serie&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculasmos los coeficientes C_k&lt;br /&gt;
        C_k = 2 * (-1)**(k) / (k * np.pi)  &lt;br /&gt;
        sum += C_k * np.sin(k*np.pi * x) * np.exp(-lambda_k * t*D) &lt;br /&gt;
    return x+sum&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
# Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12,8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
ax.set_xlabel('Posición x (m)')&lt;br /&gt;
ax.set_ylabel('Tiempo t (s)')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) (ºC)')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
No se puede apreciar ninguna diferencia aparente entre las soluciones para los diferentes coeficientes. Para observar algún cambio vamos a dibujar la diferencia entre la solución y el estado estacionario en &amp;lt;math&amp;gt; x = 1/2&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt; t \in [0, 1]&amp;lt;/math&amp;gt;, es decir &amp;lt;math&amp;gt;u(1/2, t) − v(1/2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
[[Archivo:SOFIACCT1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
x=0.5&lt;br /&gt;
# Definir la función de temperatura con un número limitado de términos en la serie&lt;br /&gt;
def u(x, t, alpha, n_terms=10):   &lt;br /&gt;
    sum_series = sum(2 * (-1)**(k + 1) / (k * np.pi) * np.sin(k * np.pi * x) * np.exp(-k**2 * np.pi**2 * alpha * t) for k in range(1, n_terms + 1))&lt;br /&gt;
    return  x - sum_series&lt;br /&gt;
# Intervalo de tiempo&lt;br /&gt;
t = np.linspace(0, 1, 100)&lt;br /&gt;
# Calcular la temperatura en x=1/2 para diferentes alphas&lt;br /&gt;
u_k1 = u(0.5, t, alpha=1)-x  # D=1, correspondiente a alpha=1&lt;br /&gt;
u_k_half = u(0.5, t, alpha=0.5)-x  # D=1/2, correspondiente a alpha=0.5&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.plot(t, u_k1, label='k=1', color='blue')&lt;br /&gt;
plt.plot(t, u_k_half, label='k=1/2', color='red')&lt;br /&gt;
plt.xlabel('Tiempo (s)')&lt;br /&gt;
plt.ylabel('u(1/2, t) − v(1/2)')&lt;br /&gt;
plt.title('Efecto del Coeficiente de Conductividad Térmica ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El coeficiente de conductividad térmica juega un papel fundamental en determinar la velocidad a la que se propaga la temperatura dentro de un material. Al disminuir este coeficiente a la mitad, el proceso de conducción térmica a través de la varilla experimenta una notable ralentización. Esto se traduce en que, en cualquier instante dado t, la distribución de la temperatura a lo largo de la varilla VA avanzando a la mitad de velocidad en comparación con un escenario donde el coeficiente de conductividad térmica es de 1. Dicho cambio incide directamente en la rapidez con que se logra el equilibrio térmico en la varilla, Resultando en una difusión térmica más lenta hacia el equilibrio.&lt;br /&gt;
&lt;br /&gt;
== Cambio de condiciones ==&lt;br /&gt;
Supongamos ahora una barra unidimensional con extremos fijos a una temperatura de &amp;lt;math&amp;gt;0^\circ C&amp;lt;/math&amp;gt;. La temperatura inicial en cualquier punto de la barra está dada por la función &amp;lt;math&amp;gt;u(x,0) = max\{0, 1−4|x−1/2|\}&amp;lt;/math&amp;gt;, lo que significa que inicialmente la temperatura en la barra varía de acuerdo con esta función.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = max\{0, 1−4|x−1/2|\}, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Supongamos que, en tiempo infinito, \( t \rightarrow \infty \), se llega a una solución estacionaria y que, por tanto, ya no varía en tiempo. De modo, que tomando esta suposición llegamos al siguiente sistema con \( u(x,t) \xrightarrow{\text{t tiende a }\infty} v(x) \).&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;v_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,   \\&lt;br /&gt;
&amp;amp;v(0) = 0, &amp;amp; \\&lt;br /&gt;
&amp;amp;v(1) = 0, &amp;amp;  &lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuya solución es la constante \( v(x)=0 \). De modo que el sistema homogeneizado, coincide con el original, pues \( w(x,t)=u(x,t)-v(x) =u(x,t)-0=u(x,t)\) &lt;br /&gt;
Antes de exigir la condición inicial, la solución coincide con la del primer apartado, pues nos encontramos ante la misma ecuación diferencial, salvo por la función \( u(x,0)\), la cual no toma parte hasta el final de la resolución de esta suponiendo separación de variables. De modo que&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t) = \sum_{k=1}^{\infty} C_k  e^{(-k^2\pi ^2 t )}\sin(k \pi  x)&amp;lt;/math&amp;gt; &lt;br /&gt;
Para hallar el valor de los coeficientes &amp;lt;math&amp;gt; C_k&amp;lt;/math&amp;gt;, buscamos la serie de Fourier de la función &amp;lt;math&amp;gt; max\{0, 1−4|x−1/2|\}&amp;lt;/math&amp;gt; extendida de forma impar. Esto es posible, ya que&lt;br /&gt;
:&amp;lt;math&amp;gt; \int^1_0 (max\{0, 1−4|x−1/2|\})^2 dx=0.1667 &amp;lt; \infty&amp;lt;/math&amp;gt;  &lt;br /&gt;
El cálculo de los coeficientes se ha realizado numéricamente aproximando por la fórmula del trapecio. Los coeficientes se pueden consultar ejecutando el siguiente código en Python&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np &lt;br /&gt;
def f(x):   # Defino función que se quiere aproximar&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x):&lt;br /&gt;
    coefficients = np.zeros(n) # Guardo los coeficientes en una lista&lt;br /&gt;
    for k in range(1,n+1):     # Compiezo en k=1, pues sin(0)=0&lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients&lt;br /&gt;
&lt;br /&gt;
fourier_coefficients(f, 10, np.linspace(0, 1, 1000))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
De modo que ya se ha calculado la solución de este nuevo problema. Visualmente, responde a la siguiente gráfica, resultado de ejecutar este código:&lt;br /&gt;
[[Archivo:Solucion_Celia.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)    # Generar una cuadrícula de puntos&lt;br /&gt;
&lt;br /&gt;
def f(x):    # Defino mi función condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x): # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    coefficients = np.zeros(n)&lt;br /&gt;
    for k in range(1,n+1):         # Comenzamos en 1, pues sen(0)=0&lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients.tolist()   # Convertir a lista&lt;br /&gt;
coef=fourier_coefficients(f, N, x)&lt;br /&gt;
&lt;br /&gt;
def u(x, t, n): # Definir la solución en términos de la serie de Fourier con N términos&lt;br /&gt;
    sum = 0                 # Almacenamos la suma (resultado) hasta el término 10&lt;br /&gt;
    for k in range(1, n+1): # Para cada k calculo el lambda y sumo su coeficiente respectivo&lt;br /&gt;
        lambda_k = k* np.pi&lt;br /&gt;
        sum += coef[k-1] * np.sin(lambda_k * x) * np.exp(-lambda_k**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
Z = u(X, T, N) # Calcular los valores de la función para cada par (x, t)&lt;br /&gt;
&lt;br /&gt;
# Graficar la función en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))  # Cambio aquí para hacer la figura más grande&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z,cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x [m]')&lt;br /&gt;
ax.set_ylabel('Tiempo t [s]')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) [ºC]')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)  #Añado una guía de colores&lt;br /&gt;
surf.set_clim(0, 1)                       # Le introduzco cota inf/sup a los colores&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
​[[Archivo:fiiinfin.gif|400px|right|]]&lt;br /&gt;
Vemos como la temperatura sufre una gran variación en tiempos cercanos a 0, y rápidamente tiende a su estado estacionario, &amp;lt;math&amp;gt;v(x)=0&amp;lt;/math&amp;gt;. Para poder visualizarlo mejor mostraremos una un gif donde la imagen cambia a medida que el tiempo pasa, restringido a &amp;lt;math&amp;gt;t \in [0,0.3]&amp;lt;/math&amp;gt;, pues a partir de ahí, la temperatura está suficientemente cerca de la estacionaria y, por tanto, no hay gran variación en la temperatura.&lt;br /&gt;
&lt;br /&gt;
En un inicio, en \(t=0\) la temperatura toma valores negativos. Esto debido a que la exponencial se anula y son los coeficientes de Fourier quienes exigen el signo de la función. Una vez que &amp;lt;math&amp;gt;t&amp;gt;0&amp;lt;/math&amp;gt;, u se hace positivo en todas partes, lo que significa que la temperatura se difunde casi instantáneamente a lo largo del eje x, resultando en una velocidad de propagación infinita. Es decir, cualquier perturbación se siente enseguida en toda parte del dominio.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Terminamos el estudio de esta ecuación de difusión con el estudio del flujo, la inversa de la variación de la variable x de la solución. Para ello derivamos la solución que hemos obtenido. En términos de &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;, puesto que no son dependientes de x, obtenemos:&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{\partial}{\partial x}u(x,t)=\sum_{k=1}^{\infty} C_k  e^{(-k^2\pi ^2 t )}\cos(k \pi  x)\frac{1}{k \pi}&amp;lt;/math&amp;gt; como flujo de la ecuación homogénea. Adjuntamos el código con el cual se ha calculado la expresión de forma numérica y su respectiva representación gráfica:&lt;br /&gt;
[[Archivo:Flujo_Celia.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino la función de la ci para hallar los coef&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x): # Hallo los coef de Fourier  &lt;br /&gt;
    coefficients = np.zeros(n)&lt;br /&gt;
    for k in range(1,n+1): &lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients.tolist()   # Convertir a lista&lt;br /&gt;
coef=fourier_coefficients(f, N, x)&lt;br /&gt;
&lt;br /&gt;
def u(x, t, n):  # Definir la derivada en términos de la serie de Fourier con N términos&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, n+1):&lt;br /&gt;
        lambda_k = k* np.pi&lt;br /&gt;
        sum += coef[k-1] *np.cos(k * np.pi * x)/(k * np.pi) * np.exp(-lambda_k**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
# Graficamos&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(t, u(0,t,N), label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t, u(1,t,N), label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Varilla con extremo aislado==&lt;br /&gt;
En este estudio modelamos la difusión del calor en un alambre. Inicialmente, consideramos un alambre con una temperatura inicial de \( 0^\circ C \) en su extremo izquierdo. En contraste, el extremo derecho del alambre está aislado térmicamente, lo que significa que no hay transferencia de calor a través de este. En nuestro análisis, introducimos una fuente de calor en el centro del alambre en el instante inicial. Luego, examinamos cómo se propaga y se distribuye esta fuente de calor a lo largo del alambre con el tiempo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u_x(1, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = max\{0, 1−4|x−1/2|\}, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que la barra se encuentra aislada térmicamente en su extremo en \( x = 1 \) implica que no hay flujo de calor a través de este extremo. La ley de Fick, establece que el flujo de calor es proporcional al gradiente de temperatura según la ecuación \( q = -k \frac{du}{dx} \), donde \( q \) es el flujo de calor, \( k \) es la conductividad térmica y \( \frac{du}{dx} \) es el gradiente de temperatura a lo largo de la barra. En este contexto, si el flujo en dicho extremo es nulo, el gradiente de temperatura es nulo, por tanto  \( u_x(1, t) = 0 \). Observamos además que la solución estacionaria en nuestro caso es \( v(x) = 0 \), pues es la solución del problema de contorno.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
v''(x) = 0, \quad v(0) = 0, \quad v'(1) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De forma análoga a como ocurría en el apartado anterior, el problema que estamos estudiando en este caso es homogéneo. Por tanto, sin necesidad de hacer ningún cambio, procedemos a resolverlo mediante el método de separación de variables. Suponiendo que \( u(x, t) = X(x) \cdot T(t) \). Obtenemos como solución \( X(x) = A \sin(\pi(1/2+k)x) \) y \( T(t) = B e^{-(\pi^2)(1/2+k)^2 t} \). De modo que, la solución sin tener en cuenta la condición inicial es:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u_k(x, t) = c_k \cdot \sin(\pi(1/2+k)x) \cdot e^{-(\pi^2)(1/2+k)^2 t}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Para asegurar la existencia de solución del problema, es necesario verificar si existen ciertos coeficientes \( c_k \) tal que la solución pueda ser definida como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, t) = \sum_{k=0}^{\infty} c_k \cdot \sin(\pi(1/2+k)x) \cdot e^{-(\pi^2)(1/2+k)^2 t}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Para ello, es necesario verificar que las autofunciones \( \{\sin(\pi(1/2+k)x)\}_{k=0}^{\infty} \) forman un conjunto completo en \( L^2 [0, 1]\)  y ortogonal.&lt;br /&gt;
 &lt;br /&gt;
Para comprobar la ortogonalidad entre las autofunciones, calculamos la integral de su producto, o lo que es igual a calcular el producto escalar de \( L^2 [0,1]\), para dos funciones distintas \( \sin(\pi(1/2+k)x) \) y \( \sin(\pi(1/2+m)x) \) con \( k \neq m \in \mathbb{N}\):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{1} \sin(\pi(1/2+k)x) \sin(\pi(1/2+m)x) \, dx = \frac{\sin((k - m) \pi)}{2 (k - m) \pi} - \frac{\sin((1 + k + m) \pi)}{2 (1 + k + m) \pi}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Esta integral se anula para \( k,m \in  \mathbb{N} \), lo que demuestra que las autofunciones son ortogonales entre sí en el intervalo \([0, 1]\).&lt;br /&gt;
Por otro lado, dado que demostrar que las funciones forman una base completa para el espacio \( L^2[0,1] \) puede ser un proceso complejo y requiere un análisis detallado, en este trabajo supondremos que la forman.&lt;br /&gt;
[[Archivo:Solucion_Pablo.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)    # Generar una cuadrícula de puntos&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino mi fucnión condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficient(f, k, x):  # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    ck = 2* np.trapz(f(x) * np.sin(np.pi*(1/2+k)*x) ,x)&lt;br /&gt;
    return ck&lt;br /&gt;
&lt;br /&gt;
# Definir la solución en términos de la serie de Fourier con N términos&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0                 # Almacenamos la suma hasta el término 10&lt;br /&gt;
    for k in range(0, N+1): # Para cada k cálculo su coeficiente y lo sumo al resultado&lt;br /&gt;
        ck = fourier_coefficient(f, k, x)&lt;br /&gt;
        sum += ck * np.sin(np.pi*(1/2+k)*x) * np.exp(-(np.pi**2)*(1/2+k)**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Z = u(X, T, N)  # Calcular los valores de la función para cada par (x, t)&lt;br /&gt;
&lt;br /&gt;
# Graficar la función en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z,cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x [m]')&lt;br /&gt;
ax.set_ylabel('Tiempo t [s]')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) [ºC]')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)  #Añado una guía de colores&lt;br /&gt;
surf.set_clim(0, 1)                       # Le introduzco cota inf/sup a los colores&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gracias a los desarrollos en serie de Fourier, podemos calcular los coeficientes \( c_k \) para cumplir así la condición inicial. Dichos coeficientes se calculan mediante la integral:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_k := \frac{\int_{0}^{1} \max\{0, 1 - 4(x - 1/2)\} \sin(\pi(1/2+k)x) \, dx}{\int_{0}^{1} \sin^2(\pi(1/2+k)x) \, dx}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Dado que la integral es difícil de calcular analíticamente y en consecuencia es difícil obtener una expresión dependiente del parámetro &amp;lt;math&amp;gt; k&amp;lt;/math&amp;gt;, la resolveremos de forma numérica mediante el método del trapecio, de forma análoga a como se hizo en el modelo sin aislante térmico previo.&lt;br /&gt;
Para una comprensión más completa de la evolución de la temperatura del alambre en cuestión, es importante realizar un análisis visual de la solución propuesta. La representación gráfica de la solución en el intervalo de tiempo \( t \in [0, 1] \), considerando los primeros 10 términos de la serie de Fourier, ofrece una visualización tridimensional de la distribución del calor a lo largo del alambre en función del tiempo.&lt;br /&gt;
 &lt;br /&gt;
Es relevante destacar que a medida que transcurre el tiempo, la solución converge gradualmente hacia su estado estacionario, es decir, \(  v(x)=0 \) . Además, observamos que se verifica el principio del máximo, dado que tanto la temperatura máxima y mínima se alcanza en la frontera parabólica.&lt;br /&gt;
Esta última afirmación la podemos verificar de forma sencilla, obteniendo ambos valores de la función. El código utilizado mostró los siguientes datos.&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# Calcular la temperatura máxima y mínima&lt;br /&gt;
max_temperature = np.max(Z)&lt;br /&gt;
min_temperature = np.min(Z)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Temperatura máxima:&amp;quot;, max_temperature)&lt;br /&gt;
print(&amp;quot;Temperatura mínima:&amp;quot;, min_temperature)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Encontrar las coordenadas donde se alcanza la temperatura máxima y mínima&lt;br /&gt;
max_index = np.unravel_index(np.argmax(Z), Z.shape)&lt;br /&gt;
min_index = np.unravel_index(np.argmin(Z), Z.shape)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
max_x, max_t = x_values[max_index[1]], t_values[max_index[0]]&lt;br /&gt;
min_x, min_t = x_values[min_index[1]], t_values[min_index[0]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Coordenadas de la temperatura máxima: (x={}, t={})&amp;quot;.format(max_x, max_t))&lt;br /&gt;
print(&amp;quot;Coordenadas de la temperatura mínima: (x={}, t={})&amp;quot;.format(min_x, min_t))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Resultados de temperatura máxima y mínima&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parámetro!! Valor&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura máxima|| \(0.92 ^\circ \text{C}\)&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura mínima|| \(-0.03 ^\circ \text{C}\)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Coordenadas de temperatura máxima y mínima&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Coordenadas !! Valor&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura máxima|| \((x=0.50, t=0.00)\)&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura mínima|| \((x=0.81, t=0.00)\)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Observamos que el máximo debería ser de &amp;lt;math&amp;gt; 1^\circ \text{C} &amp;lt;/math&amp;gt;. No obstante, el resultado reportado por el código es &amp;lt;math&amp;gt; 0.92 ^\circ \text{C} &amp;lt;/math&amp;gt;. Esto se debe al uso de la aproximación por series de Fourier. Lo mismo ocurre con el valor mínimo que debería se de &amp;lt;math&amp;gt; 0^\circ \text{C} &amp;lt;/math&amp;gt;, no obstante el código reporta &amp;lt;math&amp;gt;-0.03^\circ \text{C} &amp;lt;/math&amp;gt;. Además dichos puntos están en la frontera parabólica, como afirma el principio del máximo. &lt;br /&gt;
&lt;br /&gt;
En este punto es interesante verificar si nuestro modelo es correcto. En tal caso, el extremo izquierdo de la barra no debería perder calor. Por lo tanto, calculamos la derivada de nuestra expresión y, gracias a la Ley de Fick, sabemos que el flujo de calor es igual a la derivada cambiada de signo. Obtenemos los siguientes resultados:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Flujo_Pablo.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 100     # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x_values = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t_values = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino mi función condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficient(f, k, x):   # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    ck = 2* np.trapz(f(x) * np.sin(np.pi*(1/2+k)*x) ,x)&lt;br /&gt;
    return ck&lt;br /&gt;
&lt;br /&gt;
def derivative_solution_x(x, t, N): # Definir la derivada de la solución respecto a x&lt;br /&gt;
    result = 0&lt;br /&gt;
    for k in range(0, N+1):&lt;br /&gt;
        ck = fourier_coefficient(f, k, x_values)&lt;br /&gt;
        result += ck * np.pi * (1/2 + k) * np.cos(np.pi * (1/2 + k) * x) * np.exp(-1 * (np.pi**2) * (1/2 + k)**2 * t)&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
# Calcular la derivada de la solución respecto a x para los extremos x=0 y x=1 a lo largo del tiempo&lt;br /&gt;
flux_x0 = [-derivative_solution_x(0, t, N) for t in t_values]&lt;br /&gt;
flux_x1 = [-derivative_solution_x(1, t, N) for t in t_values]&lt;br /&gt;
&lt;br /&gt;
# Graficar el flujo en los extremos x=0 y x=1 a lo largo del tiempo&lt;br /&gt;
plt.figure(figsize=(8, 5))&lt;br /&gt;
plt.plot(t_values, flux_x0, label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t_values, flux_x1, label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Observamos que todo el calor aportado en el instante inicial se disipa completamente por la izquierda de la varilla, ya que el flujo en &amp;lt;math&amp;gt; x=1&amp;lt;/math&amp;gt; es nulo, verificando así las condiciones fronteras de nuestro problema.&lt;br /&gt;
&lt;br /&gt;
==Solución fundamental==&lt;br /&gt;
La solución fundamental de la ecuación del calor es una función que describe la distribución de temperatura en un medio en función del tiempo y la posición. Para la ecuación del calor unidimensional, la solución fundamental está dada por la fórmula:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\phi(x, t) = \frac{1}{2 \sqrt{\pi t}} \exp\left(-\frac{x^2}{t}\right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
La solución fundamental describe cómo el calor se propaga y difunde a lo largo del medio a medida que pasa el tiempo, en este caso, por ejemplo, el calor en un alambre. Además la solución general del problema de Cauchy es la solución fundamental de la ecuación del calor.&lt;br /&gt;
El problema de Cauchy es el siguiente:&lt;br /&gt;
Dada la ecuación diferencial parcial:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u_t = k \cdot u_{xx},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
junto con las siguientes condiciones iniciales:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, 0) = f(x)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
donde \( f(x) \) es una función dada en el dominio \( 0 \leq x \leq L \) y \( k \) es una constante positiva que representa la difusividad térmica del medio.&lt;br /&gt;
Para resolver el problema de Cauchy para la ecuación del calor es mediante el uso de la solución fundamental y la técnica de convolución. La solución fundamental \( \phi(x, t) \) de la ecuación del calor es una función especial que satisface la ecuación diferencial parcial y las condiciones iniciales dadas.&lt;br /&gt;
 &lt;br /&gt;
Para resolver el problema de Cauchy, podemos utilizar la solución fundamental \( \phi(x, t) \) en combinación con la función inicial \( u_0(x) \) para obtener la solución general \( u(x, t) \) en cualquier instante de tiempo \( t \). Esto se logra convolucionando la función inicial \( f(x) \) con la solución fundamental \( \phi(x, t) \) .&lt;br /&gt;
La solución \( u(x, t) \) del problema de Cauchy se puede expresar como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, t) = \int_{-\infty}^{\infty} \phi(x - y, t) f(y) \, dy&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
En primer lugar, procederemos a visualizar una representación tridimensional de la solución fundamental  \( \phi(x, t) \).&lt;br /&gt;
[[Archivo:Solfundi.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Definir la función que representa la solución fundamental de la ecuación del calor&lt;br /&gt;
def phi(x, t):&lt;br /&gt;
    return 1 / (2 * np.sqrt(np.pi * t)) * np.exp(-x**2 / t)&lt;br /&gt;
&lt;br /&gt;
# Definir los valores de x y t para la gráfica&lt;br /&gt;
x_values = np.linspace(-1, 1, 100)    # Valores de x&lt;br /&gt;
t_values = np.linspace(0.01, 1, 200)  # Valores de t (tiempo)&lt;br /&gt;
&lt;br /&gt;
# Crear una malla de valores de x y t&lt;br /&gt;
X, T = np.meshgrid(x_values, t_values)&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución fundamental para cada par de valores (x, t)&lt;br /&gt;
Z = phi(X, T)&lt;br /&gt;
&lt;br /&gt;
# Crear una figura en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
# Graficar la superficie 3D&lt;br /&gt;
surf = ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
# Etiquetas y título con el símbolo de &amp;quot;phi&amp;quot;&lt;br /&gt;
ax.set_xlabel(r'$x$')&lt;br /&gt;
ax.set_ylabel(r'$t$')&lt;br /&gt;
ax.set_zlabel(r'$\phi(x, t)$')&lt;br /&gt;
ax.set_title(r'Solución fundamental de la ecuación del calor: $\phi(x, t)$')&lt;br /&gt;
&lt;br /&gt;
# Añadir una barra de colores para indicar los valores de Z&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=8)&lt;br /&gt;
plt.show()    # Mostrar la gráfica&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
En esta ocasión veremos la solución de la ecuación del calor \( u_t - u_{xx} = 0 \) en \( x \in \mathbb{R} \) asociada al dato inicial \( f(x) = 1_{[-1,1]} \), viene dada por la convolución:&lt;br /&gt;
 &lt;br /&gt;
:&amp;lt;math&amp;gt; u(x, t) = \int_{-\infty}^{\infty} \phi(x - y, t) f(y) \, dy = \int_{-\infty}^{\infty} \frac{1}{2 \sqrt{\pi t}} \exp\left(-\frac{(x-y)^2}{t}\right) 1_{[-1,1]} \, dy &amp;lt;/math&amp;gt;&lt;br /&gt;
Dibujaremos la solución en diferentes instantes de tiempo: \( t = 0.001 \), \( t = 0.01 \) , \( t = 0.1 \), \( t = 1 \).  Aproximaremos la integral indefinida utilizando la fórmula del trapecio.&lt;br /&gt;
[[Archivo:gifgif.gif|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# Importar las bibliotecas necesarias&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Definir la solución fundamental en 2D&lt;br /&gt;
def phi_2D(x1, x2, t):&lt;br /&gt;
    if t == 0:&lt;br /&gt;
        return np.zeros_like(x1)  # Devuelve una matriz de ceros si t es cero&lt;br /&gt;
    else:&lt;br /&gt;
        return 1 / (4 * np.pi * t) * np.exp(-(x1**2 + x2**2) / (4 * t))&lt;br /&gt;
&lt;br /&gt;
# Definir el intervalo espacial&lt;br /&gt;
x1_values = np.linspace(-1, 1, 100)  # Valores de x1&lt;br /&gt;
x2_values = np.linspace(-1, 1, 100)  # Valores de x2&lt;br /&gt;
x1, x2 = np.meshgrid(x1_values, x2_values)  # Malla de valores de x1 y x2&lt;br /&gt;
&lt;br /&gt;
# Definir los tiempos&lt;br /&gt;
t_values = np.linspace(0, 0.1, 3)  # Valores de tiempo&lt;br /&gt;
&lt;br /&gt;
# Tamaño de la figura&lt;br /&gt;
fig = plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
# Graficar la solución fundamental en 2D para cada tiempo&lt;br /&gt;
for i, t in enumerate(t_values, 1):&lt;br /&gt;
    ax = fig.add_subplot(1, len(t_values), i, projection='3d')&lt;br /&gt;
    phi = phi_2D(x1, x2, t)&lt;br /&gt;
    ax.plot_surface(x1, x2, phi, cmap='viridis')&lt;br /&gt;
    ax.set_title(f'Tiempo $t=${round(t, 3)}')&lt;br /&gt;
    ax.set_xlabel('x1')&lt;br /&gt;
    ax.set_ylabel('x2')&lt;br /&gt;
    ax.set_zlabel('phi(x1, x2, t)')&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Solución fundamental dimensión 2==&lt;br /&gt;
&lt;br /&gt;
Veamos el problema de Cauchy para la ecuación del calor en dos dimensiones (\( x_1, x_2 \) y \( t \)). Sea \( u(x_1, x_2, t) \) la función de temperatura en un medio bidimensional, que satisface la ecuación del calor:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u_t = k(u_{x_1 x_1} + u_{x_2 x_2})&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Con las condiciones iniciales dadas por la temperatura inicial \( u(x_1, x_2, 0) = f(x_1, x_2) \) para algún campo de temperatura dado \( f(x_1, x_2)  \text{para} (x_1, x_2) \in \partial \Omega \), donde \( \Omega \) es el dominio bidimensional sobre el cual se define la temperatura.&lt;br /&gt;
La solución general a este problema (sin contar la condición inicial) viene dada por la siguiente expresión: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\phi(x_1, x_2, t) = \frac{1}{4 \pi t} \exp\left( -\frac{x_1^2 + x_2^2}{4t} \right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Procederemos ahora a representar la solución fundamental, donde veremos un gráfico tridimensional, &amp;lt;math&amp;gt; x_1, x_2, \phi(x_1, x_2, t) &amp;lt;/math&amp;gt; donde se ha fijado un tiempo t.&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Fiiinfin.gif&amp;diff=70115</id>
		<title>Archivo:Fiiinfin.gif</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Fiiinfin.gif&amp;diff=70115"/>
				<updated>2024-03-07T18:58:57Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor(Grupo_Eau_De_Parfum(EDP)))&amp;diff=70110</id>
		<title>Ecuación del calor(Grupo Eau De Parfum(EDP)))</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Ecuaci%C3%B3n_del_calor(Grupo_Eau_De_Parfum(EDP)))&amp;diff=70110"/>
				<updated>2024-03-07T18:54:19Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: /* Cambio de condiciones */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ TrabajoED | Ecuación del Calor. Grupo Eau De Parfum (EDP) | [[:Categoría:EDP|EDP]]|[[:Categoría:EDP23/24|2023-24]] | &lt;br /&gt;
*Lestau Torres, Pablo&lt;br /&gt;
*López Rojo, Celia&lt;br /&gt;
*Muñoz Guijarro, Sofía}}&lt;br /&gt;
==Introducción==&lt;br /&gt;
&lt;br /&gt;
==Conocimientos previos==&lt;br /&gt;
Antes de comenzar será de gran ayuda introducir una serie de conceptos que utilizaremos a lo largo este trabajo:&lt;br /&gt;
&lt;br /&gt;
*'''Ley del calor de Newton''': describe la tasa de pérdida o ganancia de calor de un objeto en relación con el ambiente circundante.La ley se expresa comúnmente como:&lt;br /&gt;
:&amp;lt;math&amp;gt; \frac{d T(t)}{d t} = - k (T(t) - T_{\mathrm{a}}) &amp;lt;/math&amp;gt;,&lt;br /&gt;
siendo &amp;lt;math&amp;gt;T(t) &amp;lt;/math&amp;gt;la temperatura del objeto en un tiempo dado, &amp;lt;math&amp;gt;T_{\mathrm{a}}&amp;lt;/math&amp;gt; la temperatura ambiente y &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; la constante de proporcionalidad.&lt;br /&gt;
&lt;br /&gt;
*'''Principio de conservación de la energía calorífica''': establece que la variación de energía calorífica sobre un cuerpo V se debe al balance entre el calor que entra y sale del cuerpo más una producción externa.&lt;br /&gt;
&lt;br /&gt;
*'''Ley de Fourier''':intaura que el calor fluye desde regiones de alta temperatura a regiones de baja temperatura, y la cantidad de flujo de calor depende de la diferencia de temperatura y las propiedades del material.La expresión matemática de la Ley de Fourier es:&lt;br /&gt;
:&amp;lt;math&amp;gt; \mathbf{q}  = - k {\nabla} T &amp;lt;/math&amp;gt;,   &lt;br /&gt;
donde &amp;lt;math&amp;gt; \mathbf{q}&amp;lt;/math&amp;gt; es el vector de flujo de calor por unidad de superficie y &amp;lt;math&amp;gt;  {\nabla} T &amp;lt;/math&amp;gt; es el gradiente del campo de temperatura en el interior del material.&lt;br /&gt;
*'''Coeficiente de conductividad térmica (D)''':cuantifica la capacidad de un material para conducir el calor. Se define como la cantidad de calor que pasa en un segundo a través de un metro cuadrado de material cuando la diferencia de temperatura a través del material,cuando la diferencia de temperatura a través del material es de un grado(ºC) es de un grado, y el espesor del material es de un metro.&lt;br /&gt;
*'''Principio del máximo''': Sea &amp;lt;math&amp;gt;u \in C^{2,1}(Q_T)\cap (\overline{Q_T})&amp;lt;/math&amp;gt; tal que  &amp;lt;math&amp;gt;u_t - \Delta u \leq 0&amp;lt;/math&amp;gt; en &amp;lt;math&amp;gt;Q_T&amp;lt;/math&amp;gt;. Entonces u alcanza su máximo en la frontera parabólica &amp;lt;math&amp;gt;\partial _p Q_T&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;\max_{\overline{Q_T}} u = \max_{\partial _p Q_T} u&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nuestro problema original ==&lt;br /&gt;
Consideramos una varilla metálica de 1 metro de longitud , que se encuentra aislada por su superficie lateral, de manera que la conducción de calor únicamente se produce en la dirección longitudinal. La temperatura inicial de la varilla es de 0ºC. En el extremo izquierdo se consigue mantener la temperatura a 0 ºC mientras que en el derecho la temperatura es siempre de 1 ºC. Además  el calor específico toma un valor constante de 1.En cuanto al coeficiente de conductividad térmica,vamos a observar cómo sería nuestro problema para un valor cualquiera y seguidamente especificaremos el valor constante de 1.&lt;br /&gt;
&lt;br /&gt;
Pero antes de abordar matemáticamente nuestro problema, vamos a intentar deducir lo que podría ocurrir. Considerando que la temperatura en el extremo derecho de la varilla es superior a la del extremo izquierdo, el calor comenzará a transferirse desde la zona más cálida, elevando la temperatura a lo largo de la varilla y promoviendo el desplazamiento del calor hacia la región más fría. Simultáneamente, el incremento de la temperatura interna provoca una reducción del flujo de calor entrante y a un aumento del saliente con el tiempo. Anticipamos que, en algún momento, ambos flujos se equilibrarán, conduciendo la temperatura de la varilla a un estado estacionario.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por lo que nuestro problema a resolver queda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - Du_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Debemos reescalar en tiempo, para facilitarnos los cálculos, por lo que realizamos el cambio de variable  &amp;lt;math&amp;gt;\tau = \alpha t, \tau \in\mathbb{R} &amp;lt;/math&amp;gt;. Por tanto,  &amp;lt;math&amp;gt; u(x,t)=U(x,\tau)&amp;lt;/math&amp;gt; y entonces &amp;lt;math&amp;gt; \alpha U_{\tau}-DU_{xx}=0&amp;lt;/math&amp;gt; .Tomando &amp;lt;math&amp;gt; \alpha = D&amp;lt;/math&amp;gt; , obtenemos el problema &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;U_{\tau} - U_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(0, \tau) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(1, \tau) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;U(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Este problema se resuelve mediante el método de variación de las constantes, pero un factor clave para su implementación es que las condiciones de contorno estén homogeneizadas, es decir, que sean igual a cero. Esto se conseguirá mediante un cambio de variable, en el que es imprescindible la llamada solución estacionaria.&lt;br /&gt;
La solución estacionaria de nuestro problema es aquella que no varía con el tiempo &amp;lt;math&amp;gt; v=\lim_{t \to \infty} U(x,\tau)&amp;lt;/math&amp;gt;y por tanto, su derivada  respecto al tiempo es nula. Nuestro sistema queda ahora:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;-v_{xx}   = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, \\&lt;br /&gt;
&amp;amp;v(0)= 0 \\&lt;br /&gt;
&amp;amp;v(1) = 1, &lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Resolviendo obtenemos que &amp;lt;math&amp;gt; v(x)=x &amp;lt;/math&amp;gt; es nuestra solución estacionaria, cuya expresión gráfica es:&lt;br /&gt;
[[Archivo:sofiaest1.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import numpy as np&lt;br /&gt;
# Define el rango de x entre 0 y 1&lt;br /&gt;
x = np.linspace(0, 1, 100)  &lt;br /&gt;
# Define la función  estacionaria v(x) = x&lt;br /&gt;
v_x = x&lt;br /&gt;
# Crea la gráfica&lt;br /&gt;
plt.plot(x, v_x)&lt;br /&gt;
# Etiquetas de los ejes&lt;br /&gt;
plt.xlabel('x')&lt;br /&gt;
plt.ylabel('v(x)')&lt;br /&gt;
# Título de la gráfica&lt;br /&gt;
plt.title('Gráfica de la solución estacionaria v(x)=x')&lt;br /&gt;
# Muestra la gráfica&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Una vez hallada la solución estacionaria, podemos homogeneizar nuestro problema mediante el cambio de variable &amp;lt;math&amp;gt;w(x,t)= U(x,\tau)-v(x)&amp;lt;/math&amp;gt;.Por tanto, sustituyendo en el sistema inicial obtenemos:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;w_{\tau} - w_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(0, \tau) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(1, \tau) = 1-1=0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;w(x, 0) = 0-x=-x, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Nuestro sistema es ya homogéneo,por lo que aplicamos el método de separación de variables (que consiste en expresar la solución como el producto de una función que depende únicamente de la variable espacial x y una función dependiente de la variable temporal) y obtenemos como solución homogénea:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;w(x,\tau) =  \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 \tau}\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Y deshaciendo los dos cambios de variable, nuestra solución al problema original es por tanto:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 Dt }\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Como en nuestro caso, el coeficiente de conductividad térmica es igual a 1, nuestro sistema es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - Du_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
y nuestra solución:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {-k^2\pi ^2 t }\sin(k\pi  x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Mostramos gráficamente la solución, observando que se cumplen las condiciones de frontera y además según avanza el tiempo, la solución deja de depender del tiempo y alcanza un estado estacionario, determinado justamente por la solución estacionaria obtenida anteriormente, &amp;lt;math&amp;gt; v(x)=x &amp;lt;/math&amp;gt;. Cabe destacar que en &amp;lt;math&amp;gt; t=0 &amp;lt;/math&amp;gt;  obtenemos las oscilaciones correspondientes a la serie de Fourier de la condición inicial, que se aproxima mediante senos.&lt;br /&gt;
[[Archivo:SOFIASOL11.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
# Solución usando los primeros N términos de la serie&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculasmos los coeficientes C_k&lt;br /&gt;
        C_k = 2 * (-1)**(k) / (k * np.pi)  &lt;br /&gt;
        sum += C_k * np.sin(k*np.pi * x) * np.exp(-lambda_k * t*D) &lt;br /&gt;
    return x+sum&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
&lt;br /&gt;
# Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12,8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x (m)')&lt;br /&gt;
ax.set_ylabel('Tiempo t (s)')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) (ºC)')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Flujo===&lt;br /&gt;
Para estudiar el flujo de calor saliente y entrante en ambos extremos de la varilla a lo largo del tiempo, nos debemos basar en la ley de Fourier &amp;lt;math&amp;gt; \mathbf{q}  = - k  u_x(x,t) &amp;lt;/math&amp;gt;&lt;br /&gt;
Por lo que necesitamos obtener la derivada de la solución con respecto al espacio:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(x,t)= 1+\sum_{k=1}^{\infty}(-1)^(k+1)2 e^(-k^2\pi ^2 t )\cos(k\pi  x) &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Ahora, el flujo en los extremos es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(0,t)=1 +\sum_{k=1}^{\infty}(-1)^(k+1)2 e^{-k^2\pi ^2 t } &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; u_x(1,t)=1+\sum_{k=1}^{\infty}(2) e^{-k^2\pi ^2 t } &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Gráficamente,&lt;br /&gt;
[[Archivo:SOFIAFLUJO1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
# Derivada de nuestra solución respecto al espacio, multiplicado por -k&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculamos los coeficientes C_k mediante extensión impar&lt;br /&gt;
        C_k = 2 * (-1)**(k+1)  &lt;br /&gt;
        sum += C_k * np.cos(k*np.pi * x) * np.exp(-lambda_k * t) &lt;br /&gt;
    return 1+sum&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(t, u(0,t,N), label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t, u(1,t,N), label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Al comenzar con un flujo de calor nulo en el extremo izquierdo, esto  indica que hay una gran diferencia de temperatura entre ambos extremos de la varilla. El extremo izquierdo está perdiendo calor rápidamente hacia la zona más fría. A medida que el calor se va transfiriendo por la varilla, el gradiente de la temperatura cambia y el extremo derecho comienza a calentarse, debido al flujo de calor que proviene del otro extremo. Este cambio conduce a que el flujo en ambos extremos comience a estar en equilibrio. &lt;br /&gt;
Esta estabilización de flujo en -1 refleja que se ha alcanzado un estado estacionario en el sistema, indicando que cualquier calor entrante en la varilla, se compensa con el calor saliente, manteniendo una distribución de temperatura uniforme.&lt;br /&gt;
&lt;br /&gt;
Este comportamiento refleja la Ley de Fourier, donde al principio la gran diferencia de temperatura induce un flujo de calor bastante significativo, que se va estabilizando llegando a un flujo de -1 en ambos extremos, alcanzando así un gradiente de temperatura constante, con la misma cantidad de calor saliendo hacia fuera desde ambos extremos.&lt;br /&gt;
&lt;br /&gt;
==Cambio de coeficiente de conductividad térmica ==&lt;br /&gt;
Hemos estudiado el problema de Cauchy para un coeficiente de difusión de 1,veamos que ocurre si lo disminuimos a su mitad, es decir,&amp;lt;math&amp;gt;D=\frac{1}{2}&amp;lt;/math&amp;gt;.Nuestro nuevo problema por tanto es:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - \frac{1}{2}u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 1, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuya solución es &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;u(x,t) = x+ \sum_{k=1}^{\infty} \frac{2(-1)^{k}}{k\pi} e^ {\frac{-k^2\pi ^2 t}{2}}\sin(k\pi x)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gráficamente, únicamente hemos cambiado el valor de D en el código (2)  y obtenemos:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:SOFIASOL22.png|400px|thumb|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1      # Tiempo final&lt;br /&gt;
D=1/2       # Coeficiente de conductividad térmica&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
x_points = 100  # Puntos en la dirección x&lt;br /&gt;
t_points = 100  # Puntos en la dirección t&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, x_points)&lt;br /&gt;
t = np.linspace(0, T, t_points)&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
# Solución usando los primeros N términos de la serie&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, N+1):&lt;br /&gt;
        lambda_k = k**2 * np.pi**2 &lt;br /&gt;
        #Calculasmos los coeficientes C_k&lt;br /&gt;
        C_k = 2 * (-1)**(k) / (k * np.pi)  &lt;br /&gt;
        sum += C_k * np.sin(k*np.pi * x) * np.exp(-lambda_k * t*D) &lt;br /&gt;
    return x+sum&lt;br /&gt;
# Calcular la solución en la malla&lt;br /&gt;
Z = u(X, T, N)&lt;br /&gt;
# Graficar&lt;br /&gt;
fig = plt.figure(figsize=(12,8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
ax.set_xlabel('Posición x (m)')&lt;br /&gt;
ax.set_ylabel('Tiempo t (s)')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) (ºC)')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
No se puede apreciar ninguna diferencia aparente entre las soluciones para los diferentes coeficientes. Para observar algún cambio vamos a dibujar la diferencia entre la solución y el estado estacionario en &amp;lt;math&amp;gt; x = 1/2&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt; t \in [0, 1]&amp;lt;/math&amp;gt;, es decir &amp;lt;math&amp;gt;u(1/2, t) − v(1/2)&amp;lt;/math&amp;gt;,&lt;br /&gt;
[[Archivo:SOFIACCT1.png|500px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
x=0.5&lt;br /&gt;
# Definir la función de temperatura con un número limitado de términos en la serie&lt;br /&gt;
def u(x, t, alpha, n_terms=10):   &lt;br /&gt;
    sum_series = sum(2 * (-1)**(k + 1) / (k * np.pi) * np.sin(k * np.pi * x) * np.exp(-k**2 * np.pi**2 * alpha * t) for k in range(1, n_terms + 1))&lt;br /&gt;
    return  x - sum_series&lt;br /&gt;
# Intervalo de tiempo&lt;br /&gt;
t = np.linspace(0, 1, 100)&lt;br /&gt;
# Calcular la temperatura en x=1/2 para diferentes alphas&lt;br /&gt;
u_k1 = u(0.5, t, alpha=1)-x  # D=1, correspondiente a alpha=1&lt;br /&gt;
u_k_half = u(0.5, t, alpha=0.5)-x  # D=1/2, correspondiente a alpha=0.5&lt;br /&gt;
# Graficar&lt;br /&gt;
plt.plot(t, u_k1, label='k=1', color='blue')&lt;br /&gt;
plt.plot(t, u_k_half, label='k=1/2', color='red')&lt;br /&gt;
plt.xlabel('Tiempo (s)')&lt;br /&gt;
plt.ylabel('u(1/2, t) − v(1/2)')&lt;br /&gt;
plt.title('Efecto del Coeficiente de Conductividad Térmica ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El coeficiente de conductividad térmica juega un papel fundamental en determinar la velocidad a la que se propaga la temperatura dentro de un material. Al disminuir este coeficiente a la mitad, el proceso de conducción térmica a través de la varilla experimenta una notable ralentización. Esto se traduce en que, en cualquier instante dado t, la distribución de la temperatura a lo largo de la varilla VA avanzando a la mitad de velocidad en comparación con un escenario donde el coeficiente de conductividad térmica es de 1. Dicho cambio incide directamente en la rapidez con que se logra el equilibrio térmico en la varilla, Resultando en una difusión térmica más lenta hacia el equilibrio.&lt;br /&gt;
&lt;br /&gt;
== Cambio de condiciones ==&lt;br /&gt;
Supongamos ahora una barra unidimensional con extremos fijos a una temperatura de &amp;lt;math&amp;gt;0^\circ C&amp;lt;/math&amp;gt;. La temperatura inicial en cualquier punto de la barra está dada por la función &amp;lt;math&amp;gt;u(x,0) = max\{0, 1−4|x−1/2|\}&amp;lt;/math&amp;gt;, lo que significa que inicialmente la temperatura en la barra varía de acuerdo con esta función.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(1, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = max\{0, 1−4|x−1/2|\}, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Supongamos que, en tiempo infinito, \( t \rightarrow \infty \), se llega a una solución estacionaria y que, por tanto, ya no varía en tiempo. De modo, que tomando esta suposición llegamos al siguiente sistema con \( u(x,t) \xrightarrow{\text{t tiende a }\infty} v(x) \).&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;v_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1,   \\&lt;br /&gt;
&amp;amp;v(0) = 0, &amp;amp; \\&lt;br /&gt;
&amp;amp;v(1) = 0, &amp;amp;  &lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuya solución es la constante \( v(x)=0 \). De modo que el sistema homogeneizado, coincide con el original, pues \( w(x,t)=u(x,t)-v(x) =u(x,t)-0=u(x,t)\) &lt;br /&gt;
Antes de exigir la condición inicial, la solución coincide con la del primer apartado, pues nos encontramos ante la misma ecuación diferencial, salvo por la función \( u(x,0)\), la cual no toma parte hasta el final de la resolución de esta suponiendo separación de variables. De modo que&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;u(x,t) = \sum_{k=1}^{\infty} C_k  e^{(-k^2\pi ^2 t )}\sin(k \pi  x)&amp;lt;/math&amp;gt; &lt;br /&gt;
Para hallar el valor de los coeficientes &amp;lt;math&amp;gt; C_k&amp;lt;/math&amp;gt;, buscamos la serie de Fourier de la función &amp;lt;math&amp;gt; max\{0, 1−4|x−1/2|\}&amp;lt;/math&amp;gt; extendida de forma impar. Esto es posible, ya que&lt;br /&gt;
:&amp;lt;math&amp;gt; \int^1_0 (max\{0, 1−4|x−1/2|\})^2 dx=0.1667 &amp;lt; \infty&amp;lt;/math&amp;gt;  &lt;br /&gt;
El cálculo de los coeficientes se ha realizado numéricamente aproximando por la fórmula del trapecio. Los coeficientes se pueden consultar ejecutando el siguiente código en Python&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np &lt;br /&gt;
def f(x):   # Defino función que se quiere aproximar&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x):&lt;br /&gt;
    coefficients = np.zeros(n) # Guardo los coeficientes en una lista&lt;br /&gt;
    for k in range(1,n+1):     # Compiezo en k=1, pues sin(0)=0&lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients&lt;br /&gt;
&lt;br /&gt;
fourier_coefficients(f, 10, np.linspace(0, 1, 1000))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
De modo que ya se ha calculado la solución de este nuevo problema. Visualmente, responde a la siguiente gráfica, resultado de ejecutar este código:&lt;br /&gt;
[[Archivo:Solucion_Celia.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)    # Generar una cuadrícula de puntos&lt;br /&gt;
&lt;br /&gt;
def f(x):    # Defino mi función condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x): # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    coefficients = np.zeros(n)&lt;br /&gt;
    for k in range(1,n+1):         # Comenzamos en 1, pues sen(0)=0&lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients.tolist()   # Convertir a lista&lt;br /&gt;
coef=fourier_coefficients(f, N, x)&lt;br /&gt;
&lt;br /&gt;
def u(x, t, n): # Definir la solución en términos de la serie de Fourier con N términos&lt;br /&gt;
    sum = 0                 # Almacenamos la suma (resultado) hasta el término 10&lt;br /&gt;
    for k in range(1, n+1): # Para cada k calculo el lambda y sumo su coeficiente respectivo&lt;br /&gt;
        lambda_k = k* np.pi&lt;br /&gt;
        sum += coef[k-1] * np.sin(lambda_k * x) * np.exp(-lambda_k**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
Z = u(X, T, N) # Calcular los valores de la función para cada par (x, t)&lt;br /&gt;
&lt;br /&gt;
# Graficar la función en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))  # Cambio aquí para hacer la figura más grande&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z,cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x [m]')&lt;br /&gt;
ax.set_ylabel('Tiempo t [s]')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) [ºC]')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)  #Añado una guía de colores&lt;br /&gt;
surf.set_clim(0, 1)                       # Le introduzco cota inf/sup a los colores&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
​[[Archivo:giffin.gif|400px|right|]]&lt;br /&gt;
Vemos como la temperatura sufre una gran variación en tiempos cercanos a 0, y rápidamente tiende a su estado estacionario, &amp;lt;math&amp;gt;v(x)=0&amp;lt;/math&amp;gt;. Para poder visualizarlo mejor mostraremos una un gif donde la imagen cambia a medida que el tiempo pasa, restringido a &amp;lt;math&amp;gt;t \in [0,0.3]&amp;lt;/math&amp;gt;, pues a partir de ahí, la temperatura está suficientemente cerca de la estacionaria y, por tanto, no hay gran variación en la temperatura.&lt;br /&gt;
&lt;br /&gt;
En un inicio, en \(t=0\) la temperatura toma valores negativos. Esto debido a que la exponencial se anula y son los coeficientes de Fourier quienes exigen el signo de la función. Una vez que &amp;lt;math&amp;gt;t&amp;gt;0&amp;lt;/math&amp;gt;, u se hace positivo en todas partes, lo que significa que la temperatura se difunde casi instantáneamente a lo largo del eje x, resultando en una velocidad de propagación infinita. Es decir, cualquier perturbación se siente enseguida en toda parte del dominio.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Terminamos el estudio de esta ecuación de difusión con el estudio del flujo, la inversa de la variación de la variable x de la solución. Para ello derivamos la solución que hemos obtenido. En términos de &amp;lt;math&amp;gt;C_k&amp;lt;/math&amp;gt;, puesto que no son dependientes de x, obtenemos:&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{\partial}{\partial x}u(x,t)=\sum_{k=1}^{\infty} C_k  e^{(-k^2\pi ^2 t )}\cos(k \pi  x)\frac{1}{k \pi}&amp;lt;/math&amp;gt; como flujo de la ecuación homogénea. Adjuntamos el código con el cual se ha calculado la expresión de forma numérica y su respectiva representación gráfica:&lt;br /&gt;
[[Archivo:Flujo_Celia.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino la función de la ci para hallar los coef&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficients(f, n, x): # Hallo los coef de Fourier  &lt;br /&gt;
    coefficients = np.zeros(n)&lt;br /&gt;
    for k in range(1,n+1): &lt;br /&gt;
        coefficients[k-1] = 2 * np.trapz(f(x) * np.sin(k * np.pi * x), x)&lt;br /&gt;
    return coefficients.tolist()   # Convertir a lista&lt;br /&gt;
coef=fourier_coefficients(f, N, x)&lt;br /&gt;
&lt;br /&gt;
def u(x, t, n):  # Definir la derivada en términos de la serie de Fourier con N términos&lt;br /&gt;
    sum = 0&lt;br /&gt;
    for k in range(1, n+1):&lt;br /&gt;
        lambda_k = k* np.pi&lt;br /&gt;
        sum += coef[k-1] *np.cos(k * np.pi * x)/(k * np.pi) * np.exp(-lambda_k**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
# Graficamos&lt;br /&gt;
plt.figure(figsize=(8, 6))&lt;br /&gt;
plt.plot(t, u(0,t,N), label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t, u(1,t,N), label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Varilla con extremo aislado==&lt;br /&gt;
En este estudio modelamos la difusión del calor en un alambre. Inicialmente, consideramos un alambre con una temperatura inicial de \( 0^\circ C \) en su extremo izquierdo. En contraste, el extremo derecho del alambre está aislado térmicamente, lo que significa que no hay transferencia de calor a través de este. En nuestro análisis, introducimos una fuente de calor en el centro del alambre en el instante inicial. Luego, examinamos cómo se propaga y se distribuye esta fuente de calor a lo largo del alambre con el tiempo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\left\{&lt;br /&gt;
\begin{aligned}&lt;br /&gt;
&amp;amp;u_t - u_{xx}  = 0, &amp;amp; 0 &amp;lt; x &amp;lt; 1, t &amp;gt; 0,   \\&lt;br /&gt;
&amp;amp;u(0, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u_x(1, t) = 0, &amp;amp; t &amp;gt; 0, \\&lt;br /&gt;
&amp;amp;u(x, 0) = max\{0, 1−4|x−1/2|\}, &amp;amp; 0 &amp;lt; x &amp;lt; 1,&lt;br /&gt;
\end{aligned}&lt;br /&gt;
\right.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que la barra se encuentra aislada térmicamente en su extremo en \( x = 1 \) implica que no hay flujo de calor a través de este extremo. La ley de Fick, establece que el flujo de calor es proporcional al gradiente de temperatura según la ecuación \( q = -k \frac{du}{dx} \), donde \( q \) es el flujo de calor, \( k \) es la conductividad térmica y \( \frac{du}{dx} \) es el gradiente de temperatura a lo largo de la barra. En este contexto, si el flujo en dicho extremo es nulo, el gradiente de temperatura es nulo, por tanto  \( u_x(1, t) = 0 \). Observamos además que la solución estacionaria en nuestro caso es \( v(x) = 0 \), pues es la solución del problema de contorno.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
v''(x) = 0, \quad v(0) = 0, \quad v'(1) = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De forma análoga a como ocurría en el apartado anterior, el problema que estamos estudiando en este caso es homogéneo. Por tanto, sin necesidad de hacer ningún cambio, procedemos a resolverlo mediante el método de separación de variables. Suponiendo que \( u(x, t) = X(x) \cdot T(t) \). Obtenemos como solución \( X(x) = A \sin(\pi(1/2+k)x) \) y \( T(t) = B e^{-(\pi^2)(1/2+k)^2 t} \). De modo que, la solución sin tener en cuenta la condición inicial es:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u_k(x, t) = c_k \cdot \sin(\pi(1/2+k)x) \cdot e^{-(\pi^2)(1/2+k)^2 t}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Para asegurar la existencia de solución del problema, es necesario verificar si existen ciertos coeficientes \( c_k \) tal que la solución pueda ser definida como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, t) = \sum_{k=0}^{\infty} c_k \cdot \sin(\pi(1/2+k)x) \cdot e^{-(\pi^2)(1/2+k)^2 t}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Para ello, es necesario verificar que las autofunciones \( \{\sin(\pi(1/2+k)x)\}_{k=0}^{\infty} \) forman un conjunto completo en \( L^2 [0, 1]\)  y ortogonal.&lt;br /&gt;
 &lt;br /&gt;
Para comprobar la ortogonalidad entre las autofunciones, calculamos la integral de su producto, o lo que es igual a calcular el producto escalar de \( L^2 [0,1]\), para dos funciones distintas \( \sin(\pi(1/2+k)x) \) y \( \sin(\pi(1/2+m)x) \) con \( k \neq m \in \mathbb{N}\):&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{1} \sin(\pi(1/2+k)x) \sin(\pi(1/2+m)x) \, dx = \frac{\sin((k - m) \pi)}{2 (k - m) \pi} - \frac{\sin((1 + k + m) \pi)}{2 (1 + k + m) \pi}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Esta integral se anula para \( k,m \in  \mathbb{N} \), lo que demuestra que las autofunciones son ortogonales entre sí en el intervalo \([0, 1]\).&lt;br /&gt;
Por otro lado, dado que demostrar que las funciones forman una base completa para el espacio \( L^2[0,1] \) puede ser un proceso complejo y requiere un análisis detallado, en este trabajo supondremos que la forman.&lt;br /&gt;
[[Archivo:Solucion_Pablo.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 10      # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
X, T = np.meshgrid(x, t)    # Generar una cuadrícula de puntos&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino mi fucnión condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficient(f, k, x):  # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    ck = 2* np.trapz(f(x) * np.sin(np.pi*(1/2+k)*x) ,x)&lt;br /&gt;
    return ck&lt;br /&gt;
&lt;br /&gt;
# Definir la solución en términos de la serie de Fourier con N términos&lt;br /&gt;
def u(x, t, N):&lt;br /&gt;
    sum = 0                 # Almacenamos la suma hasta el término 10&lt;br /&gt;
    for k in range(0, N+1): # Para cada k cálculo su coeficiente y lo sumo al resultado&lt;br /&gt;
        ck = fourier_coefficient(f, k, x)&lt;br /&gt;
        sum += ck * np.sin(np.pi*(1/2+k)*x) * np.exp(-(np.pi**2)*(1/2+k)**2 * t)&lt;br /&gt;
    return sum&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Z = u(X, T, N)  # Calcular los valores de la función para cada par (x, t)&lt;br /&gt;
&lt;br /&gt;
# Graficar la función en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
surf=ax.plot_surface(X, T, Z,cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
ax.set_xlabel('Posición x [m]')&lt;br /&gt;
ax.set_ylabel('Tiempo t [s]')&lt;br /&gt;
ax.set_zlabel('Temperatura u(x,t) [ºC]')&lt;br /&gt;
ax.set_title('Evolución de la Temperatura en la Varilla')&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=5)  #Añado una guía de colores&lt;br /&gt;
surf.set_clim(0, 1)                       # Le introduzco cota inf/sup a los colores&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gracias a los desarrollos en serie de Fourier, podemos calcular los coeficientes \( c_k \) para cumplir así la condición inicial. Dichos coeficientes se calculan mediante la integral:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
c_k := \frac{\int_{0}^{1} \max\{0, 1 - 4(x - 1/2)\} \sin(\pi(1/2+k)x) \, dx}{\int_{0}^{1} \sin^2(\pi(1/2+k)x) \, dx}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Dado que la integral es difícil de calcular analíticamente y en consecuencia es difícil obtener una expresión dependiente del parámetro &amp;lt;math&amp;gt; k&amp;lt;/math&amp;gt;, la resolveremos de forma numérica mediante el método del trapecio, de forma análoga a como se hizo en el modelo sin aislante térmico previo.&lt;br /&gt;
Para una comprensión más completa de la evolución de la temperatura del alambre en cuestión, es importante realizar un análisis visual de la solución propuesta. La representación gráfica de la solución en el intervalo de tiempo \( t \in [0, 1] \), considerando los primeros 10 términos de la serie de Fourier, ofrece una visualización tridimensional de la distribución del calor a lo largo del alambre en función del tiempo.&lt;br /&gt;
 &lt;br /&gt;
Es relevante destacar que a medida que transcurre el tiempo, la solución converge gradualmente hacia su estado estacionario, es decir, \(  v(x)=0 \) . Además, observamos que se verifica el principio del máximo, dado que tanto la temperatura máxima y mínima se alcanza en la frontera parabólica.&lt;br /&gt;
Esta última afirmación la podemos verificar de forma sencilla, obteniendo ambos valores de la función. El código utilizado mostró los siguientes datos.&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# Calcular la temperatura máxima y mínima&lt;br /&gt;
max_temperature = np.max(Z)&lt;br /&gt;
min_temperature = np.min(Z)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Temperatura máxima:&amp;quot;, max_temperature)&lt;br /&gt;
print(&amp;quot;Temperatura mínima:&amp;quot;, min_temperature)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Encontrar las coordenadas donde se alcanza la temperatura máxima y mínima&lt;br /&gt;
max_index = np.unravel_index(np.argmax(Z), Z.shape)&lt;br /&gt;
min_index = np.unravel_index(np.argmin(Z), Z.shape)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
max_x, max_t = x_values[max_index[1]], t_values[max_index[0]]&lt;br /&gt;
min_x, min_t = x_values[min_index[1]], t_values[min_index[0]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Coordenadas de la temperatura máxima: (x={}, t={})&amp;quot;.format(max_x, max_t))&lt;br /&gt;
print(&amp;quot;Coordenadas de la temperatura mínima: (x={}, t={})&amp;quot;.format(min_x, min_t))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Resultados de temperatura máxima y mínima&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parámetro!! Valor&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura máxima|| \(0.92 ^\circ \text{C}\)&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura mínima|| \(-0.03 ^\circ \text{C}\)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Coordenadas de temperatura máxima y mínima&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Coordenadas !! Valor&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura máxima|| \((x=0.50, t=0.00)\)&lt;br /&gt;
|-&lt;br /&gt;
| Temperatura mínima|| \((x=0.81, t=0.00)\)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Observamos que el máximo debería ser de &amp;lt;math&amp;gt; 1^\circ \text{C} &amp;lt;/math&amp;gt;. No obstante, el resultado reportado por el código es &amp;lt;math&amp;gt; 0.92 ^\circ \text{C} &amp;lt;/math&amp;gt;. Esto se debe al uso de la aproximación por series de Fourier. Lo mismo ocurre con el valor mínimo que debería se de &amp;lt;math&amp;gt; 0^\circ \text{C} &amp;lt;/math&amp;gt;, no obstante el código reporta &amp;lt;math&amp;gt;-0.03^\circ \text{C} &amp;lt;/math&amp;gt;. Además dichos puntos están en la frontera parabólica, como afirma el principio del máximo. &lt;br /&gt;
&lt;br /&gt;
En este punto es interesante verificar si nuestro modelo es correcto. En tal caso, el extremo izquierdo de la barra no debería perder calor. Por lo tanto, calculamos la derivada de nuestra expresión y, gracias a la Ley de Fick, sabemos que el flujo de calor es igual a la derivada cambiada de signo. Obtenemos los siguientes resultados:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Flujo_Pablo.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
# Parámetros&lt;br /&gt;
L = 1       # Longitud de la varilla&lt;br /&gt;
T = 1       # Tiempo final&lt;br /&gt;
N = 100     # Número de términos en la serie&lt;br /&gt;
# Espacios&lt;br /&gt;
x_values = np.linspace(0, L, 1000) # Puntos en la dirección x&lt;br /&gt;
t_values = np.linspace(0, T, 1000) # Puntos en la dirección t&lt;br /&gt;
&lt;br /&gt;
def f(x):   # Defino mi función condición inicial&lt;br /&gt;
    return np.maximum(0, 1 - 4 * np.abs(x - 1/2))&lt;br /&gt;
&lt;br /&gt;
def fourier_coefficient(f, k, x):   # Coeficientes, recuperado del anterior trabajo&lt;br /&gt;
    ck = 2* np.trapz(f(x) * np.sin(np.pi*(1/2+k)*x) ,x)&lt;br /&gt;
    return ck&lt;br /&gt;
&lt;br /&gt;
def derivative_solution_x(x, t, N): # Definir la derivada de la solución respecto a x&lt;br /&gt;
    result = 0&lt;br /&gt;
    for k in range(0, N+1):&lt;br /&gt;
        ck = fourier_coefficient(f, k, x_values)&lt;br /&gt;
        result += ck * np.pi * (1/2 + k) * np.cos(np.pi * (1/2 + k) * x) * np.exp(-1 * (np.pi**2) * (1/2 + k)**2 * t)&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
# Calcular la derivada de la solución respecto a x para los extremos x=0 y x=1 a lo largo del tiempo&lt;br /&gt;
flux_x0 = [-derivative_solution_x(0, t, N) for t in t_values]&lt;br /&gt;
flux_x1 = [-derivative_solution_x(1, t, N) for t in t_values]&lt;br /&gt;
&lt;br /&gt;
# Graficar el flujo en los extremos x=0 y x=1 a lo largo del tiempo&lt;br /&gt;
plt.figure(figsize=(8, 5))&lt;br /&gt;
plt.plot(t_values, flux_x0, label='Flujo en x=0', color='blue')  # Cálculo del flujo en x=0&lt;br /&gt;
plt.plot(t_values, flux_x1, label='Flujo en x=1', color='red')   # Cálculo del flujo en x=1&lt;br /&gt;
plt.xlabel('Tiempo [s]')&lt;br /&gt;
plt.ylabel(r'Flujo de Calor [$\frac{^\circ C}{m^2 \cdot s}$]')&lt;br /&gt;
plt.title('Flujo de Calor en los Extremos de la Varilla ')&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Observamos que todo el calor aportado en el instante inicial se disipa completamente por la izquierda de la varilla, ya que el flujo en &amp;lt;math&amp;gt; x=1&amp;lt;/math&amp;gt; es nulo, verificando así las condiciones fronteras de nuestro problema.&lt;br /&gt;
&lt;br /&gt;
==Solución fundamental==&lt;br /&gt;
La solución fundamental de la ecuación del calor es una función que describe la distribución de temperatura en un medio en función del tiempo y la posición. Para la ecuación del calor unidimensional, la solución fundamental está dada por la fórmula:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\phi(x, t) = \frac{1}{2 \sqrt{\pi t}} \exp\left(-\frac{x^2}{t}\right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
La solución fundamental describe cómo el calor se propaga y difunde a lo largo del medio a medida que pasa el tiempo, en este caso, por ejemplo, el calor en un alambre. Además la solución general del problema de Cauchy es la solución fundamental de la ecuación del calor.&lt;br /&gt;
El problema de Cauchy es el siguiente:&lt;br /&gt;
Dada la ecuación diferencial parcial:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u_t = k \cdot u_{xx},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
junto con las siguientes condiciones iniciales:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, 0) = f(x)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
donde \( f(x) \) es una función dada en el dominio \( 0 \leq x \leq L \) y \( k \) es una constante positiva que representa la difusividad térmica del medio.&lt;br /&gt;
Para resolver el problema de Cauchy para la ecuación del calor es mediante el uso de la solución fundamental y la técnica de convolución. La solución fundamental \( \phi(x, t) \) de la ecuación del calor es una función especial que satisface la ecuación diferencial parcial y las condiciones iniciales dadas.&lt;br /&gt;
 &lt;br /&gt;
Para resolver el problema de Cauchy, podemos utilizar la solución fundamental \( \phi(x, t) \) en combinación con la función inicial \( u_0(x) \) para obtener la solución general \( u(x, t) \) en cualquier instante de tiempo \( t \). Esto se logra convolucionando la función inicial \( f(x) \) con la solución fundamental \( \phi(x, t) \) .&lt;br /&gt;
La solución \( u(x, t) \) del problema de Cauchy se puede expresar como:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
u(x, t) = \int_{-\infty}^{\infty} \phi(x - y, t) f(y) \, dy&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
En primer lugar, procederemos a visualizar una representación tridimensional de la solución fundamental  \( \phi(x, t) \).&lt;br /&gt;
[[Archivo:Solfundi.png|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Definir la función que representa la solución fundamental de la ecuación del calor&lt;br /&gt;
def phi(x, t):&lt;br /&gt;
    return 1 / (2 * np.sqrt(np.pi * t)) * np.exp(-x**2 / t)&lt;br /&gt;
&lt;br /&gt;
# Definir los valores de x y t para la gráfica&lt;br /&gt;
x_values = np.linspace(-1, 1, 100)    # Valores de x&lt;br /&gt;
t_values = np.linspace(0.01, 1, 200)  # Valores de t (tiempo)&lt;br /&gt;
&lt;br /&gt;
# Crear una malla de valores de x y t&lt;br /&gt;
X, T = np.meshgrid(x_values, t_values)&lt;br /&gt;
&lt;br /&gt;
# Calcular la solución fundamental para cada par de valores (x, t)&lt;br /&gt;
Z = phi(X, T)&lt;br /&gt;
&lt;br /&gt;
# Crear una figura en 3D&lt;br /&gt;
fig = plt.figure(figsize=(12, 8))&lt;br /&gt;
ax = fig.add_subplot(111, projection='3d')&lt;br /&gt;
&lt;br /&gt;
# Graficar la superficie 3D&lt;br /&gt;
surf = ax.plot_surface(X, T, Z, cmap='viridis')&lt;br /&gt;
&lt;br /&gt;
# Etiquetas y título con el símbolo de &amp;quot;phi&amp;quot;&lt;br /&gt;
ax.set_xlabel(r'$x$')&lt;br /&gt;
ax.set_ylabel(r'$t$')&lt;br /&gt;
ax.set_zlabel(r'$\phi(x, t)$')&lt;br /&gt;
ax.set_title(r'Solución fundamental de la ecuación del calor: $\phi(x, t)$')&lt;br /&gt;
&lt;br /&gt;
# Añadir una barra de colores para indicar los valores de Z&lt;br /&gt;
fig.colorbar(surf, shrink=0.5, aspect=8)&lt;br /&gt;
plt.show()    # Mostrar la gráfica&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
En esta ocasión veremos la solución de la ecuación del calor \( u_t - u_{xx} = 0 \) en \( x \in \mathbb{R} \) asociada al dato inicial \( f(x) = 1_{[-1,1]} \), viene dada por la convolución:&lt;br /&gt;
 &lt;br /&gt;
:&amp;lt;math&amp;gt; u(x, t) = \int_{-\infty}^{\infty} \phi(x - y, t) f(y) \, dy = \int_{-\infty}^{\infty} \frac{1}{2 \sqrt{\pi t}} \exp\left(-\frac{(x-y)^2}{t}\right) 1_{[-1,1]} \, dy &amp;lt;/math&amp;gt;&lt;br /&gt;
Dibujaremos la solución en diferentes instantes de tiempo: \( t = 0.001 \), \( t = 0.01 \) , \( t = 0.1 \), \( t = 1 \).  Aproximaremos la integral indefinida utilizando la fórmula del trapecio.&lt;br /&gt;
[[Archivo:gifgif.gif|400px|thumb|right|]]&lt;br /&gt;
&amp;lt;syntaxhighlight Lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# Importar las bibliotecas necesarias&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from mpl_toolkits.mplot3d import Axes3D&lt;br /&gt;
&lt;br /&gt;
# Definir la solución fundamental en 2D&lt;br /&gt;
def phi_2D(x1, x2, t):&lt;br /&gt;
    if t == 0:&lt;br /&gt;
        return np.zeros_like(x1)  # Devuelve una matriz de ceros si t es cero&lt;br /&gt;
    else:&lt;br /&gt;
        return 1 / (4 * np.pi * t) * np.exp(-(x1**2 + x2**2) / (4 * t))&lt;br /&gt;
&lt;br /&gt;
# Definir el intervalo espacial&lt;br /&gt;
x1_values = np.linspace(-1, 1, 100)  # Valores de x1&lt;br /&gt;
x2_values = np.linspace(-1, 1, 100)  # Valores de x2&lt;br /&gt;
x1, x2 = np.meshgrid(x1_values, x2_values)  # Malla de valores de x1 y x2&lt;br /&gt;
&lt;br /&gt;
# Definir los tiempos&lt;br /&gt;
t_values = np.linspace(0, 0.1, 3)  # Valores de tiempo&lt;br /&gt;
&lt;br /&gt;
# Tamaño de la figura&lt;br /&gt;
fig = plt.figure(figsize=(10, 6))&lt;br /&gt;
&lt;br /&gt;
# Graficar la solución fundamental en 2D para cada tiempo&lt;br /&gt;
for i, t in enumerate(t_values, 1):&lt;br /&gt;
    ax = fig.add_subplot(1, len(t_values), i, projection='3d')&lt;br /&gt;
    phi = phi_2D(x1, x2, t)&lt;br /&gt;
    ax.plot_surface(x1, x2, phi, cmap='viridis')&lt;br /&gt;
    ax.set_title(f'Tiempo $t=${round(t, 3)}')&lt;br /&gt;
    ax.set_xlabel('x1')&lt;br /&gt;
    ax.set_ylabel('x2')&lt;br /&gt;
    ax.set_zlabel('phi(x1, x2, t)')&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Solución fundamental dimensión 2==&lt;br /&gt;
&lt;br /&gt;
Veamos el problema de Cauchy para la ecuación del calor en dos dimensiones (\( x_1, x_2 \) y \( t \)). Sea \( u(x_1, x_2, t) \) la función de temperatura en un medio bidimensional, que satisface la ecuación del calor:&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
u_t = k(u_{x_1 x_1} + u_{x_2 x_2})&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Con las condiciones iniciales dadas por la temperatura inicial \( u(x_1, x_2, 0) = f(x_1, x_2) \) para algún campo de temperatura dado \( f(x_1, x_2)  \text{para} (x_1, x_2) \in \partial \Omega \), donde \( \Omega \) es el dominio bidimensional sobre el cual se define la temperatura.&lt;br /&gt;
La solución general a este problema (sin contar la condición inicial) viene dada por la siguiente expresión: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\phi(x_1, x_2, t) = \frac{1}{4 \pi t} \exp\left( -\frac{x_1^2 + x_2^2}{4t} \right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Procederemos ahora a representar la solución fundamental, donde veremos un gráfico tridimensional, &amp;lt;math&amp;gt; x_1, x_2, \phi(x_1, x_2, t) &amp;lt;/math&amp;gt; donde se ha fijado un tiempo t.&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	<entry>
		<id>https://mat.caminos.upm.es/w/index.php?title=Archivo:Giffin.gif&amp;diff=70109</id>
		<title>Archivo:Giffin.gif</title>
		<link rel="alternate" type="text/html" href="https://mat.caminos.upm.es/w/index.php?title=Archivo:Giffin.gif&amp;diff=70109"/>
				<updated>2024-03-07T18:53:40Z</updated>
		
		<summary type="html">&lt;p&gt;Celia L.Rojo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Celia L.Rojo</name></author>	</entry>

	</feed>