Diferencia entre revisiones de «Ecuación del calor (ADMR)»
(→Coeficiente de difusión) |
(→Análisis de los errores) |
||
| (No se muestran 43 ediciones intermedias de 4 usuarios) | |||
| Línea 7: | Línea 7: | ||
=Introducción= | =Introducción= | ||
| − | El desarrollo de la ecuación del calor se atribuye principalmente al matemático y físico francés Joseph Fourier, quien en 1822 publicó su obra ''Théorie analytique de la chaleur''. En este trabajo formuló una ecuación diferencial en derivadas parciales que describe la propagación del calor por difusión en un medio continuo | + | El desarrollo de la ecuación del calor se atribuye principalmente al matemático y físico francés Joseph Fourier, quien en 1822 publicó su obra ''Théorie analytique de la chaleur''. En este trabajo formuló una ecuación diferencial en derivadas parciales que describe la propagación del calor por difusión en un medio continuo. En esta ocasión, profundicemos en dos aspectos de este modelo. |
| − | Desde un punto de vista físico, estas ecuaciones permiten la modelización de fenómenos como el calentamiento de materiales o la difusión de solutos en fluidos estacionarios | + | Desde un punto de vista físico, estas ecuaciones permiten la modelización de fenómenos como el calentamiento de materiales o la difusión de solutos en fluidos estacionarios. Sin embargo, la influencia de la física es más profunda: de hecho, el coeficiente de difusión lleva su nombre por la interpretación física de su acción en el sistema. ¿Cuál es este efecto, y por qué se lo denota de esta forma? |
| − | + | Planteemos también el paso entre problemas de dominio acotado y los de no acotado. ¿Podemos aproximar las soluciones del sistema no acotado mediante las del acotado? Y de ser así, ¿qué condiciones de frontera en una dimensión funcionan mejor? | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
=Solución acotada vs Solución no acotada= | =Solución acotada vs Solución no acotada= | ||
| − | Demos por conocidos el uso de separación de variables para resolver problemas de autofunciones en caso acotado y el manejo de la solución fundamental junto con la convolución para el sistema no acotado. Para comparar todas las soluciones correspondientes, consideremos sistema <math> 1-</math>dimensional, con una gaussiana <math> e^{-x^2} </math> como condición inicial. | + | Demos por conocidos el uso de separación de variables para resolver problemas de autofunciones en caso acotado y el manejo de la solución fundamental junto con la convolución para el sistema no acotado. Para comparar todas las soluciones correspondientes, consideremos sistema <math> 1-</math>dimensional, con una gaussiana <math> e^{-x^2} </math> como condición inicial. Justificamos físicamente como el uso de un láser para calentar un punto de una tira fina de metal. Considerando que los fotones puedan desviarse como una distribución normal por el teorema central del límite, es un montaje experimental factible y regular. ¿Y qué condiciones de frontera? |
Si consideramos de Dirichlet, a una tira de longitud <math> 2a </math> le colocaremos en los extremos un material que se mantenga siempre a la misma temperatura, pongamos que a una temperatura nula. El sistema resulta | Si consideramos de Dirichlet, a una tira de longitud <math> 2a </math> le colocaremos en los extremos un material que se mantenga siempre a la misma temperatura, pongamos que a una temperatura nula. El sistema resulta | ||
| Línea 31: | Línea 21: | ||
<math>\quad | <math>\quad | ||
\begin{align} | \begin{align} | ||
| − | \begin{cases} u_{t} - u_{xx} = 0 \quad &\forall t > 0, x\in [-a,a]\\ | + | \begin{cases} u_{t} - u_{xx} = 0 \quad &\forall t > 0, x\in [-a,a],\\ |
| − | u(-a,t) = u(a,t) = 0 \quad &\forall t > 0 \\ | + | u(-a,t) = u(a,t) = 0 \quad &\forall t > 0, \\ |
| − | u(x,0) = e^{-x^2} \quad &\forall x\in [-a,a] | + | u(x,0) = e^{-x^2} \quad &\forall x\in [-a,a]. |
\end{cases} | \end{cases} | ||
\end{align} | \end{align} | ||
</math> | </math> | ||
| + | |||
La solución al resolver el problema de autofunciones viene dada por | La solución al resolver el problema de autofunciones viene dada por | ||
| + | |||
<math>\quad | <math>\quad | ||
| − | + | u(x,t) = \sum_{n=1}^\infty A_{n} \cos\left(\frac{\pi}{a}(n - \frac{1}{2}) x\right) e^{-\dfrac{\pi^2}{a^2}\left(n - \frac{1}{2}\right)^2 t}, | |
| − | u(x,t) = \sum_{n=1}^\infty A_{n} \cos\left(\frac{\pi}{a}(n - \frac{1}{2}) x\right) e^{-\dfrac{\pi^2}{a^2}\left(n - \frac{1}{2}\right)^2 t} | + | \quad \text{ donde } \quad |
| − | \quad \text{ donde } | + | |
A_n = \frac{\int_{-a}^{a} u(x,0) \cos\left(\frac{\pi}{a}(n - \frac{1}{2}) x\right)dx}{\int_{-a}^{a} \cos^2\left(\frac{\pi}{a}(n - \frac{1}{2}) x\right)dx}. | A_n = \frac{\int_{-a}^{a} u(x,0) \cos\left(\frac{\pi}{a}(n - \frac{1}{2}) x\right)dx}{\int_{-a}^{a} \cos^2\left(\frac{\pi}{a}(n - \frac{1}{2}) x\right)dx}. | ||
| − | |||
</math> | </math> | ||
| Línea 54: | Línea 44: | ||
<math>\quad | <math>\quad | ||
\begin{align} | \begin{align} | ||
| − | \begin{cases} u_{t} - u_{xx} = 0 \quad &\forall t > 0 , x\in [-b,b]\\ | + | \begin{cases} u_{t} - u_{xx} = 0 \quad &\forall t > 0 , x\in [-b,b],\\ |
| − | u_x(-b,t) = u_x(b,t) = 0 \quad &\forall t > 0 \\ | + | u_x(-b,t) = u_x(b,t) = 0 \quad &\forall t > 0, \\ |
| − | u(x,0) = e^{-x^2} | + | u(x,0) = e^{-x^2} \quad &\forall x\in[-b,b]. |
\end{cases} | \end{cases} | ||
\end{align} | \end{align} | ||
| Línea 66: | Línea 56: | ||
<math>\quad | <math>\quad | ||
| − | + | u(x,t) = \sum_{m=0}^\infty B_{m} cos\left(\frac{m\pi}{b} x\right) e^{-\dfrac{m^2\pi^2}{b^2} t},\quad \text{ donde } \quad | |
| − | u(x,t) = \sum_{m=0}^\infty B_{m} cos\left(\frac{m\pi}{b} x\right) e^{-\dfrac{m^2\pi^2}{b^2} t}\quad \text{ donde } | + | |
B_m = \frac{\int_{-b}^{b} u(x,0) \cos\left(\frac{m\pi}{b} x\right)dx}{\int_{-b}^{b} \cos^2\left(\frac{m\pi}{b}x\right)dx}. | B_m = \frac{\int_{-b}^{b} u(x,0) \cos\left(\frac{m\pi}{b} x\right)dx}{\int_{-b}^{b} \cos^2\left(\frac{m\pi}{b}x\right)dx}. | ||
| − | |||
</math> | </math> | ||
| − | Un último detalle antes de proceder a los errores es la obtención simbólica de la solución no acotada | + | |
| + | Un último detalle antes de proceder a los errores es la obtención simbólica de la solución no acotada. | ||
| + | |||
<math>\quad | <math>\quad | ||
\begin{align} | \begin{align} | ||
| − | \begin{cases} u_{t} - u_{xx} = 0 \quad &\forall t>0, x\in \mathbb{R}\\ | + | \begin{cases} u_{t} - u_{xx} = 0 \quad &\forall t>0, x\in \mathbb{R},\\ |
| − | u(x,0) = e^{-x^2} \quad &\forall x\in \mathbb{R} | + | u(x,0) = e^{-x^2} \quad &\forall x\in \mathbb{R} |
\end{cases} | \end{cases} | ||
\end{align} | \end{align} | ||
| + | \quad | ||
\Longrightarrow | \Longrightarrow | ||
| − | u(x,t) = \frac{1}{\sqrt{4\pi t}}e^{\frac{-x^2}{4t}} * e^{-x^2} = \frac{e^{\frac{-x^2}{4t+1}}}{\sqrt{4t+1}} | + | \quad |
| + | u(x,t) = \frac{1}{\sqrt{4\pi t}}e^{\frac{-x^2}{4t}} * e^{-x^2} = \frac{e^{\frac{-x^2}{4t+1}}}{\sqrt{4t+1}}. | ||
</math> | </math> | ||
| − | + | ||
| + | Queremos comprobar cuán bien aproximan las soluciones del caso acotado Dirichlet y Neumann a la obtenida por la solución fundamental. Para ello, escojamos un tiempo máximo <math>t_{max} </math> hasta el cuál tomaremos el error en norma <math> L^{\infty} </math>. Queremos estudiar: | ||
* El efecto de aumentar el rango de definición con <math> a,b </math>. | * El efecto de aumentar el rango de definición con <math> a,b </math>. | ||
* El efecto de aumentar el número de términos en las series de los sistemas acotados. | * El efecto de aumentar el número de términos en las series de los sistemas acotados. | ||
| − | |||
| − | = | + | === Análisis de los errores === |
| + | [[Archivo:GrupoADMR Calor Errores1.jpg|750px|thumb|right| Representación gráfica de las soluciones del problema acotado (<math>a = b = 20</math>) y no acotado truncando las series de Fourier en su término <math>100</math>, para un tiempo máximo de <math>1</math>; y de sus errores. Nótese el orden de magnitud de los errores -pequeño-, los picos generados por los errores numéricos dados por la fórmula del trapecio y la suavidad en la frontera dada por las condiciones en esta.]] | ||
| − | + | Consideramos los parámetros, donde <math> n </math> es el término de la serie de Fourier donde truncamos: | |
| − | + | *<math> a = b = 20, </math> | |
| + | *<math> t_{max} = 1, </math> | ||
| + | *<math> n = 100. </math> | ||
| − | + | Con <math> t_{max} </math> fijo podemos observar que al aumentar <math>a, b</math> y <math>n</math> el error entre las soluciones acotadas y no acotada disminuye. Nótese que se estanca a partir de cierto <math>n</math>. De hecho, el error llega a aumentar a partir de ciertos <math> a,b </math> si truncamos demasiado pronto o demasiado tarde por la aproximación del trapecio para particiones del espacio demasiado bastas -no observado por pericia en código final-. | |
| − | + | {|style="margin: 0 auto;" | |
| + | | [[Archivo:GrupoADMR Calor Errores MaxD.jpeg|550px|thumb|upright|Con <math>t_{max}=1</math>, vamos obteniendo errores máximos en escala logarítmica con diferentes longitudes y truncamientos entre la solución del problema no acotado y el acotado Dirichlet. Los errores son bastante pequeños si se toman suficientes términos de la serie y una discretización espacial adecuada (en otro caso, aunque no esté representado en esta versión final, los errores divergen).]] | ||
| + | | [[Archivo:GrupoADMR Calor Errores MaxNe.jpeg|550px|thumb|upright|Análogo a la figura adyacente. Nótese que ambas son buenas aproximaciones con suficiente longitud y términos de la serie.]] | ||
| + | |} | ||
| − | [ | + | Al ampliar el tiempo con la <math>n</math> y fijada <math>a=b=15</math>, al hacer más grande <math>t_{max}</math> los errores máximos no aumentan. En cambio, si tomamos el máximo error para diferentes tiempos vemos con suficiente precisión que no hay diferencia pero que para truncamientos precoces Neumann tiene ligeramente menor error. |
| + | |||
| + | {|style="margin: 0 auto;" | ||
| + | | [[Archivo:GrupoADMR Calor Errores9.jpg|550px|thumb|upright|Con dominio fijo, el error en escala logarítmica entre solución no acotada y sistema Dirichlet decae incluso con el paso del tiempo. Esto encaja con que el estado estacionario de Dirichlet será la constante de temperatura nula, al igual que la convolución con la solución fundamental.]] | ||
| + | | [[Archivo:GrupoADMR Calor Errores NoNe.jpeg|550px|thumb|upright|Con condiciones análogas en frontera Neumann, el resultado es igualmente excelente para aproximar el caso no acotado. Aunque en el caso Neumann la solución estacionaria no sea nula, sino un reparto equitativo del calor inicial, cuando el rango es suficientemente amplio, la aproximación será adecuada.]] | ||
| + | |} | ||
| + | |||
| + | {|style="margin: 0 auto;" | ||
| + | | [[Archivo:GrupoADMR Calor Errores DNe.jpeg|550px|thumb|upright|Podemos ver además que ambos sistemas se asemejan cada vez más, por lo que ambas aproximaciones son igualmente útiles para el caso no acotado.]] | ||
| + | |} | ||
| + | |||
| + | =Coeficiente de difusión= | ||
| + | |||
| + | [[Archivo:Fundamental.gif|500px|thumb|right|Solución fundamental de la ecuación del calor unidimensional para distintos valores del coeficiente de difusión. La representación gráfica parte del tiempo inicial <math/> 0.01, <math/> esperando una delta de Dirac en el instante inicial. Nótese que en este tiempo, a mayor coeficiente de difusión más se ha difundido el calor en el sistema, lo que se nota especialmente en el valor máximo observado y su disminución cuanto más crece el coeficiente.]] | ||
| + | |||
| + | Interpretemos el valor de <math/> D <math/> aprovechando el montaje físico anterior. Numéricamente vemos que cuanto mayor es este coeficiente más rápido se difunde el calor, evidenciado en la caída de la solución en tiempos cada vez más cortos. | ||
| + | |||
| + | [[Archivo:Convoluciones_teorica.gif|500px|thumb|right|Soluciones de la ecuación del calor unidimensional para distintos valores del coeficiente de difusión.]] | ||
| − | + | Tanto las soluciones del caso unidimensional no acotado como las del acotado -que pueden reformularse considerando <math/> D <math/> en su exponencial, o aproximando por la sección anterior- podemos ver que un mayor coeficiente <math/> D <math/> acelera el decaimiento de la exponencial por lo que tendrá un efecto similar, justificándose su nombre. | |
= Códigos = | = Códigos = | ||
<source lang="matlab"> | <source lang="matlab"> | ||
| − | %%% Código generado junto con Chat GPT para la representación de la solución fundamental de la ecuación del calor unidimensional para distintos valores del coeficiente de difusión | + | %%% Código generado junto con Chat GPT para la representación de la solución fundamental de la ecuación del calor unidimensional para distintos valores del coeficiente de difusión |
clc | clc | ||
| Línea 164: | Línea 179: | ||
end | end | ||
</source> | </source> | ||
| − | |||
| − | |||
<source lang="matlab"> | <source lang="matlab"> | ||
| − | %%% Código generado junto con Chat GPT para la representación de la soluciones de la ecuación del calor unidimensional para distintos valores del coeficiente de difusión | + | %%% Código generado junto con Chat GPT para la representación de la soluciones de la ecuación del calor unidimensional para distintos valores del coeficiente de difusión |
clc | clc | ||
| Línea 241: | Línea 254: | ||
end | end | ||
| + | </source> | ||
| + | |||
| + | <source lang="matlab"> | ||
| + | %%% Código generado junto con Chat GPT para la representación de los errores entre las soluciones | ||
| + | |||
| + | function [Diff12,Difft1,Difft2] = errores2(n_max, a, b,t_max) | ||
| + | |||
| + | % Función como condición inicial: una función Gaussiana | ||
| + | gaus = @(x) (exp(-x.^2)); | ||
| + | u0 = @(x) exp(-x.^2); | ||
| + | D = 1; % Coeficiente de difusión | ||
| + | |||
| + | % Funciones fundamentales y convolución para el modelo de difusión | ||
| + | phi_D = @(x, t) exp(-x.^2./(4*D*t))./sqrt(4*D*pi*t); | ||
| + | convo = @(x,t) (exp(-x.^2./(4*D.*t+1))/sqrt(4*D.*t+1)); | ||
| + | |||
| + | % Definición de la malla (espacio y tiempo) | ||
| + | xx = -a:0.01:a; | ||
| + | tt = 10^(-2):0.01:t_max; | ||
| + | [X, T] = meshgrid(xx, tt); | ||
| + | |||
| + | % Inicialización de la matriz de convolución | ||
| + | conv = zeros(length(xx), length(tt)); | ||
| + | |||
| + | % Cálculo de la convolución | ||
| + | for j = 1:length(tt) | ||
| + | auxt = tt(j); | ||
| + | for i = 1:length(xx) | ||
| + | auxx = xx(i); | ||
| + | val_conv(j,i) = convo(auxx, auxt); | ||
| + | end | ||
| + | end | ||
| + | |||
| + | % Inicialización de la matriz de resultados para la solución Dirichlet | ||
| + | res_dir = zeros(length(xx), length(tt)); | ||
| + | |||
| + | % Cálculo de la solución directa | ||
| + | for n=1:n_max | ||
| + | A(n) = trapz(xx, u0(xx) .* cos((pi/a)*(n - 1/2) * xx)) /... | ||
| + | trapz(xx, cos((pi/a)*(n - 1/2) * xx).^2); | ||
| + | end | ||
| + | |||
| + | % Evaluación de la solución directa en el dominio espacio-temporal | ||
| + | for j = 1:length(tt) | ||
| + | auxt = tt(j); | ||
| + | for i = 1:length(xx) | ||
| + | auxx = xx(i); | ||
| + | u = 0; | ||
| + | |||
| + | % Sumar los términos de la serie de Fourier | ||
| + | for n=1:n_max | ||
| + | u = u + A(n) .* cos((pi/a)*(n - 1/2) * auxx) .*... | ||
| + | exp(-((pi^2 / a^2) * (n - 1/2)^2) .* auxt); | ||
| + | end | ||
| + | res_dir(i,j) = u; | ||
| + | end | ||
| + | end | ||
| + | |||
| + | % Inicialización de la matriz de resultados para la solución en frontera Neumann | ||
| + | res_neu = zeros(length(xx), length(tt)); | ||
| + | |||
| + | % Cálculo de la solución en frontera Neumann | ||
| + | for n=1:n_max | ||
| + | B(n) = trapz(xx, u0(xx) .* cos((n*pi/b) * xx)) /... | ||
| + | trapz(xx, cos((n*pi/b) * xx).^2); | ||
| + | end | ||
| + | |||
| + | % Evaluación de la solución en frontera Neumann en el dominio espacio-temporal | ||
| + | for j = 1:length(tt) | ||
| + | auxt = tt(j); | ||
| + | for i = 1:length(xx) | ||
| + | auxx = xx(i); | ||
| + | u = trapz(xx, u0(xx))./(2.*b); | ||
| + | |||
| + | % Sumar los términos de la serie de Fourier | ||
| + | for n=1:n_max | ||
| + | u = u + B(n) .* cos((n*pi/b) * auxx) .* exp(-((n^2 * pi^2 / b^2)) .* auxt); | ||
| + | end | ||
| + | res_neu(i,j) = u; | ||
| + | end | ||
| + | end | ||
| + | |||
| + | % Transponer los resultados para compararlos con la convolución | ||
| + | U1 = res_dir.'; | ||
| + | U2 = res_neu.'; | ||
| + | |||
| + | % Calcular las diferencias entre las soluciones y la convolución | ||
| + | Diff12 = abs(U1 - U2); | ||
| + | Difft1 = abs(val_conv - U1); | ||
| + | Difft2 = abs(val_conv - U2); | ||
| + | |||
| + | end | ||
| + | </source> | ||
| + | |||
| + | <source lang="matlab"> | ||
| + | %%% Código generado junto con Chat GPT para la representación de las soluciones de la ecuación del calor unidimensional junto con la comparación de sus errores | ||
| + | |||
| + | clc | ||
| + | clear all | ||
| + | close all | ||
| + | |||
| + | % Función como condicion inicial | ||
| + | % Se define la función inicial gausiana y la función u0 que se utilizarán más adelante para los cálculos. | ||
| + | gaus = @(x) (exp(-x.^2)); | ||
| + | u0 = @(x) exp(-x.^2); | ||
| + | D = 1; | ||
| + | |||
| + | % Funciones fundamentales y convolución | ||
| + | % Se definen las funciones que describen la solución fundamental de la ecuación y la convolución utilizada. | ||
| + | phi_D = @(x, t) exp(-x.^2./(4*D*t))./sqrt(4*D*pi*t); | ||
| + | convo = @(x,t) (exp(-x.^2./(4*D.*t+1))/sqrt(4*D.*t+1)); | ||
| + | |||
| + | % Definición de la malla | ||
| + | % Se definen los parámetros de la malla para las variables espaciales (xx) y temporales (tt), y se crea la malla 2D. | ||
| + | a = 100; | ||
| + | b = 100; | ||
| + | tmax = 1; | ||
| + | n_max = 1000; | ||
| + | |||
| + | xx = linspace(-a, a, 1000); | ||
| + | tt = linspace(10^(-2), tmax, 1000); | ||
| + | [X, T] = meshgrid(xx, tt); | ||
| + | |||
| + | % Inicialización de la matriz de convolución | ||
| + | % Se crea una matriz vacía para almacenar los valores de la convolución. | ||
| + | conv = zeros(length(xx), length(tt)); | ||
| + | |||
| + | % Cálculo de la convolución | ||
| + | % Se calcula la convolución para cada punto en la malla de la variable temporal tt y espacial xx. | ||
| + | for j = 1:length(tt) | ||
| + | auxt = tt(j); | ||
| + | for i = 1:length(xx) | ||
| + | auxx = xx(i); | ||
| + | val_conv(i,j) = convo(auxx, auxt); | ||
| + | end | ||
| + | end | ||
| + | |||
| + | % Resolución de la ecuación con condiciones de frontera Dirichlet | ||
| + | % Se calculan los coeficientes A para la expansión en series de Fourier y se calcula la solución directa en cada paso temporal. | ||
| + | res_dir = zeros(length(xx), length(tt)); | ||
| + | |||
| + | for n=1:n_max | ||
| + | A(n) = trapz(xx, u0(xx) .* cos((pi/a)*(n - 1/2) * xx)) /... | ||
| + | trapz(xx, cos((pi/a)*(n - 1/2) * xx).^2); | ||
| + | end | ||
| + | |||
| + | for j = 1:length(tt) | ||
| + | auxt = tt(j); | ||
| + | |||
| + | for i = 1:length(xx) | ||
| + | auxx = xx(i); | ||
| + | u = 0; | ||
| + | |||
| + | for n=1:n_max | ||
| + | u = u + A(n) .* cos((pi/a)*(n - 1/2) * auxx) .*... | ||
| + | exp(-((pi^2 / a^2) * (n - 1/2)^2) .* auxt); | ||
| + | |||
| + | end | ||
| + | res_dir(j,i) = u; | ||
| + | end | ||
| + | end | ||
| + | |||
| + | % Resolución de la ecuación con condiciones de frontera Neumann | ||
| + | % Se calculan los coeficientes B para la expansión en series de Fourier con las condiciones de frontera Neumann y se calcula la solución en cada paso temporal. | ||
| + | res_neu = zeros(length(xx), length(tt)); | ||
| + | |||
| + | for n=1:n_max | ||
| + | B(n) = trapz(xx, u0(xx) .* cos((n*pi/b) * xx)) /... | ||
| + | trapz(xx, cos((n*pi/b) * xx).^2); | ||
| + | end | ||
| + | |||
| + | for j = 1:length(tt) | ||
| + | auxt = tt(j); | ||
| + | |||
| + | for i = 1:length(xx) | ||
| + | auxx = xx(i); | ||
| + | u = trapz(xx, u0(xx))./(2.*b); | ||
| + | |||
| + | for n=1:n_max | ||
| + | u = u + B(n) .* cos((n*pi/b) * auxx) .* exp(-((n^2 * pi^2 / b^2)) .* auxt); | ||
| + | |||
| + | end | ||
| + | res_neu(j,i) = u; | ||
| + | end | ||
| + | end | ||
| + | |||
| + | % Comparación entre las soluciones obtenidas | ||
| + | % Se calcula la diferencia entre las soluciones directa y Neumann, así como entre las soluciones y la convolución. | ||
| + | U1 = res_dir; | ||
| + | U2 = res_neu; | ||
| + | |||
| + | Diff12 = abs(U1 - U2); | ||
| + | Difft1 = abs(val_conv.' - U1); | ||
| + | Difft2 = abs(val_conv.' - U2); | ||
| + | |||
| + | % Visualización de los resultados | ||
| + | % Se muestran las superficies 3D de las soluciones y sus diferencias en gráficos para comparar los resultados obtenidos. | ||
| + | figure(1); | ||
| + | |||
| + | subplot(2,4,2); | ||
| + | view(3); | ||
| + | surf(X, T, U1); | ||
| + | xlabel('x'); | ||
| + | ylabel('t'); | ||
| + | zlabel('$u_1(x,t)$', 'Interpreter', 'latex'); | ||
| + | shading flat; | ||
| + | shading interp; | ||
| + | colormap(gca,'jet'); | ||
| + | axis([-a,a,0,tmax,0,1]) | ||
| + | title('$u_1(x,t)$', 'Interpreter', 'latex'); | ||
| + | |||
| + | subplot(2,4,3); | ||
| + | view(3); | ||
| + | surf(X, T, U2); | ||
| + | xlabel('x'); | ||
| + | ylabel('t'); | ||
| + | zlabel('$u_2(x,t)$', 'Interpreter', 'latex'); | ||
| + | shading flat; | ||
| + | shading interp; | ||
| + | colormap(gca, 'jet'); | ||
| + | axis([-b,b,0,tmax,0,1]) | ||
| + | title('$u_2(x,t)$', 'Interpreter', 'latex'); | ||
| + | |||
| + | subplot(2,4,4); | ||
| + | view(3); | ||
| + | surf(X, T, Diff12); | ||
| + | xlabel('x'); | ||
| + | ylabel('t'); | ||
| + | zlabel('$|u_1(x,t)-u_2(x,t)|$', 'Interpreter', 'latex'); | ||
| + | shading flat; | ||
| + | shading interp; | ||
| + | colormap(gca, 'hot'); | ||
| + | title('$|u_1(x,t)-u_2(x,t)|$', 'Interpreter', 'latex'); | ||
| + | |||
| + | subplot(2,4,5) | ||
| + | view(3); | ||
| + | surf(X, T, val_conv.'); | ||
| + | xlabel('x'); | ||
| + | ylabel('t'); | ||
| + | zlabel('$\Phi_D(x,t)*N(x)$', 'Interpreter', 'latex'); | ||
| + | shading flat; | ||
| + | shading interp; | ||
| + | colormap(gca, 'jet'); | ||
| + | axis([-a,a,0,tmax,0,1]) | ||
| + | title('$\Phi_D(x,t)*N(x)$', 'Interpreter', 'latex'); | ||
| + | |||
| + | subplot(2,4,6); | ||
| + | view(3); | ||
| + | surf(X, T, Difft1); | ||
| + | xlabel('x'); | ||
| + | ylabel('t'); | ||
| + | zlabel('$|\Phi_D(x,t)*N(x)-u_1(x,t)|$', 'Interpreter', 'latex'); | ||
| + | shading flat; | ||
| + | shading interp; | ||
| + | colormap(gca, 'hot'); | ||
| + | title('$|\Phi_D(x,t)*N(x)-u_1(x,t)|$', 'Interpreter', 'latex'); | ||
| + | |||
| + | subplot(2,4,7); | ||
| + | view(3); | ||
| + | surf(X, T, Difft2); | ||
| + | xlabel('x'); | ||
| + | ylabel('t'); | ||
| + | zlabel('$|\Phi_D(x,t)*N(x)-u_2(x,t)|$', 'Interpreter', 'latex'); | ||
| + | shading flat; | ||
| + | shading interp; | ||
| + | colormap(gca, 'hot'); | ||
| + | title('$|\Phi_D(x,t)*N(x)-u_2(x,t)|$', 'Interpreter', 'latex'); | ||
</source> | </source> | ||
Revisión actual del 19:24 19 mar 2025
| Trabajo realizado por estudiantes | |
|---|---|
| Título | Ecuación del calor (Grupo ADMR). |
| Asignatura | EDP |
| Curso | 2024-25 |
| Autores |
|
| Este artículo ha sido escrito por estudiantes como parte de su evaluación en la asignatura | |
Contenido
1 Introducción
El desarrollo de la ecuación del calor se atribuye principalmente al matemático y físico francés Joseph Fourier, quien en 1822 publicó su obra Théorie analytique de la chaleur. En este trabajo formuló una ecuación diferencial en derivadas parciales que describe la propagación del calor por difusión en un medio continuo. En esta ocasión, profundicemos en dos aspectos de este modelo.
Desde un punto de vista físico, estas ecuaciones permiten la modelización de fenómenos como el calentamiento de materiales o la difusión de solutos en fluidos estacionarios. Sin embargo, la influencia de la física es más profunda: de hecho, el coeficiente de difusión lleva su nombre por la interpretación física de su acción en el sistema. ¿Cuál es este efecto, y por qué se lo denota de esta forma?
Planteemos también el paso entre problemas de dominio acotado y los de no acotado. ¿Podemos aproximar las soluciones del sistema no acotado mediante las del acotado? Y de ser así, ¿qué condiciones de frontera en una dimensión funcionan mejor?
2 Solución acotada vs Solución no acotada
Demos por conocidos el uso de separación de variables para resolver problemas de autofunciones en caso acotado y el manejo de la solución fundamental junto con la convolución para el sistema no acotado. Para comparar todas las soluciones correspondientes, consideremos sistema [math] 1-[/math]dimensional, con una gaussiana [math] e^{-x^2} [/math] como condición inicial. Justificamos físicamente como el uso de un láser para calentar un punto de una tira fina de metal. Considerando que los fotones puedan desviarse como una distribución normal por el teorema central del límite, es un montaje experimental factible y regular. ¿Y qué condiciones de frontera?
Si consideramos de Dirichlet, a una tira de longitud [math] 2a [/math] le colocaremos en los extremos un material que se mantenga siempre a la misma temperatura, pongamos que a una temperatura nula. El sistema resulta
[math]\quad
\begin{align}
\begin{cases} u_{t} - u_{xx} = 0 \quad &\forall t \gt 0, x\in [-a,a],\\
u(-a,t) = u(a,t) = 0 \quad &\forall t \gt 0, \\
u(x,0) = e^{-x^2} \quad &\forall x\in [-a,a].
\end{cases}
\end{align}
[/math]
La solución al resolver el problema de autofunciones viene dada por
[math]\quad
u(x,t) = \sum_{n=1}^\infty A_{n} \cos\left(\frac{\pi}{a}(n - \frac{1}{2}) x\right) e^{-\dfrac{\pi^2}{a^2}\left(n - \frac{1}{2}\right)^2 t},
\quad \text{ donde } \quad
A_n = \frac{\int_{-a}^{a} u(x,0) \cos\left(\frac{\pi}{a}(n - \frac{1}{2}) x\right)dx}{\int_{-a}^{a} \cos^2\left(\frac{\pi}{a}(n - \frac{1}{2}) x\right)dx}.
[/math]
Consideremos ahora condiciones de frontera Neumann, con un flujo nulo que físicamente viene de poner extremos aislantes. Para cierto [math] b \gt 0,[/math] y no necesariamente igual que con [math] a [/math]. Consideraremos la ecuación del calor
[math]\quad
\begin{align}
\begin{cases} u_{t} - u_{xx} = 0 \quad &\forall t \gt 0 , x\in [-b,b],\\
u_x(-b,t) = u_x(b,t) = 0 \quad &\forall t \gt 0, \\
u(x,0) = e^{-x^2} \quad &\forall x\in[-b,b].
\end{cases}
\end{align}
[/math]
De nuevo podemos resolver el sistema, por ser homogéneo, mediante separación de variables, obteniendo
[math]\quad
u(x,t) = \sum_{m=0}^\infty B_{m} cos\left(\frac{m\pi}{b} x\right) e^{-\dfrac{m^2\pi^2}{b^2} t},\quad \text{ donde } \quad
B_m = \frac{\int_{-b}^{b} u(x,0) \cos\left(\frac{m\pi}{b} x\right)dx}{\int_{-b}^{b} \cos^2\left(\frac{m\pi}{b}x\right)dx}.
[/math]
Un último detalle antes de proceder a los errores es la obtención simbólica de la solución no acotada.
[math]\quad
\begin{align}
\begin{cases} u_{t} - u_{xx} = 0 \quad &\forall t\gt0, x\in \mathbb{R},\\
u(x,0) = e^{-x^2} \quad &\forall x\in \mathbb{R}
\end{cases}
\end{align}
\quad
\Longrightarrow
\quad
u(x,t) = \frac{1}{\sqrt{4\pi t}}e^{\frac{-x^2}{4t}} * e^{-x^2} = \frac{e^{\frac{-x^2}{4t+1}}}{\sqrt{4t+1}}.
[/math]
Queremos comprobar cuán bien aproximan las soluciones del caso acotado Dirichlet y Neumann a la obtenida por la solución fundamental. Para ello, escojamos un tiempo máximo [math]t_{max} [/math] hasta el cuál tomaremos el error en norma [math] L^{\infty} [/math]. Queremos estudiar:
- El efecto de aumentar el rango de definición con [math] a,b [/math].
- El efecto de aumentar el número de términos en las series de los sistemas acotados.
2.1 Análisis de los errores
Consideramos los parámetros, donde [math] n [/math] es el término de la serie de Fourier donde truncamos:
- [math] a = b = 20, [/math]
- [math] t_{max} = 1, [/math]
- [math] n = 100. [/math]
Con [math] t_{max} [/math] fijo podemos observar que al aumentar [math]a, b[/math] y [math]n[/math] el error entre las soluciones acotadas y no acotada disminuye. Nótese que se estanca a partir de cierto [math]n[/math]. De hecho, el error llega a aumentar a partir de ciertos [math] a,b [/math] si truncamos demasiado pronto o demasiado tarde por la aproximación del trapecio para particiones del espacio demasiado bastas -no observado por pericia en código final-.
Al ampliar el tiempo con la [math]n[/math] y fijada [math]a=b=15[/math], al hacer más grande [math]t_{max}[/math] los errores máximos no aumentan. En cambio, si tomamos el máximo error para diferentes tiempos vemos con suficiente precisión que no hay diferencia pero que para truncamientos precoces Neumann tiene ligeramente menor error.
3 Coeficiente de difusión
Interpretemos el valor de [math][/math] D [math][/math] aprovechando el montaje físico anterior. Numéricamente vemos que cuanto mayor es este coeficiente más rápido se difunde el calor, evidenciado en la caída de la solución en tiempos cada vez más cortos.
Tanto las soluciones del caso unidimensional no acotado como las del acotado -que pueden reformularse considerando [math][/math] D [math][/math] en su exponencial, o aproximando por la sección anterior- podemos ver que un mayor coeficiente [math][/math] D [math][/math] acelera el decaimiento de la exponencial por lo que tendrá un efecto similar, justificándose su nombre.
4 Códigos
%%% Código generado junto con Chat GPT para la representación de la solución fundamental de la ecuación del calor unidimensional para distintos valores del coeficiente de difusión
clc
clear all
close all
% Vector de valores de D (coeficiente de difusión)
DD = [1,2,3,4,5,6,7,8,9,10];
% Nombre del archivo GIF de salida
output_gif = 'Fundamental.gif';
% Crear la figura
figura = figure(1);
grid on;
view(3);
% Bucle para iterar sobre cada valor de D
for i = 1:length(DD)
D = DD(i);
% Función fundamental de la ecuación del calor
phi_D = @(x, t) exp(-x.^2./(4*D*t))./sqrt(4*D*pi*t);
% Definición de la malla
xx = -1:0.01:1; % Rango de x
tt = 10^(-2):0.01:1; % Rango de t
[X, T] = meshgrid(xx, tt); % Malla de coordenadas
PHI_D = phi_D(X, T); % Evaluación de la función
% Graficar la superficie
clf;
surf(X, T, PHI_D);
shading flat
shading interp
colormap('jet')
xlabel('x');
ylabel('t');
zlabel('$\Phi_D(x,t)$', 'Interpreter', 'latex');
title(['Solución fundamental de la ecuación del calor, cuando D=', num2str(D)])
axis([-1, 1, 0, 1, 0, 3])
drawnow;
% Captura de la imagen para el GIF
frame = getframe(figura);
img = frame2im(frame);
[imind, cm] = rgb2ind(img, 256);
% Escribir la imagen en el archivo GIF
if i == 1
imwrite(imind, cm, output_gif, 'gif', 'LoopCount', Inf, 'DelayTime', 0.7);
else
imwrite(imind, cm, output_gif, 'gif', 'WriteMode', 'append', 'DelayTime', 0.7);
end
end%%% Código generado junto con Chat GPT para la representación de la soluciones de la ecuación del calor unidimensional para distintos valores del coeficiente de difusión
clc
clear all
close all
% Vector de valores de D (coeficiente de difusión)
DD = [1,10,20,30,40,50,60,70,80,90,100];
% Función gaussiana
gaus = @(x) (exp(-x.^2));
% Nombre del archivo GIF de salida
output_gif = 'Convoluciones_teorica.gif';
% Crear la figura
figura = figure(1);
grid on;
view(3);
% Bucle para iterar sobre cada valor de D
for h = 1:length(DD)
D = DD(h);
% Funciones fundamentales y convolución
phi_D = @(x, t) exp(-x.^2./(4*D*t))./sqrt(4*D*pi*t);
convo = @(x,t) (exp(-x.^2./(4*D.*t+1))/sqrt(4*D.*t+1));
% Definición de la malla
xx = -10:0.1:10; % Rango de x
tt = 10^(-2):0.01:1; % Rango de t
% Inicialización de la matriz de convolución
conv = zeros(length(xx), length(tt));
% Cálculo de la convolución
for j = 1:length(tt)
auxt = tt(j);
for i = 1:length(xx)
auxx = xx(i);
val_conv(i,j) = convo(auxx, auxt);
end
end
% Graficar la superficie
clf;
hold on;
view(3);
surf(xx, tt, val_conv.');
xlabel('x');
ylabel('t');
zlabel('$\Phi_D(x,t)*N(x)$', 'Interpreter', 'latex');
shading flat;
shading interp;
colormap('jet');
title(['Soluciones en dominio no acotado, cuando D=', num2str(D)]);
axis([-10, 10, 0, 1, 0, 1]);
hold off;
drawnow;
% Captura de la imagen para el GIF
frame = getframe(figura);
img = frame2im(frame);
[imind, cm] = rgb2ind(img, 256);
% Escribir la imagen en el archivo GIF
if h == 1
imwrite(imind, cm, output_gif, 'gif', 'LoopCount', Inf, 'DelayTime', 0.7);
else
imwrite(imind, cm, output_gif, 'gif', 'WriteMode', 'append', 'DelayTime', 0.7);
end
end%%% Código generado junto con Chat GPT para la representación de los errores entre las soluciones
function [Diff12,Difft1,Difft2] = errores2(n_max, a, b,t_max)
% Función como condición inicial: una función Gaussiana
gaus = @(x) (exp(-x.^2));
u0 = @(x) exp(-x.^2);
D = 1; % Coeficiente de difusión
% Funciones fundamentales y convolución para el modelo de difusión
phi_D = @(x, t) exp(-x.^2./(4*D*t))./sqrt(4*D*pi*t);
convo = @(x,t) (exp(-x.^2./(4*D.*t+1))/sqrt(4*D.*t+1));
% Definición de la malla (espacio y tiempo)
xx = -a:0.01:a;
tt = 10^(-2):0.01:t_max;
[X, T] = meshgrid(xx, tt);
% Inicialización de la matriz de convolución
conv = zeros(length(xx), length(tt));
% Cálculo de la convolución
for j = 1:length(tt)
auxt = tt(j);
for i = 1:length(xx)
auxx = xx(i);
val_conv(j,i) = convo(auxx, auxt);
end
end
% Inicialización de la matriz de resultados para la solución Dirichlet
res_dir = zeros(length(xx), length(tt));
% Cálculo de la solución directa
for n=1:n_max
A(n) = trapz(xx, u0(xx) .* cos((pi/a)*(n - 1/2) * xx)) /...
trapz(xx, cos((pi/a)*(n - 1/2) * xx).^2);
end
% Evaluación de la solución directa en el dominio espacio-temporal
for j = 1:length(tt)
auxt = tt(j);
for i = 1:length(xx)
auxx = xx(i);
u = 0;
% Sumar los términos de la serie de Fourier
for n=1:n_max
u = u + A(n) .* cos((pi/a)*(n - 1/2) * auxx) .*...
exp(-((pi^2 / a^2) * (n - 1/2)^2) .* auxt);
end
res_dir(i,j) = u;
end
end
% Inicialización de la matriz de resultados para la solución en frontera Neumann
res_neu = zeros(length(xx), length(tt));
% Cálculo de la solución en frontera Neumann
for n=1:n_max
B(n) = trapz(xx, u0(xx) .* cos((n*pi/b) * xx)) /...
trapz(xx, cos((n*pi/b) * xx).^2);
end
% Evaluación de la solución en frontera Neumann en el dominio espacio-temporal
for j = 1:length(tt)
auxt = tt(j);
for i = 1:length(xx)
auxx = xx(i);
u = trapz(xx, u0(xx))./(2.*b);
% Sumar los términos de la serie de Fourier
for n=1:n_max
u = u + B(n) .* cos((n*pi/b) * auxx) .* exp(-((n^2 * pi^2 / b^2)) .* auxt);
end
res_neu(i,j) = u;
end
end
% Transponer los resultados para compararlos con la convolución
U1 = res_dir.';
U2 = res_neu.';
% Calcular las diferencias entre las soluciones y la convolución
Diff12 = abs(U1 - U2);
Difft1 = abs(val_conv - U1);
Difft2 = abs(val_conv - U2);
end%%% Código generado junto con Chat GPT para la representación de las soluciones de la ecuación del calor unidimensional junto con la comparación de sus errores
clc
clear all
close all
% Función como condicion inicial
% Se define la función inicial gausiana y la función u0 que se utilizarán más adelante para los cálculos.
gaus = @(x) (exp(-x.^2));
u0 = @(x) exp(-x.^2);
D = 1;
% Funciones fundamentales y convolución
% Se definen las funciones que describen la solución fundamental de la ecuación y la convolución utilizada.
phi_D = @(x, t) exp(-x.^2./(4*D*t))./sqrt(4*D*pi*t);
convo = @(x,t) (exp(-x.^2./(4*D.*t+1))/sqrt(4*D.*t+1));
% Definición de la malla
% Se definen los parámetros de la malla para las variables espaciales (xx) y temporales (tt), y se crea la malla 2D.
a = 100;
b = 100;
tmax = 1;
n_max = 1000;
xx = linspace(-a, a, 1000);
tt = linspace(10^(-2), tmax, 1000);
[X, T] = meshgrid(xx, tt);
% Inicialización de la matriz de convolución
% Se crea una matriz vacía para almacenar los valores de la convolución.
conv = zeros(length(xx), length(tt));
% Cálculo de la convolución
% Se calcula la convolución para cada punto en la malla de la variable temporal tt y espacial xx.
for j = 1:length(tt)
auxt = tt(j);
for i = 1:length(xx)
auxx = xx(i);
val_conv(i,j) = convo(auxx, auxt);
end
end
% Resolución de la ecuación con condiciones de frontera Dirichlet
% Se calculan los coeficientes A para la expansión en series de Fourier y se calcula la solución directa en cada paso temporal.
res_dir = zeros(length(xx), length(tt));
for n=1:n_max
A(n) = trapz(xx, u0(xx) .* cos((pi/a)*(n - 1/2) * xx)) /...
trapz(xx, cos((pi/a)*(n - 1/2) * xx).^2);
end
for j = 1:length(tt)
auxt = tt(j);
for i = 1:length(xx)
auxx = xx(i);
u = 0;
for n=1:n_max
u = u + A(n) .* cos((pi/a)*(n - 1/2) * auxx) .*...
exp(-((pi^2 / a^2) * (n - 1/2)^2) .* auxt);
end
res_dir(j,i) = u;
end
end
% Resolución de la ecuación con condiciones de frontera Neumann
% Se calculan los coeficientes B para la expansión en series de Fourier con las condiciones de frontera Neumann y se calcula la solución en cada paso temporal.
res_neu = zeros(length(xx), length(tt));
for n=1:n_max
B(n) = trapz(xx, u0(xx) .* cos((n*pi/b) * xx)) /...
trapz(xx, cos((n*pi/b) * xx).^2);
end
for j = 1:length(tt)
auxt = tt(j);
for i = 1:length(xx)
auxx = xx(i);
u = trapz(xx, u0(xx))./(2.*b);
for n=1:n_max
u = u + B(n) .* cos((n*pi/b) * auxx) .* exp(-((n^2 * pi^2 / b^2)) .* auxt);
end
res_neu(j,i) = u;
end
end
% Comparación entre las soluciones obtenidas
% Se calcula la diferencia entre las soluciones directa y Neumann, así como entre las soluciones y la convolución.
U1 = res_dir;
U2 = res_neu;
Diff12 = abs(U1 - U2);
Difft1 = abs(val_conv.' - U1);
Difft2 = abs(val_conv.' - U2);
% Visualización de los resultados
% Se muestran las superficies 3D de las soluciones y sus diferencias en gráficos para comparar los resultados obtenidos.
figure(1);
subplot(2,4,2);
view(3);
surf(X, T, U1);
xlabel('x');
ylabel('t');
zlabel('$u_1(x,t)$', 'Interpreter', 'latex');
shading flat;
shading interp;
colormap(gca,'jet');
axis([-a,a,0,tmax,0,1])
title('$u_1(x,t)$', 'Interpreter', 'latex');
subplot(2,4,3);
view(3);
surf(X, T, U2);
xlabel('x');
ylabel('t');
zlabel('$u_2(x,t)$', 'Interpreter', 'latex');
shading flat;
shading interp;
colormap(gca, 'jet');
axis([-b,b,0,tmax,0,1])
title('$u_2(x,t)$', 'Interpreter', 'latex');
subplot(2,4,4);
view(3);
surf(X, T, Diff12);
xlabel('x');
ylabel('t');
zlabel('$|u_1(x,t)-u_2(x,t)|$', 'Interpreter', 'latex');
shading flat;
shading interp;
colormap(gca, 'hot');
title('$|u_1(x,t)-u_2(x,t)|$', 'Interpreter', 'latex');
subplot(2,4,5)
view(3);
surf(X, T, val_conv.');
xlabel('x');
ylabel('t');
zlabel('$\Phi_D(x,t)*N(x)$', 'Interpreter', 'latex');
shading flat;
shading interp;
colormap(gca, 'jet');
axis([-a,a,0,tmax,0,1])
title('$\Phi_D(x,t)*N(x)$', 'Interpreter', 'latex');
subplot(2,4,6);
view(3);
surf(X, T, Difft1);
xlabel('x');
ylabel('t');
zlabel('$|\Phi_D(x,t)*N(x)-u_1(x,t)|$', 'Interpreter', 'latex');
shading flat;
shading interp;
colormap(gca, 'hot');
title('$|\Phi_D(x,t)*N(x)-u_1(x,t)|$', 'Interpreter', 'latex');
subplot(2,4,7);
view(3);
surf(X, T, Difft2);
xlabel('x');
ylabel('t');
zlabel('$|\Phi_D(x,t)*N(x)-u_2(x,t)|$', 'Interpreter', 'latex');
shading flat;
shading interp;
colormap(gca, 'hot');
title('$|\Phi_D(x,t)*N(x)-u_2(x,t)|$', 'Interpreter', 'latex');5 Referencias
- Sandro Salsa, Gianmaria Verzini. Partial Differential Equations in Action From Modelling to Theory ([1]).