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

De MateWiki
Saltar a: navegación, buscar
Línea 1: Línea 1:
  
  
''La ecuación del calor es un modelo matemático que describe la evolución de la temperatura en un cuerpo sólido en función del tiempo y del espacio. Esta ecuación fue propuesta por el físico francés Jean-Baptiste Joseph Fourier en 1807, pero no sería hasta 1822 cuando la academia de ciencias francesas, a la que pertenecía, decidió publicarla bajo el título de “Théorie analytique de la chaleur” (Teoría analítica del calor).  
+
La ecuación del calor es un modelo matemático que describe la evolución de la temperatura en un cuerpo sólido en función del tiempo y del espacio. Esta ecuación fue propuesta por el físico francés Jean-Baptiste Joseph Fourier en 1807, pero no sería hasta 1822 cuando la academia de ciencias francesas, a la que pertenecía, decidió publicarla bajo el título de “Théorie analytique de la chaleur” (Teoría analítica del calor).  
 
Su expresión matemática, simplificada para nuestro caso, en el que tratamos la distribución de temperaturas en una varilla, que es un elemento unidimensional (con x como variable longitud), sería la siguiente:
 
Su expresión matemática, simplificada para nuestro caso, en el que tratamos la distribución de temperaturas en una varilla, que es un elemento unidimensional (con x como variable longitud), sería la siguiente:
  

Revisión del 18:25 15 may 2014


La ecuación del calor es un modelo matemático que describe la evolución de la temperatura en un cuerpo sólido en función del tiempo y del espacio. Esta ecuación fue propuesta por el físico francés Jean-Baptiste Joseph Fourier en 1807, pero no sería hasta 1822 cuando la academia de ciencias francesas, a la que pertenecía, decidió publicarla bajo el título de “Théorie analytique de la chaleur” (Teoría analítica del calor). Su expresión matemática, simplificada para nuestro caso, en el que tratamos la distribución de temperaturas en una varilla, que es un elemento unidimensional (con x como variable longitud), sería la siguiente:


[math]\frac{\partial U}{\partial t}-\frac{\partial ^2U}{\partial x^2}=0[/math]  


Siendo U (x,t) la temperatura de cada punto de la varilla en cada instante t. Consideramos una varilla de longitud L de un cierto material, de espesor constante. Está orientada en la dirección del eje x, desde x=0 a x=L. La varilla es conductora de calor, por lo que entre dos zonas de ella a diferente temperatura hay un intercambio de energía térmica. En nuestro caso, consideramos una varilla delgada de longitud L=3m, y cuyos extremos (x=0 y x=3) están colocados sobre objetos que mantienen una temperatura constante de 0 y 10º C respectivamente. Suponemos que la varilla es de grosor despreciable y tiene su superficie exterior aislada térmicamente. Podemos entonces pensar que todas las temperaturas son constantes a lo largo de cada sección transversal, y ver la varilla como un objeto unidimensional. Inicialmente la temperatura de la varilla viene dada por U0(x)=10X/3 salvo en su tercio central donde la temperatura ha subido hasta los 100 grados. Designamos por U(x, t) a la temperatura de la sección de la varilla que dista x ≥ 0 del extremo x = 0 cuando ha pasado un tiempo t ≥ 0. La función U (x,t) para t=0 se convierte en una función que llamamos U0(x), y que definimos así:


\begin{cases} u_t-u_{xx}=0, \qquad x\epsilon(0,3), t>0\\ u(0,t)=0, u(3,t)=10, \qquad t>0\\ u(x,0)=u_0(x), \qquad x\epsilon[0,3] \end{cases}

[math] u_0(x)= \begin{cases} 10x/3 & \mbox{si} & x \in \mbox{(0,1)}\cup\mbox{(2,3)} \\ 100 & \mbox{si} & x \in \mbox{(1,2)} \end{cases} [/math]


A continuación aproximaremos la resolución de la ecuación del calor por diferentes métodos y estudiaremos la evolución de las temperaturas en los diferentes puntos de la varilla a lo largo de diferentes intervalos de tiempo. Definamos el Problema propiamente con su ecuación y sus condiciones de frontera:


[math]u_t-u_xx=0 \quad x\in(0,3) \quad t\gt0 [/math]


[math]u(x,0)=\frac{10x}{3} \quad x\in(0,1) U (2,3)[/math]


[math]u(x,0)=100\quad x\in(1,2)[/math]


[math]u(0,t)=0[/math]


[math]u(3,t)=10[/math]


1 Solución mediante el método del Trapecio

%datos del problema
L=3;
h=0.1;
T=2;
%discretizacion espacial
N=L/h;
%vector de puntos en el espacio
x=0:h:L;
xint=h:h:L-h;%nodos interiores
%aproximacion de -Uxx
K=2*diag(ones(1,N-1))-diag(ones(1,N-2),1)-diag(ones(1,N-2),-1);
K=(1/h^2)*K;
%calculamos F
F=zeros(N-1,1);
F(N-1,1)=10/h^2;
%calculamos U0
U0=(10*xint/3)';
for j=1:length(xint)
    if (xint(j)>1)&(xint(j)<2)
        U0(j)=100;
    end
end

%discretizacion temporal
dt=h; %paso en el espacio
t=0:dt:T;%vector en tiempos



%metodo del trapecio
I=eye(N-1);
M=I+(dt./2)*K;
U(1,:)=[0   U0' 10];
uu=U0;
for n=1:length(t)-1
    uu=M\(uu+dt/2*(F)+dt/2*(-K*uu+F));
    U(n+1,:)=[0 uu' 10];
end
%dibujamos la solucion (apartado 3)



[xx,tt]=meshgrid(x,t);
 
figure(1)
surf(xx,tt,U)
xlabel('espacio')
ylabel('tiempo')
zlabel('Temperatura')
figure(2)
plot(t,U(:,15))
Variación de la temperatura en funcion del tiempo y la posición de la barra
Variación de la temperatura respecto al tiempo en el punto medio de la varilla

En la primera gráfica se observa la diferencia de temperatura en la barra debido a las condiciones iniciales y cómo va disminuyendo su temperatura con el paso del tiempo. Como se aprecia en la gráfica de la derecha, el punto medio de la barra sufre una disminución en la temperatura a lo largo del tiempo. Hay un descenso de la temperatura mas acentuada en los primeros instantes, que se debe al contraste existente entre la barra y el entorno, el cual actúa como sumidero de calor. En ambas representaciones se ven unos picos o asientos térmicos que pueden ser debidos a la inexactitud del método empleado. Con un paso en el tiempo menor y un mayor intervalo, estos errores son menos apreciables.

2 Solución mediante el método de Euler implicito

%datos del problema
L=3;
h=0.1;
T=2;
%discretizacion espacial
N=L/h;
%vector de puntos en el espacio
x=0:h:L;
xint=h:h:L-h;%nodos interiores
%aproximacion de -Uxx
K=2*diag(ones(1,N-1))-diag(ones(1,N-2),1)-diag(ones(1,N-2),-1);
K=(1/h^2)*K;
%calculamos F
F=zeros(N-1,1);
F(N-1,1)=10/h^2;
%calculamos U0
U0=(10*xint/3)';
for j=1:length(xint)
    if (xint(j)>1)&(xint(j)<2)
        U0(j)=100;
    end
end

%discretizacion temporal
dt=h; %paso en el espacio
t=0:dt:T;%vector en tiempos



%metodo de euler implicito
I=eye(N-1);
M=I+dt.*K;
U(1,:)=[0   U0' 10];
uu=U0;
for n=1:length(t)-1

    uu=M\(uu+dt*(F));
    U(n+1,:)=[0 uu' 10];
end




%dibujamos la solucion (apartado 3)

[xx,tt]=meshgrid(x,t);
 
figure(1)
surf(xx,tt,U)
xlabel('espacio')
ylabel('tiempo')
zlabel('Temperatura')
figure(2)
plot(t,U(:,15))
Variación de la temperatura en funcion del tiempo y la posición de la barra
Variación de la temperatura respecto al tiempo en el punto medio de la varilla

3 Solución mediante el método de Euler explícito

%datos del problema
L=3;
h=0.1;
T=2;
%discretizacion espacial
N=L/h;
%vector de puntos en el espacio
x=0:h:L;
xint=h:h:L-h;%nodos interiores
%aproximacion de -Uxx
K=2*diag(ones(1,N-1))-diag(ones(1,N-2),1)-diag(ones(1,N-2),-1);
K=(1/h^2)*K;
%calculamos F
F=zeros(N-1,1);
F(N-1,1)=10/h^2;
%calculamos U0
U0=(10*xint/3)';
for j=1:length(xint)
    if (xint(j)>1)&(xint(j)<2)
        U0(j)=100;
    end
end

%discretizacion temporal
dt=h^2/2; %paso en el espacio 
t=0:dt:T;%vector en tiempos



%metodo de euler explicito
I=eye(N-1);
M=I-dt.*K;
U(1,:)=[0   U0' 10];
uu=U0;
for n=1:length(t)-1

    uu=M*uu+dt*F;
    U(n+1,:)=[0 uu' 10];
end

%dibujamos la solucion (apartado 3)
[xx,tt]=meshgrid(x,t);
 
figure(1)
surf(xx,tt,U)
xlabel('espacio')
ylabel('tiempo')
zlabel('Temperatura')
figure(2)
plot(t,U(:,15))
Si dt=h, el paso en el tiempo es demasiado grande y el programa no responde. Por ello, es necesario reducir su valor para que se ejecute el programa correctamente. En nuestro caso hemos tomado dt=h^2/2.
Variación de la temperatura en funcion del tiempo y la posición de la barra
Variación de la temperatura respecto al tiempo en el punto medio de la varilla

4 Solución mediante el método de Runge-Kutta

%datos del problema
L=3;
h=0.1;
T=2;
%discretizacion espacial
N=L/h;
%vector de puntos en el espacio
x=0:h:L;
xint=h:h:L-h;%nodos interiores
%aproximacion de -Uxx
K=2*diag(ones(1,N-1))-diag(ones(1,N-2),1)-diag(ones(1,N-2),-1);
K=(1/h^2)*K;
%calculamos F
F=zeros(N-1,1);
F(N-1,1)=10/h^2;
%calculamos U0
U0=(10*xint/3)';
for j=1:length(xint)
    if (xint(j)>1)&(xint(j)<2)
        U0(j)=100;
    end
end

%discretizacion temporal
dt=h^2/2; %paso en el espacio
t=0:dt:T;%vector en tiempos



%metodo de runge-kuta
I=eye(N-1);
M=I-dt.*K;
U(1,:)=[0   U0' 10];
uu=U0;
for n=1:length(t)-1
 k1=-K*uu+F;
 k2=-K*(uu+k1*dt/2)+F;
 k3=-K*(uu+k2*dt/2)+F;
 k4=-K*(uu+k3*dt)+F;
 uu=uu+(dt/6)*(k1+2*k2+2*k3+k4);
 U(n+1,:)=[0 uu' 10];

end




%dibujamos la solucion (apartado 3)
[xx,tt]=meshgrid(x,t);
 
figure(1)
surf(xx,tt,U)
xlabel('espacio')
ylabel('tiempo')
zlabel('Temperatura')
figure(2)
plot(t,U(:,15))
Variación de la temperatura en función del tiempo y la posición de la barra
Variación de la temperatura respecto al tiempo en el punto medio de la varilla
Debido a la elección de un paso extremadamente pequeño, las líneas de nivel de la superficie se encuentran tan próximas que hacen imposible la visualización de la superficie. Por ello, empleamos el comando "shading flat" para eliminar de la gráfica estas lineas y que se distinga mejor.
Variación de la temperatura en función del tiempo y la posición de la barra

Una vez resuelta la ecuación por los cuatro métodos anteriores podemos deducir que el método de Euler implícito es el que mejor aproxima,ya que tanto Runge-kutta como euler explícito necesitan un paso menor en la discretización para mejorar la aproximación.


5 Estado estacionario para tiempos grandes

%datos del problema
L=3;
h=0.1;
T=18;
%discretizacion espacial
N=L/h;
%vector de puntos en el espacio
x=0:h:L;
xint=h:h:L-h;%nodos interiores
%aproximacion de -Uxx
K=2*diag(ones(1,N-1))-diag(ones(1,N-2),1)-diag(ones(1,N-2),-1);
K=(1/h^2)*K;
%calculamos F
F=zeros(N-1,1);
F(N-1,1)=10/h^2;
%calculamos U0
U0=(10*xint/3)';
for j=1:length(xint)
    if (xint(j)>1)&(xint(j)<2)
        U0(j)=100;
    end
end

%discretizacion temporal
dt=h^2/2; %paso en el espacio
t=0:dt:T;%vector en tiempos



%metodo de runge-kuta
I=eye(N-1);
M=I-dt.*K;
U(1,:)=[0   U0' 10];
uu=U0;
for n=1:length(t)-1
 k1=-K*uu+F;
 k2=-K*(uu+k1*dt/2)+F;
 k3=-K*(uu+k2*dt/2)+F;
 k4=-K*(uu+k3*dt)+F;
 uu=uu+(dt/6)*(k1+2*k2+2*k3+k4);
 U(n+1,:)=[0 uu' 10];

end
 ut1=U(2001,:);
 ut2=U(201,:);
 ut3=U(401,:);
 ut4=U(1,:);
 ut=10.*x/3;
 ur1=ut1-ut;
ur2=ut2-ut;
ur3=ut3-ut;
ur4=ut4-ut;

for i=1:length(t)
    urt=U(i,:);
    if max(urt-ut)<=0.05
    inst=(i-1)/200;
    break
    end
end
inst
%nos dará el instante exacto en el que la temperatura se regulariza hasta ser independiente del tiempo, concretamente 6,395 segundos
%dibujamos la solucion (apartado 3)
[xx,tt]=meshgrid(x,t);

figure(1)
surf(xx,tt,U)
shading flat
xlabel('espacio')
ylabel('tiempo')
zlabel('Temperatura')
figure(2)
plot(x,ut1)
hold on
plot(x,ut,'k')
figure(3)
plot(x,ut2)
hold on
plot(x,ut,'k')
figure(4)
plot(x,ut3)
hold on
plot(x,ut,'k')
figure(5)
plot(x,ut4)
hold on
plot(x,ut,'k')
figure(6)
plot(x,ur1)
figure(7)
plot(x,ur2)
figure(8)
plot(x,ur3)
figure(9)
plot(x,ur4)
Variación de la temperatura en funcion del tiempo y la posición de la barra
Distribución de temperaturas en t=0 comparada con la solución estacionaria
Diferencia entre la distribución de temperaturas en t=0 y la solución estacionaria
Distribución de temperaturas en t=1 comparada con la solución estacionaria
Diferencia entre la distribución de temperaturas en t=1 y la solución estacionaria
Distribución de temperaturas en t=2 comparada con la solución estacionaria
Diferencia entre la distribución de temperaturas en t=2 y la solución estacionaria
Distribución de temperaturas en t=10 comparada con la solución estacionaria
Diferencia entre la distribución de temperaturas en t=10 y la solución estacionaria
Distribución de temperaturas en t=6,395 comparada con la solución estacionaria
Diferencia entre la distribución de temperaturas en t=6,395 y la solución estacionaria

Cómo comparar las distribuciones de temperatura con la solución estacionaria.


Definimos un vector (en este programa lo hemos llamado ut) que contenga una fila de la matriz U, es decir, la distribución de temperaturas en todos los puntos de la varilla para un instante determinado. Con T=10 y dt=0,005, sabemos que la matriz tiene 2001 filas. Tomamos los instantes 0, 1, 2 y 10, que se corresponden con las filas 1, 201, 401 y 2001 y comparamos la distribución de temperaturas en ese instante con la solución estacionaria que hemos calculado. Sabemos que la ecuación del calor es regularizante, por lo que la distribución de temperaturas para tiempos muy grandes tiende a ser independiente del instante, dependiendo únicamente de la posición. En este caso, dadas las condiciones iniciales, un extremo se encuentra a 0ºC y el opuesto a 10ºC, y dado que la varilla es homogénea y mide 3m, es fácilmente deducible que si no existen más intercambios de calor, la distribución final en función de la distancia al extremo será: U(x)=10X/3. Podemos ver en las gráficas que la diferencia entre esta ecuación y la distribución para t=10 es prácticamente inapreciable, por lo que, debido a que se trata de una aproximación, podemos asegurar que la distribución estacionaria de temperaturas se alcanza antes del instante t=10. Pero, ¿en que instante se alcanza exactamente? Mediante un sencillo bucle (líneas 54 a 60) comparamos todas las filas de la matriz U con la solución estacionaria hasta que la máxima diferencia entre ellas sea menor al 0,05%. Una vez se alcance esta diferencia, el bucle se detiene y nos da el numero de fila que corresponde. Obtenemos así la fila 1280, que se corresponde con el instante t=6,395, instante en el que podemos afirmar que la distribución de temperaturas empieza a ser independiente del tiempo con un error del 0,05%.

6 Solución apartado 6

%Datos del problema
L=3;
T=3;

%Datos de la discretización
h=0.1;
N=L/h;
x=0:h:L;
xint=h:h:L; %excluyo un extremo porque tengo la condicion(??)
dt=h/2;
t=0:dt:T;
%Discretización espacial
%aprox de -u_xx
K=2*diag(ones(1,N))-diag(ones(1,N-1),1)-diag(ones(1,N-1),-1);
K(N,N-1)=-2;
K=K/h^2;
%Calculamos U0 (condicion en el instante 0)
U0=(10*xint/3)';
for j=1:length(xint)
    if (xint(j)>1)&(xint(j)<2)
        U0(j)=100;
    end
end

%Definmos F
F=zeros(N,1);
%tenemos U'+KU=F ahora tenemos que aproximar temporalmete
%Discretización temporal
sol(1,:)=[0,U0'];%guardamos la solucion
U=U0; %inicialización
%calculamos U_n ---> U_n+1

%Euler implícito 
for n=1:length(t)-1
    U=(eye(N)+dt*K)\(U+dt*F);
    sol(n+1,:)=[0,U'];%guardamos la solucion
end
%dibujamos
[xx,tt]=meshgrid(x,t);

surf(xx,tt,sol)
Variación de la temperatura en funcion del tiempo y la posición de la barra

7 apartado 7. Serie de Fourier

%u_t-u_xx= 0
%u(0,t)=0
%u_x(3,t)=0
%u(x,0)=u0(x)

%Datos del problema
L=3;
T=10;
%Datos de la aproximación
Q=1; %numero de coef de Fourier
h=0.01; %numero de int en x
N=L/h;
x=0:h:L;
dt=h; %mismo paso en timpo y espacio
t=0:dt:T;
f=((10*x)/3).*(x<=1)+100*(1<x).*(x<2)+((10*x)/3).*(x>=2);
%calculamos la aproximacion
sol=zeros(length(t),N+1);


for k=1:Q
    phi=sin(((k-1/2)*pi*x)/3); %autofuncio hallada antes a mano
    c=0; %coeficiente
    a=(trapz(x,f.*phi))/trapz(x,phi.^2);
    T=a*exp(-((k-1/2)^2*pi^2/9)*t);
    sol=sol+T'*phi;
end

[xx,tt]=meshgrid(x,t);
surf(xx,tt,sol)
shading flat
figure(2)
plot(x, sol(1,:),'r')
hold on 
plot(x,f)


Q=1

Aproximación de la distribución de la temperatura inicial con el coeficiente Q=1
Aproximación de la temperatura en funcion del tiempo y la posición de la barra para t=10
Aproximación de la temperatura respecto al tiempo en el punto medio de la varilla para t=0.5

Q=3

Aproximación de la distribución de la temperatura inicial con el coeficiente Q=3
Aproximación de la temperatura respecto al tiempo en el punto medio de la varilla para t=10
Aproximación de la temperatura respecto al tiempo en el punto medio de la varilla para t=0.5

Q=5

Aproximación de la distribución de la temperatura inicial con el coeficiente Q=5
Aproximación de la temperatura respecto al tiempo en el punto medio de la varilla para t=10
Aproximación de la temperatura respecto al tiempo en el punto medio de la varilla para t=0.5

Q=10

Aproximación de la distribución de la temperatura inicial con el coeficiente Q=10
Aproximación de la temperatura respecto al tiempo en el punto medio de la varilla para t=10
Aproximación de la temperatura respecto al tiempo en el punto medio de la varilla para t=0.5

Q=20

Aproximación de la distribución de la temperatura inicial con el coeficiente Q=20
Aproximación de la temperatura respecto al tiempo en el punto medio de la varilla para t=10
Aproximación de la temperatura respecto al tiempo en el punto medio de la varilla para t=0.5

Q=100

Aproximación de la distribución de la temperatura inicial con el coeficiente Q=100
Aproximación de la temperatura respecto al tiempo en el punto medio de la varilla para t=10
Aproximación de la temperatura respecto al tiempo en el punto medio de la varilla para t=0.5

8 apartado 8

%datos del problema

L=3;

h=0.1;

T=2;

%discretizacion espacial

N=L/h;

%vector de puntos en el espacio

x=0:h:L;

xint=h:h:L-h;%nodos interiores

%aproximacion de -Uxx

K=2*diag(ones(1,N-1))-diag(ones(1,N-2),1)-diag(ones(1,N-2),-1);

K=(1/h^2)*K;
K=eye(N-1)+K;

%calculamos F

F=16*ones(N-1,1);

F(N-1,1)=16+10/h^2;

%calculamos U0

U0=(10*xint/3)';

for j=1:length(xint)

    if (xint(j)>1)&(xint(j)<2)

        U0(j)=100;

    end

end

 

%discretizacion temporal

dt=h^2/2; %paso en el espacio

t=0:dt:T;%vector en tiempos

%metodo de runge-kuta

I=eye(N-1);

M=I-dt.*K;

U(1,:)=[0   U0' 10];

uu=U0;

for n=1:length(t)-1

 k1=-K*uu+F;

 k2=-K*(uu+k1*dt/2)+F;

 k3=-K*(uu+k2*dt/2)+F;

 k4=-K*(uu+k3*dt)+F;

 uu=uu+(dt/6)*(k1+2*k2+2*k3+k4);

 U(n+1,:)=[0 uu' 10];

end


[xx,tt]=meshgrid(x,t);

surf(xx,tt,U)
shading flat

xlabel('espacio')

ylabel('tiempo')

zlabel('Temperatura')


9 apartado 9

Nuestro problema inicial tenía unas condiciones de contorno con valores constantes, en el extremo izquierdo (x=0)se mantiene a 0 y en el derecho (x=3) a 10. En cambio, en este último apartado el extremo izquierdo está en contacto con un depósito o material cuya temperatura en el instante t es 10sen(t). En el extremo derecho, cuya condición es tipo Newmann, está entrando una cantidad de calor por unidad de tiempo igual a 1.

clear all
%datos del problema

L=3;
h=0.1;
T=10;
%discretizacion espacial
N=L/h;
%vector de puntos en el espacio
x=0:h:L; 
xint=h:h:L;%nodos interiores
 
%discretizacion temporal
 
dt=h^2/2; %paso en el espacio
 
t=0:dt:T;%vector en tiempos
%aproximacion de -Uxx
K=2*diag(ones(1,N))-diag(ones(1,N-1),1)-diag(ones(1,N-1),-1);
K(N,N-1)=-2;
K=(1/h^2)*K;
K=eye(N)+K;
%calculamos F
g=10*sin(t);%primA O No prima

F=16*ones(N,1);
 
F(N,1)=16+2/h;

 
%calculamos U0
 
U0=(10*xint/3);
 
for j=1:length(xint)
 
    if (xint(j)>1)&(xint(j)<2)
 
        U0(j)=100;
 
    end
 
end
 
 


U(1,:)=[g(1) U0];

%metodo de runge-kuta
 
I=eye(N);
 
M=I-dt.*K;
 

 
uu=U0';
 
for n=1:length(t)-1
 F(1,1)=16+g(n)./(h^2);
 
 k1=-K*uu+F;
 
 k2=-K*(uu+k1*dt/2)+F;
 
 k3=-K*(uu+k2*dt/2)+F;
 
 k4=-K*(uu+k3*dt)+F;
 
 uu=uu+(dt/6)*(k1+2*k2+2*k3+k4);
 
 U(n+1,:)=[g(n+1) uu'];
 
end
 

[xx,tt]=meshgrid(x,t);
 figure(1)
surf(xx,tt,U)
shading flat
 
xlabel('espacio')
 
ylabel('tiempo')
 
zlabel('Temperatura')
Anauceda.jpg