Difusión de una sustancia contaminante (Grupo 24C)

De MateWiki
Revisión del 16:06 14 may 2015 de Jose.martinez.montalvo (Discusión | contribuciones) (Condición limpiador)

Saltar a: navegación, buscar
Trabajo realizado por estudiantes
Título Difusión de una sustancia contaminante. Grupo 24-C
Asignatura Ecuaciones Diferenciales
Curso Curso 2014-15
Autores

Jose Antonio Martinez Montalvo 1494 Jorge Sempere Ruíz 4 Isaac Rebollo Palos 1522 Daniel Pascual Cobos 1690 Rodrigo Bellot Rodriguez 1270

Este artículo ha sido escrito por estudiantes como parte de su evaluación en la asignatura

1 Introducción

El trabajo tiene como objetivo el estudio de la mezcla de dos sustancias, una de ellas contaminante, en un tubo largo.

Su planteamiento se realizará de forma similar al de la transmisión de calor a lo largo de una varilla, visto en clase.

Analizaremos el modelo que define nuestro problema (ecuación de difusión), varios puntos teóricos del mismo (la conservación de la masa contaminante, la solución estacionaria) y terminar por plantear un problema concreto el cual resolveremos mediante métodos numéricos, modificando según que condiciones para poder interpretar las distintas situaciones que pueden modelizar nuestro problema.

2 Ecuación de difusión

2.1 Deducción

Sea un tubo largo de longitud L, orientado en la dirección x y cuya sección es constante desde x=0 hasta x=L. Supondremos el tubo aislado tanto superficialmente como lateralmente.

Configuración inicial de las concentraciones de contaminante en el tubo.

Sean dos sustancias contenidas en el tubo, una de ellas contaminante. Denotaremos por u(x,t) la concentración de contaminante, la cual dependerá únicamente de la posición del tubo y del tiempo, manteniéndose constante en cada sección transversal del tubo. Medido en mol/m2s.

Sea F(x,t) el flujo de contaminante (análogo al flujo de calor), definiéndose como la cantidad de contaminante que atraviesa una sección transversal por unidad de tiempo y area, dependiendo del número de moles, siendo éste último proporcional a la masa de la sustancia. Debido a los aislantes laterales y superficiales, el flujo sera a lo largo del eje x.

Debido al principio de conservación de la masa la variación de la concentración de contaminante en cada posición del tubo en función del tiempo, es igual a la suma del flujo de contaminante a través de los extremos del tubo por unidad de tiempo, más la concentración de contaminante generada en el interior por unidad de tiempo. Suponemos igual a 0 las perdidas y/o ganancias en el interior del tubo (problema homogéneo). La ley de Flick (similar a Furier) determina que el flujo de difusión del contaminante es proporcional a la variación de concentración: [math]F(x,t)=-D\frac{\partial u}{\partial x}[/math]


siendo D el coeficiente de difusión (medido en m2/s), que dependerá de las propiedades químicas de los compuestos.

De esta forma y continuando con la semejanza a la transmisión de calor, la concentración de sustancia contaminante en un instante de tiempo t y en una sección transversal que dista x unidades del extremo izquierdo del tubo satisfará: [math]u_t(x,t)=-\frac{\partial }{\partial x}(-D u_x(x,t)) = D u_{xx}(x,t)[/math]

Pasando todo al termino de la izquierda obtendremos la ecuación de difusión: [math]u_t(x,t)- D u_{xx}(x,t)= 0[/math]

dónde D es el coeficiente de difusión anteriormente citado.

Para ello hemos definido [math] A [/math] como la variable de superficie, tomando una sección pequeña del tubo, designada por [math]\Delta x[/math]: La variación de la concentración de contaminante en función del tiempo es:

[math] A u(x,t) \Delta x [/math]

Derivamos respecto del tiempo:

[math] A u_t(x,t) \Delta x [/math]

A continuación, se considera nula la concentración de contaminante generada en el interior por unidad de tiempo debido a la ausencia de sumideros.

Suponemos que Δx>0 y la concentración de contaminante en un tiempo t es menor en x+ Δx que en x, entonces u(x+ Δx) – u(x,t) < 0, y como Δx es pequeño, se tiene que ux(x,t)<0 y el flujo de difusión del contaminante es positivo y va hacia la derecha en la dirección del eje x.

El flujo de calor en un intervalo [math][x, x + ∆x ] [/math] viene dado dado por:

[math]F(x,t)A-F(x+\Delta x, t)A[/math]

Igualando los términos anteriores y dividiendo por [math]A \Delta x[/math] se obtiene:

[math]A u_t(x,t) \Delta x = F(x,t)A-F(x+\Delta x, t)A[/math]:

[math]u_t(x,t)= \frac {F(x,t)-F(x+\Delta x, t)}{\Delta x}[/math]

Haciendo que [math]\Delta x[/math] tienda a 0:

[math]u_t(x,t)= -F_x(x,t)[/math]

Y aplicando la ley de Fick:

[math]u_t(x,t)=-\frac{\partial }{\partial x}(-D u_x(x,t)) = D u_xx(x,t) [/math]

Así se obtiene la ecuación de difusión de la sustancia contaminante a lo largo del tubo anteriormente citada:

[math]u_t(x,t)- D u_xx(x,t)= 0 [/math]

2.2 Conservación de la masa contaminante

A partir de la ecuación u(x,t)se deduce que la masa total del contaminante se conserva a lo largo del tiempo.Para ello se integra:

[math]\frac{d}{dt}\displaystyle\int_{0}^{L}u(x,t)\,dx=\displaystyle\int_{0}^{L}u_{xx}(x,t)\,dx=u_x(x,t)|_0^L=0[/math]

clear all
% Aproximar la ecuacion de la difusion de una sustancia contaminante
% u_t-qu_xx=0, x en (0,L)
% u_x(0,t)=0 Condicion Neumann
% u_x(L,t)=0 Condicion Neumann
% u(x,0)=u0(x)
%%%
% Datos del problema
L=7;
T=7;
q=1;
% Datos de la discretizacion espacial
N=500;
h=L/N;
% Vector de nodos en en espacio
x=0:h:L; 
% Aproximacion de -q*u_xx
K=2*diag(ones(1,N+1))-diag(ones(1,N),1)-diag(ones(1,N),-1);
 K(1,2)=-2;
 K(N+1,N)=-2; 
 K=q*K/h^2;
 % Calculamos u0
 u0=[zeros(1,1+N*3/5),3*ones(1,N*2/5)]';
 % Discretizacion temporal
dt=h/4; % Paso
t=0:dt:T; % Vector de tiempos
% Definimos F
F=zeros(N+1,1); 
% Guardamos la solucion
sol(1,:)=u0'; 
U=u0; % Inicializacion
% Calculamos U_n ----> U_n+1
for j=1:length(t)-1 % Voy hasta la longitud de t menos 1 porque ya conozco un valor
U=(eye(N+1)+dt*K)\(U+dt*F); % metodo implicito
sol(j+1,:)= U'; % Guardamos solucion
end
% Calculamos el area de la funcion en cada tiempo (area = cantidad de contaminante)
areas=zeros(1,length(t));
for i=1:length(t)
f=sol(i,:);
aa=trapz(x,f);
area(i)=aa;
end
% Dibujamos la cantidad de contaminante a lo largo del tiempo
plot(t,area)
xlabel('Tiempo')
ylabel('Cantidad de contaminante')


En la gráfica obtenida se observa cómo la masa total de contaminante se conserva a lo largo del tiempo.


Conservación masa total de contaminante.

3 Problema Propuesto

3.1 Sistema de ecuaciones

Sea el problema:

[math] (P)\left\{\begin{matrix}\\u_t-u_{xx}=0 ,x\in\ (0,7), t\gt0\\u_x(0,t)=0, t\gt0\\u_x(5,t)=0, t\gt0\\u(x,0)=u_0, x\in\ (0,7)\end{matrix}\right. [/math]

Sean las condiciones iniciales:  :[math] u(x,0)=\left\{\begin{matrix}\\0, x≤5\\3, x\gt5\end{matrix}\right. [/math]

Pasamos a su interpretación física.

3.2 Modelización

El problema modeliza el proceso de difusión de una sustancia contaminante a lo largo de un tubo de longitud x=7, delgado, difusor, con superficie lateral aislada y con coeficiente de difusión D igual a 1.

En los puntos interiores del tubo no existentes ni fuentes ni sumideros de sustancia contaminante.

Tanto el extremo izquierdo como el extremo derecho del tubo se encuentran aislados de forma que el flujo de sustancia en ellos es igual a 0.

En el instante inicial, las secciones transversales que distan 5 o menos unidades de longitud del extremo izquierdo tendrán una concentración inicial de sustancia contaminante igual a 0. Las secciones que distan mas de 5 unidades de ese extremo tendrán una concentración de contaminante igual a 3.

3.3 Resolución

3.3.1 Método diferencias finitas

Se trata de un método numérico que nos proporciona una solución aproximada de distintos problemas de ecuaciones en derivadas parciales, aplicable a nuestro caso. Primero realizamos una discretización del espacio, tomando como longitud de paso h y desde x=0 hasta x=7, obteniendo un vector N con x+1 elementos.

Seguidamente aplicamos la ecuacion diferencial a cada nodo interior xn, aproximamos uxx mediante: [math]u_{xx}(x,t)\simeq\frac{u(x_{n-1},t)-2u(x_n,t)+u(x_{n+1},t)}{h^2}=0[/math]

Aplicamos la notación [math] u_n(t) = u(x_n,t)[/math] resulta el sistema de N-1 ecuaciones: \begin{array}{c}u'_n(t)+\frac{-u_{n-1}(t)+2u_n(t)-u_{n+1}(t)}{h^2}=0\end{array} para n=1,2...N-1

Aplicamos las condiciones de contorno:

\begin{array}{c}u'_0(t)=0\\u'_n(t)=0\end{array} Resultando el sistema: \begin{array}{c}U'+KU=0=F\\U(0)=U^0\end{array}

Siendo [math]U^0[/math] las condiciones iniciales en el instante inicial se verifica  :[math] u(x,0)=\left\{\begin{matrix}\\0, x≤5\\3, x\gt5\end{matrix}\right. [/math]

3.3.1.1 Trapecio

Se resuelve el sistema en primer lugar utilizando el método del trapecio tomando [math]\triangle t= \triangle x/4[/math] en [math]t\in\ [0,7][/math], con [math]\triangle x=0.1[/math]

El código en MATLAB del método sería:

clear all
clf
% u_t-qu_xx=0, x en (0,L)
% u_x(0,t)=0 Condicion Neumann
% u_x(L,t)=0 Condicion Neumann
% u(x,0)=u0(x)

% Datos
L=7;
T=7;
q=1;

% Discretizacion espacial
h=0.1;
N=L/h;
x=0:h:L; 

% Discretizacion temporal
dt=h/4; % Tamaño de paso
t=0:dt:T; % Vector de tiempos

% Matriz K
K=2*diag(ones(1,N+1))-diag(ones(1,N),1)-diag(ones(1,N),-1);
K(1,2)=-2; % Condicion Neumann
K(N+1,N)=-2; % Condicion Neumann
K=q*K/h^2;

% Definimos F
F=zeros(N+1,1);

% Calculamos u0
u0=[zeros(1,1+N*5/7),3*ones(1,N*2/7)]';
% Guardamos la solucion para t=0 en la matriz solucion
sol(1,:)=u0'; 
U=u0; % Inicializacion

% Calculamos U_n+1 a partir de U_n con un bucle for
for j=1:length(t)-1 % Voy hasta la longitud de t menos 1 porque ya conozco un valor
U=(eye(N+1)+(dt*K)/2)\((eye(N+1)-(K*dt)/2)*U); % Trapecio
sol(j+1,:)= U'; % Guardamos solucion
end
 % Dibujamos la solucion
[xx,tt]=meshgrid(x,t);
surf(xx,tt,sol);


Se obtiene la siguiente gráfica concentración / espacio-tiempo

3.3.1.2 Euler explícito

clear all
clf
% u_t-qu_xx=0, x en (0,L)
% u_x(0,t)=0 Condicion Neumann
% u_x(L,t)=0 Condicion Neumann
% u(x,0)=u0(x)

% Datos
L=7;
T=7;
q=1;

% Discretizacion espacial
h=0.1;
N=L/h;
x=0:h:L; 

% Discretizacion temporal
dt=h/4; % Tamaño de paso
t=0:dt:T; % Vector de tiempos

% Matriz K
K=2*diag(ones(1,N+1))-diag(ones(1,N),1)-diag(ones(1,N),-1);
K(1,2)=-2; % Condicion Neumann
K(N+1,N)=-2; % Condicion Neumann
K=q*K/h^2;

% Definimos F
F=zeros(N+1,1);

% Calculamos u0
u0=[zeros(1,1+N*5/7),3*ones(1,N*2/7)]';
% Guardamos la solucion para t=0 en la matriz solucion
sol(1,:)=u0'; 
U=u0; % Inicializacion

% Calculamos U_n+1 a partir de U_n con un bucle for
for j=1:length(t)-1 % Voy hasta la longitud de t menos 1 porque ya conozco un valor
U=U-dt*K*U; % metodo explicito
sol(j+1,:)= U'; % Guardamos solucion
end
% Dibujamos la solucion
[xx,tt]=meshgrid(x,t);
surf(xx,tt,sol);


La gráfica concentración / espacio-tiempo obtenida es:

3.3.1.3 Euler implícito

clear all
clf
% u_t-qu_xx=0, x en (0,L)
% u_x(0,t)=0 Condicion Neumann
% u_x(L,t)=0 Condicion Neumann
% u(x,0)=u0(x)

% Datos
L=7;
T=7;
q=1;

% Discretizacion espacial
h=0.1;
N=L/h;
x=0:h:L; 

% Discretizacion temporal
dt=h/4; % Tamaño de paso
t=0:dt:T; % Vector de tiempos

% Matriz K
K=2*diag(ones(1,N+1))-diag(ones(1,N),1)-diag(ones(1,N),-1);
K(1,2)=-2; % Condicion Neumann
K(N+1,N)=-2; % Condicion Neumann
K=q*K/h^2;

% Definimos F
F=zeros(N+1,1);

% Calculamos u0
u0=[zeros(1,1+N*5/7),3*ones(1,N*2/7)]';
% Guardamos la solucion para t=0 en la matriz solucion
sol(1,:)=u0'; 
U=u0; % Inicializacion

% Calculamos U_n+1 a partir de U_n con un bucle for
for j=1:length(t)-1 % Hasta length(t)-1 porque ya tenemos el valor para t=0
U=(eye(N+1)+dt*K)\(U+dt*F); % Euler Implicito
sol(j+1,:)= U'; % Guardamos la solucion
end

% Dibujamos la solucion
[xx,tt]=meshgrid(x,t);
surf(xx,tt,sol);


Se obtiene la siguiente gráfica concentración / espacio-tiempo:

3.3.1.4 Heun

% Aproximar la ecuacion de difusion
% u_t-qu_xx=0, x en (0,L)
% u_x(0,t)=0 Condicion Neumann
% u_x(L,t)=0 Condicion Neumann
% u(x,0)=u0(x)
%%%
% Datos del problema
L=7;
T=7;
q=1;
% Datos de la discretizacion espacial
N=50;
h=L/N;
% Vector de nodos en en espacio
x=0:h:L; 
% Aproximacion de -q*u_xx
K=2*diag(ones(1,N+1))-diag(ones(1,N),1)-diag(ones(1,N),-1);
 K(1,2)=-2;
 K(N+1,N)=-2;
 K=q*K/h^2;
 % Calculamos u0
 u0=[zeros(1,1+N*3/5),3*ones(1,N*2/5)]';
 % Discretizacion temporal
dt=h/20; % Paso
t=0:dt:T; % Vector de tiempos
% Definimos F
F=zeros(N+1,1); 
% Guardamos la solucion
sol(1,:)=u0'; 
U=u0; % Inicializacion
% Calculamos U_n ----> U_n+1
for j=1:length(t)-1 % Voy hasta la longitud de t menos 1 porque ya conozco un valor
% Calculamos k1=h*f(tn,yn)
k1=-K*U;
% Calculamos k2=h*f(tn+h/2,yn+1/2*k1)
k2=-K*(U+dt*k1);
% Meto los datos en el vector
U=U+(dt/2)*(k1+k2);
sol(j+1,:)= U'; % Guardamos solucion
end
 % Dibujamos la solucion
[xx,tt]=meshgrid(x,t);
surf(xx,tt,sol);


La gráfica concentración / espacio-tiempo obtenida es:

El método más preciso es el de Euler Implícito como se demuestra gráficamente y el menos el de Heun

las cuatro gráficas que se han mostrado son todas muy parecidas y solo varia la precisiòn de la curva

3.3.2 Método de Furier

El método de Fourier nos proporciona, al igual que el método de diferencias finitas, una aproximación de la solución del problema:

[math] (P)\left\{\begin{matrix}\\u_t-u_{xx}=0 ,x\in\ (0,7), t\gt0\\u_x(0,t)=0, t\gt0\\u_x(7,t)=0, t\gt0\\u(x,0)=u_0, x\in\ (0,7)\end{matrix}\right. [/math]

Cuyas condiciones iniciales son: [math] u(x,0)=\left\{\begin{matrix}\\0, x≤5\\3, x\gt5\end{matrix}\right. [/math]

Dado que se trata de un sistema con condiciones de frontera homogéneas, el problema de autovalores asociado es:

[math] (PA)\left\{\begin{matrix}\\x''+μx=0 ,x\in\ (0,7)\\x'(0)=0\\x'(7)=0\end{matrix}\right. [/math]

Y los autovalores y autofunciones salvo una constante son:

[math]μ_k=\frac{\pi^2k^2}{49}[/math]: [math]φ_k=cos(kπ/7)x[/math] k=0,1,2,3...

Se aproxima el dato inicial y el segundo miembro, se elige Q y se toma:

[math]\displaystyle\sum_{k=0}^Q c_kφ_k(x)=0[/math]:

[math]\displaystyle\sum_{k=0}^Q a_kφ_k(x)=\left\{\begin{matrix}\\0, x≤5\\3, x\gt5\end{matrix}\right.[/math]

donde se deduce que ck=0 y [math]a_k=\frac{\displaystyle\int_{0}^{7} u_0cos(kπ/7)x\, dx}{\displaystyle\int_{0}^{7} cos^2(kπ/7)x\, dx}[/math]

El problema aproximado queda de la forma:

[math] (P)\left\{\begin{matrix}\\u_t-u_{xx}=0 ,x\in\ (0,7), t\gt0\\u_x(0,t)=0, t\gt0\\u_x(7,t)=0, t\gt0\\u(x,0)=u_0=\displaystyle\sum_{k=0}^Q a_kφ_k(x), x\in\ (0,7)\end{matrix}\right. [/math]

La solución aproximada sería:

[math]u(x,t)=\displaystyle\sum_{k=0}^Q T_k(t)φ_k(x)[/math]

Sustituyendo en la ecuación de difusión de una sustancia contaminante e igualando los coeficicientes de Fourier se obtiene el sistema:

[math]\left\{\begin{matrix}\\T'_k(t)+μ_kT_k(t)=c_k=0\\T_k(0)=a_k\end{matrix}\right.[/math]

Resolviendo el problema de valor inicial, se deduce que [math] T_k(t)=Ce^{-μ_k t}[/math]

La solución aproximada queda de la forma [math]u(x,t)=\displaystyle\sum_{k=0}^Q Ce^{-μ_k t} cos(kπ/7)x[/math]

El valor de la constante C depende de la condición inicial,que es la que condiciona el valor de ak.

3.4 Solución estacionaria

Se calcula la distancia entre la solución estacionaria y la solución u(x,t) para t=0,1,2,10:

clear all
% Aproximar la ecuacion de difusion
% u_t-qu_xx=0, x en (0,L)
% u_x(0,t)=0 Condicion Neumann
% u_x(L,t)=0 Condicion Neumann
% u(x,0)=u0(x)
%%%
% Datos del problema
L=5;
T=10;
q=1;
% Datos de la discretizacion espacial
N=50;
h=L/N;
% Vector de nodos en en espacio
x=0:h:L; 
% Aproximacion de -q*u_xx
K=2*diag(ones(1,N+1))-diag(ones(1,N),1)-diag(ones(1,N),-1);
 K(1,2)=-2;
 K(N+1,N)=-2;
 K=q*K/h^2;
 % Calculamos u0
 u0=[zeros(1,1+N*3/5),3*ones(1,N*2/5)]';
 % Discretizacion temporal
dt=h/4; % Paso
t=0:dt:T; % Vector de tiempos
% Definimos F
F=zeros(N+1,1);
% Guardamos la solucion
sol(1,:)=u0'; 
U=u0; % Inicializacion
% Calculamos U_n ----> U_n+1
for j=1:length(t)-1 % Voy hasta la longitud de t menos 1 porque ya conozco un valor
U=(eye(N+1)+dt*K)\(U+dt*F); % metodo implicito
sol(j+1,:)= U'; % Guardamos solucion
end

dist0=(sqrt(sum((sol(1,:)-1.17).^2)/(N+1)))
dist1=(sqrt(sum((sol(41,:)-1.17).^2)/(N+1)))
dist2=(sqrt(sum((sol(81,:)-1.17).^2)/(N+1)))
dist10=(sqrt(sum((sol(401,:)-1.17).^2)/(N+1)))


De donde se obtiene:

vamos a calcular la media cuadrática de las distancias desde cada punto de la función al estado estacionario para averiguar el tiempo que tarda la concentración en alcanzar el estado estacionario con un error del 5%:

La media cuadrática para N valores [math][x_1,x_2,x_3,...,x_N][/math] de una variable discreta x viene dada por: [math]x=\sqrt{\mathstrut \frac{1}{N}\sum_{k=1}^N}x_k^2=(\frac{x_1^2+x_2^2+...+x_N^2}{N})^{1/2} [/math]

para cada tiempo t tenemos:
clear all
% Aproximar la ecuacion de difusion
% u_t-qu_xx=0, x en (0,L)
% u_x(0,t)=0 Condicion Neumann
% u_x(L,t)=0 Condicion Neumann
% u(x,0)=u0(x)
%%%
% Datos del problema
L=7;
T=10;
q=1;
% Datos de la discretizacion espacial
N=50;
h=L/N;
% Vector de nodos en en espacio
x=0:h:L; 
% Aproximacion de -q*u_xx
K=2*diag(ones(1,N+1))-diag(ones(1,N),1)-diag(ones(1,N),-1);
 K(1,2)=-2;
 K(N+1,N)=-2;
 K=q*K/h^2;
 % Calculamos u0
 u0=[zeros(1,1+N*3/5),3*ones(1,N*2/5)]';
 % Discretizacion temporal
dt=h/4; % Paso
t=0:dt:T; % Vector de tiempos
% Definimos F
F=zeros(N+1,1); 
% Guardamos la solucion
sol(1,:)=u0'; 
U=u0; % Inicializacion
% Calculamos U_n ----> U_n+1
for j=1:length(t)-1 % Voy hasta la longitud de t menos 1 porque ya conozco un valor
U=(eye(N+1)+dt*K)\(U+dt*F); % metodo implicito
sol(j+1,:)= U'; % Guardamos solucion
end
% Calculamos cual es el error del 5%
limite=0.05*1.17;
% Buscamos para que tiempo se alcanza ese valor
for i=1:length(t)
dist=(sqrt(sum((sol(i,:)-1.17).^2)/(N+1)));
if dist<limite
tiempo=(i-1)*dt
break
end
end


Se obtiene un tiempo de ..... segundos.

Al dividir "incremento de x" por 10 (usando N=500) sale un tiempo de ...... segundos.

3.5 Variación de las condiciones de frontera

3.5.1 Condición limpiador

Pasado un tiempo T = 1, colocamos en el extremo izquierdo un limpiador que elimina el contaminante en ese extremo izquierdo, lo que modifica las condiciones de frontera del problema provocando que una condición de frontera tipo Neumann se convierta en una condición tipo Dirichlet, obteniendo el siguiente sistema:

[math] (P)\left\{\begin{matrix}\\u_t-u_{xx}=0 ,x\in\ (0,7), t\gt0\\u(0,t)=0, t\gt0\\u_x(7,t)=0, t\gt0\\u(x,0)=u_0, x\in\ (0,7)\end{matrix}\right. [/math]

Suponiendo que en el instante inicial se verifica  :[math] u(x,0)=\left\{\begin{matrix}\\0, x≤5\\3, x\gt5\end{matrix}\right. [/math]

Se comprueba que está bien propuesto analizando la existencia de solución, la unicidad de ésta y su estabilidad,

Obtenemos una aproximación numérica de la solución utilizando el método de diferencias finitas.

El código en MATLAB del método sería:

clear all
clf
% u_t-qu_xx=0, x en (0,L)
% u_x(0,t)=0 Condicion Neumann para t<=1
% u(0,t)=0 Condicion Dirichlet para t>1
% u_x(L,t)=0 Condicion Neumann
% u(x,0)=u0(x)

% Datos
L=7;
T=7;
q=1;

% Discretizacion espacial
h=0.1;
N=L/h;
x=0:h:L; 
xint=h:h:L; % Vector de nodos interiores

% Discretizacion temporal
dt=h/4; % Tamaño de paso
t=0:dt:T; % Vector de tiempos

% Matriz K para t<=1
K=2*diag(ones(1,N+1))-diag(ones(1,N),1)-diag(ones(1,N),-1);
K(1,2)=-2; % Condicion Neumann
K(N+1,N)=-2; % Condicion Neumann
K=q*K/h^2;
% Matriz K para t>1
K2=2*diag(ones(1,N))-diag(ones(1,N-1),1)-diag(ones(1,N-1),-1);
K2(N,N-1)=-2;
K2=K2/h^2;
% Definimos F
F=zeros(N+1,1);
F2=zeros(N,1);
% Calculamos u0
u0=[zeros(1,1+N*5/7),3*ones(1,N*2/7)]';
% Guardamos la solucion para t=0 en la matriz solucion
sol(1,:)=u0'; 
U=u0; % Inicializacion

% Calculamos U_n+1 a partir de U_n con un bucle for
for j=1:((length(t)-1)/7) 
U=(eye(N+1)+dt*K)\(U+dt*F); % Euler Implicito
sol(j+1,:)= U'; % Guardamos la solucion
end
U(1)=[];
for j=((length(t)-1)/7):length(t)-1 
U=(eye(N)+dt*K2)\(U+dt*F2); % Euler Implicito
sol(j+1,:)= [0,U']; % Guardamos la solucion
end


% Dibujamos la solucion
[xx,tt]=meshgrid(x,t);
surf(xx,tt,sol);


La gráfica obtenida sería:

El valor estacionario de la concentración en el tubo será de cero, debido a que se ha colocado un limpiador en uno de sus extremos que irá eliminando el contaminante.

Para averiguar el tiempo que tarda la concentración en alcanzar este otro estado estacionario con un error del 5% vamos a utilizar 2 métodos distintos. Primero vamos a calcular el tiempo que tarda la cantidad de contaminante en reducirse hasta el 5%, y después calculando la media cuadrática igual que hemos hecho en el apartado anterior.

clear all
% Aproximar la ecuacion de difusion
% u_t-u_xx=0, x en (0,L)
% u(0,t)=0 Condicion Dirichlet
% u_x(L,t)=0 Condicion Neumann
% u(x,0)=u0(x)
%%%
% Datos del problema
L=5;
T=40;
% Datos de la discretizacion
N=50;
h=L/N;
x=0:h:L; % Vector de nodos
xint=h:h:L; % Vector de nodos interiores 
% Discretizacion temporal. 
dt=h/4; 
t=0:dt:T;
% Aproximacion 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=[zeros(1,N*3/5),3*ones(1,N*2/5)]';
% Definimos F
F=zeros(N,1);
% Guardamos la solucion
sol(1,:)=[0,U0']; 
U=U0; % Inicializacion
% Calculamos U_n ----> U_n+1
for j=1:length(t)-1 % voy hasta la longitud de t menos 1 porque ya conozco un valor
U=(eye(N)+dt*K)\(U+dt*F);
sol(j+1,:)=[0,U']; % Guardamos la solucion
end
% Calculamos cual es el error del 5%
limite=0.05*5.85;
% Calculamos el area de la funcion en cada tiempo (area = cantidad de contaminante)
for i=1:length(t)
f=sol(i,:);
area=trapz(x,f);
% Buscamos para que tiempo se alcanza ese valor
if area<limite
tiempo=(i-1)*dt
break
end
end

De la primera forma se obtiene un tiempo de 32.225

clear all
% Aproximar la ecuacion de difusion
% u_t-u_xx=0, x en (0,L)
% u(0,t)=0 Condicion Dirichlet
% u_x(L,t)=0 Condicion Neumann
% u(x,0)=u0(x)
%%%
% Datos del problema
L=5;
T=80;
% Datos de la discretizacion
N=50;
h=L/N;
x=0:h:L; % Vector de nodos
xint=h:h:L; % Vector de nodos interiores 
% Discretizacion temporal. 
dt=h/4; 
t=0:dt:T;
% Aproximacion 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=[zeros(1,N*3/5),3*ones(1,N*2/5)]';
% Definimos F
F=zeros(N,1);
% Guardamos la solucion
sol(1,:)=[0,U0']; 
U=U0; % Inicializacion
% Calculamos U_n ----> U_n+1
for j=1:length(t)-1 % voy hasta la longitud de t menos 1 porque ya conozco un valor
U=(eye(N)+dt*K)\(U+dt*F);
sol(j+1,:)=[0,U']; % Guardamos la solucion
end

% Calculamos cual es el error del 5%
limite=0.05*1.17;
% Buscamos para que tiempo se alcanza ese valor
for i=1:length(t)
dist=(sqrt(sum(sol(i,:).^2)/(N+1)));
if dist<limite
tiempo=(i-1)*dt
break
end
end

De la segunda forma se obtiene un tiempo de 33.275

3.5.2 Condiciones tipo Newman