Documentos de Académico
Documentos de Profesional
Documentos de Cultura
www.wuolah.com/student/Toni_AG
29076
Practica-3.pdf
Práctica 3
3º Ampliación de Matemáticas
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su
totalidad.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576
1.- Introducción
El objetivo de esta práctica es el de estudiar el método en diferencias finitas para la
ecuación de transporte lineal en diversas formas.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Escribir un programa MATLAB que implemente el esquema en diferencias finitas que
discretiza la derivada en tiempo mediante una diferencia progresiva y la derivada en
espacio mediante una diferencia regresiva para calcular soluciones numéricas del
problema de valores iniciales
Obsérvese que damos los valores de contorno para la solución solamente en la frontera
derecha 𝑥 = 0, pero no en la izquierda 𝑥 = 10. ¿Por qué? La función f debe darse con
un m-fichero f.m. Como entradas del programa habrá que dar el valor de la velocidad de
propagación 𝑐 > 0, los pasos de la malla espacial y temporal, ∆𝑥 y ∆𝑡 y el número de
iteraciones de tiempo a realizar, 𝑛𝑝𝑡 (número de pasos de tiempo).
Tomar como unas primeras elecciones para la función f, por ejemplo, 𝑓(𝑥) = 0,5𝑥 2 o
2
𝑓(𝑥) = (𝑥 − 2)𝑒 −2(𝑥−2) . Realiza un número suficiente de “instantáneas” de las
soluciones aproximadas para hacerte una idea de cómo evoluciona la solución y
comprueba los resultados con respecto a la solución exacta.
1
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576
Dentro del bucle asignar los valores 𝑢(1) = 𝑔(𝑡(𝑛)). Probar, por ejemplo, con las
2
funciones 𝑔(𝑡) = 𝑡𝑒 −𝑡 o 𝑔(𝑡) = arctan(𝑡) y 𝑓(𝑥) = 0 o 𝑓(𝑥) = (𝑥 − 2)𝑒 [−2(𝑥−2) ] .
Realiza un número suficiente de “instantáneas” de forma que puedas hacerte una idea
sobre la forma de la solución y compara los resultados obtenidos con la solución exacta.
𝑢𝑡 + 𝑐(𝑥)𝑢𝑥 = 0.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Utiliza para ello una diferencia regresiva para aproximar 𝑢𝑥 (este era el esquema que
vimos en teoría). Ahora habrá que escribir también un m-fichero para la función 𝑐(𝑥) y
∆𝑥 dados, ¿de qué forma harías uso de la condición CFL para determinar ∆𝑡? Debes
tener en cuenta que al utilizar un esquema en diferencia retrógrado (descentrado siempre
en un mismo sentido) sólo puedes resolver de forma adecuada ecuaciones para las que
𝑥
𝑐(𝑥) > 0. Toma como función c, por ejemplo, 𝑐(𝑥) = 1 + 10 en [0,10]. ¿Qué clase de
condiciones de contorno serán necesarias en 𝑥 = 0? ¿por qué? Utiliza alguna de las
combinaciones de datos de contorno propuestos en la práctica anterior.
𝑢𝑡 + (𝑐(𝑥)𝑢)𝑥 = 0.
Utiliza para ello una diferencia regresiva para aproximar (𝑐(𝑐)𝑢)𝑥 . En este caso, para
𝑐(𝑥) y ∆𝑥 dados, ¿cuál será la restricción que debemos imponerle al paso de tiempo ∆𝑡?
Recuerda que con este esquema sólo podemos resolver de forma adecuada ecuaciones
para las que 𝑐(𝑥) > 0. Toma por ejemplo, como función 𝑐(𝑥), la misma que en el
proyecto anterior. Para las condiciones de contorno toma alguna de las combinaciones
de datos propuestos en las prácticas anteriores. Siempre que sea posible, calcula la
solución exacta y compárala con los resultados numéricos que obtienes.
𝑓 ′ (𝑥)
𝑓(𝑥 + ℎ) = 𝑓(𝑥) + (𝑥 + ℎ − 𝑥) + ⋯
1!
Despreciamos los términos de segundo orden y mayores.
𝑓 ′ (𝑥)
𝑓(𝑥 + ℎ) ≃ 𝑓(𝑥) + (𝑥 + ℎ − 𝑥) →
1!
→ 𝑓(𝑥 + ℎ) ≃ 𝑓(𝑥) + 𝑓 ′ (𝑥)ℎ
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Despejando 𝑓′(𝑥)
𝑓(𝑥 + ℎ) − 𝑓(𝑥)
𝑓 ′ (𝑥) = (1)
ℎ
De forma análoga, para una función 𝑓(𝑥 − ℎ) obtenemos:
𝑓(𝑥) − 𝑓(𝑥 − ℎ)
𝑓 ′ (𝑥) = (2)
ℎ
Con (1) podemos discretizar mediante diferencias progresivas, mientras que con (2)
podemos discretizar mediante diferencias regresivas.
Para la ecuación de transporte dados los pasos ∆𝑥, ∆𝑡 > 0 definimos una malla en
espacio y tiempo:
𝑥𝑗 = 𝑥0 + 𝑗∆𝑥
𝑡𝑛 = 𝑡0 + 𝑛∆𝑡
𝑢(𝑥𝑗 , 𝑡𝑛 ) − 𝑢(𝑥𝑗−1 , 𝑡𝑛 )
𝑢𝑥 (𝑥𝑗 , 𝑡𝑛 ) ≃
∆𝑥
Si usamos la nomenclatura
𝑢(𝑥𝑗 , 𝑡𝑛 ) = 𝑢𝑗,𝑛
Nos queda
𝑢𝑗,𝑛+1 − 𝑢𝑗,𝑛
𝑢𝑡 (𝑥𝑗 , 𝑡𝑛 ) ≃
∆𝑡
𝑢𝑗,𝑛 − 𝑢𝑗−1,𝑛
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
𝑢𝑥 (𝑥𝑗 , 𝑡𝑛 ) ≃
∆𝑥
Sustituyendo en la ecuación de transporte que tenemos en este caso:
𝑢𝑗,𝑛+1 − 𝑢𝑗,𝑛 𝑢𝑗,𝑛 − 𝑢𝑗−1,𝑛
𝑢𝑡 + 𝑐𝑢𝑥 = 0 → +𝑐 =0→
∆𝑡 ∆𝑥
∆𝑡
→ 𝑢𝑗,𝑛+1 − 𝑢𝑗,𝑛 = −𝑐 (𝑢 − 𝑢𝑗−1,𝑛 )
∆𝑥 𝑗,𝑛
Hacemos un cambio de variable para no arrastrar términos:
∆𝑡
𝑠=𝑐
∆𝑥
Y así ya podemos obtener nuestro esquema:
Este será el esquema regresivo. Con este esquema obtenemos la solución u de forma
aproximada. La solución exacta vendrá dada por el método de las características que
explicamos en la práctica 1.
𝑑𝑥
𝑐(𝑥) =
𝑑𝑡
Si separamos las variables e integramos, obtenemos
𝑑𝑥
∫ = ∫ 𝑑𝑡
𝑐(𝑥)
𝑥
Como en este caso 𝑐(𝑥) = 1 + 10
4
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576
𝑑𝑥 𝑑𝑥 10
∫ 𝑥 = ∫ 𝑑𝑡 → ∫ 10 + 𝑥 = ∫ 𝑑𝑡 → ∫ 10 + 𝑥 𝑑𝑥 = ∫ 𝑑𝑡
1 + 10
10
Hacemos un cambio de variable
𝑢 = 𝑥 + 10
De forma que
𝑑𝑢 = 𝑑𝑥 + 0 → 𝑑𝑢 = 𝑑𝑥
10 1
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
∫ 𝑑𝑥 = 10 ∫ 𝑑𝑢 = 10ln(𝑢)
10 + 𝑥 𝑢
10
∫ 𝑑𝑥 = 10ln(𝑥 + 10)
10 + 𝑥
10 𝑡+𝑐
∫ 𝑑𝑥 = ∫ 𝑑𝑡 → 10 ln(𝑥 + 10) = 𝑡 + 𝑐 → ln(𝑥 + 10) =
10 + 𝑥 10
𝑐
Como es una constante podemos llamarla k
10
𝑡+𝑐 𝑡 𝑐 𝑡
ln(𝑥 + 10) = → ln(𝑥 + 10) = + = +𝑘 →
10 10 10 10
𝑡
𝑥 + 10 = 𝑒 10+𝑘
Obtenemos
𝑡
𝑥 = 𝐾𝑒 10 − 10
Para 𝑡 = 0, (𝑥 = 𝑥0 ) obtenemos
𝑥0 = 𝐾𝑒 0 − 10 → 𝑥0 = 𝐾 − 10 → 𝐾 = 𝑥0 + 10
Despejando 𝑥0
𝑡 𝑡 𝑡
𝑥 + 10 = (𝑥0 + 10)𝑒 10 → 𝑥0 + 10 = (𝑥 + 10)𝑒 −10 → 𝑥0 = (𝑥 + 10)𝑒 −10 − 10
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
𝑥𝑗 = 𝑥0 + 𝑗∆𝑥
𝑡𝑛 = 𝑡0 + 𝑛∆𝑡
𝑢𝑡 + (𝑐(𝑥)𝑢)𝑥 = 0
Si llamamos
𝐹(𝑢) = 𝑐(𝑥)𝑢
Tenemos
𝑢𝑡 + (𝐹(𝑢))𝑥 = 0
𝐹(𝑢(𝑥𝑗 , 𝑡𝑛 )) − 𝐹(𝑢(𝑥𝑗−1 , 𝑡𝑛 ))
(𝐹(𝑢))𝑥 (𝑥𝑗 , 𝑡𝑛 ) ≃
∆𝑥
Si usamos la nomenclatura
𝑢(𝑥𝑗 , 𝑡𝑛 ) = 𝑢𝑗,𝑛
Nos queda
𝑢𝑗,𝑛+1 − 𝑢𝑗,𝑛
𝑢𝑡 (𝑥𝑗 , 𝑡𝑛 ) ≃
∆𝑡
𝐹(𝑢𝑗,𝑛 ) − 𝐹(𝑢𝑗−1,𝑛 )
(𝐹(𝑢))𝑥 (𝑥𝑗 , 𝑡𝑛 ) ≃
∆𝑥
Sustituyendo en la ecuación
𝐹(𝑢) = 𝑐(𝑥)𝑢
Nos queda
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
+ =0→
∆𝑡 ∆𝑥
∆𝑡
→ 𝑢𝑗,𝑛+1 − 𝑢𝑗,𝑛 = − (𝑐(𝑥𝑗 )𝑢𝑗,𝑛 − 𝑐(𝑥𝑗−1 )𝑢𝑗−1,𝑛 ) →
∆𝑥
∆𝑡 ∆𝑡
→ 𝑢𝑗,𝑛+1 = 𝑢𝑗,𝑛 − 𝑐(𝑥𝑗 )𝑢𝑗,𝑛 + 𝑐(𝑥𝑗−1 )𝑢𝑗−1,𝑛
∆𝑥 ∆𝑥
Hacemos un cambio de variable para no arrastrar términos:
∆𝑡
𝑠𝑗 = 𝑐(𝑥𝑗 )
∆𝑥
Análogamente
∆𝑡
𝑠𝑗−1 = 𝑐(𝑥𝑗−1 )
∆𝑥
Y así ya podemos obtener nuestro esquema:
8
𝑠=𝑐
∆𝑡
∆𝑥
Antonio Aguilera González
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576
function edf1
%% Intervalos
%Preguntamos los pasos de espacio y tiempo
Dx=input('Introduzca el paso del intervalo espacial Dx: ');
if isempty(Dx)
Dx=0.25;
end
Dt=input('Introduzca el paso del intervalo temporal Dt: ');
if isempty(Dt)
Dt=0.1;
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
end
%% Condición CFL
% Velocidad de propagación
c=input('Introduzca la velocidad de propagación c: ');
if isempty(c)
c=1;
end
% Condición inicial
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
u(:,1)=f(x,m);
%Los arrays en MATLAB siempre empiezan en 1, en la posición 1. No hay
%posición 0.
%Los dos puntos sirve para decir que se rellenen todos los valores
para
%ese caso con su f(x,m) correspondiente, o sea u(1,1), u(1,2), u(1,3),
%u(1,4)...
% Condición de contorno
u(1,:)=u(1,1);
%El punto x=0 (x_j=1, posición 1) tiene el mismo valor a lo largo del
%tiempo
% Nodos interiores
for j=2:length(x)
%Empezamos en la x_j=2 porque ya conocemos todos los valores de
x_j=1
%(x=0) a lo largo del tiempo gracias a la condición de contorno.
for n=1:length(t)-1
%El contador n empieza en 1 porque el primer u que queremos
%calcular es el de t_n=2, u(j,2) (si n=1 el esquema calcula la
u
%para t_n=2), ya que u(j,1) (t=0) lo conocemos gracias a la
%condición inicial. Por eso también restamos un 1 a la
longitud del
%vector t, ya que el esquema calculará el siguiente.
u(j,n+1)=s*u(j-1,n)+(1-s)*u(j,n);
end
end
%% Calculo de la solución exacta. Método de las características.
uexacta=zeros(length(x),length(t));
for n=1:length(t)
uexacta(:,n)=f(x-c*t(n),m);
end
%% Representación grafica
plot(x,u,'r',x,uexacta,'b')
xlabel('x')
ylabel('u')
legend('Solución numérica')
10
function y=f(x,m)
if m==1
y=0.5*x.^2;
elseif m==2
y=(x-2).*exp(-2*(x-2).^2);
elseif m==3
y=0*x;
end
end
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
function edf2
%% Intervalos
%Preguntamos los pasos de espacio y tiempo
Dx=input('Introduzca el paso del intervalo espacial Dx: ');
if isempty(Dx)
Dx=0.25;
end
Dt=input('Introduzca el paso del intervalo temporal Dt: ');
if isempty(Dt)
Dt=0.1;
end
%% Condición CFL
% Velocidad de propagación
11
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
while s>1
disp('La condición CFL no se cumple.');
disp('Introduzca unos nuevos valores de c, Dx y Dt.')
c=input('Velocidad de propagacion c: ');
Dx=input('Paso en espacio Dx: ');
Dt=input('Paso en tiempo Dt: ');
s=c*Dt/Dx;
end
disp(' ')
% Condición inicial
u(:,1)=f(x,m);
% Condición de contorno
u(1,:)=g(t,k);
% Nodos interiores
for j=2:length(x)
for n=1:length(t)-1
u(j,n+1)=s*u(j-1,n)+(1-s)*u(j,n);
end
end
%% Calculo de la solución exacta. Método de las características.
uexacta=zeros(length(x),length(t));
for n=1:length(t)
uexacta(:,n)=f(x-c*t(n),m);
end
%% Representación grafica
plot(x,u,'r',x,uexacta,'b')
xlabel('x')
ylabel('u')
legend('Solución numérica')
function y=g(t,k)
if k==1
y=t.*exp(-t);
elseif k==2
y=atan(t);
elseif k==3
y=0*t;
end
end
12
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576
function edf3
%% Intervalos
%Preguntamos los pasos de espacio y tiempo
Dx=input('Introduzca el paso del intervalo espacial Dx: ');
if isempty(Dx)
Dx=0.25;
end
Dt=input('Introduzca el paso del intervalo temporal Dt: ');
if isempty(Dt)
Dt=0.1;
end
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
% Número de pasos en el tiempo
npt=input('Introduzca el número de pasos de tiempo npt: ');
if isempty(npt)
npt=10;
end
%% Condición CFL
% Definimos una variable s para comprobar la condición CFL
s=c(x)*Dt/Dx;
while max(s)>1
%Ojo, ahora como s varía con la dimensión del espacio hay que
buscar su
%valor máximo (recordemos que c>0)
disp('La condición CFL no se cumple.');
disp('Introduzca unos nuevos valores de Dx y Dt.')
Dx=input('Paso en espacio Dx: ');
Dt=input('Paso en tiempo Dt: ');
s=c(x)*Dt/Dx;
end
disp(' ')
13
% Condición inicial
u(:,1)=f(x,m);
% Condición de contorno
u(1,:)=g(t,k);
% Nodos interiores
for j=2:length(x)
for n=1:length(t)-1
u(j,n+1)=s(j)*u(j-1,n)+(1-s(j))*u(j,n);
%Como s cambia con x, depende de su posición en la dimensión
%espacial
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
end
end
%% Calculo de la solución exacta. Método de las características.
uexacta=zeros(length(x),length(t));
for j=1:length(x)
for n=1:length(t)
uexacta(j,n)=f((x(j)+10)*exp(-t(n)/10)-10,m);
end
end
%% Representación grafica
plot(x,u,'r',x,uexacta,'b')
xlabel('x')
ylabel('u')
legend('Solución numérica')
function c(x)
c(x)=1+(x/10);
end
function edf4
%% Intervalos
%Preguntamos los pasos de espacio y tiempo
Dx=input('Introduzca el paso del intervalo espacial Dx: ');
if isempty(Dx)
Dx=0.25;
end
Dt=input('Introduzca el paso del intervalo temporal Dt: ');
if isempty(Dt)
Dt=0.1;
end
14
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
disp(' ')
disp('Seleccione la condición de contorno:')
disp('[1] g(t)=t*exp(-t)')
disp('[2] g(t)=atan(t)')
k=input('Introduzca la elección de su dato inicial (1 o 2): ');
disp(' ')
%% Condición CFL
% Definimos una variable s para comprobar la condición CFL
s=c(x)*Dt/Dx;
while max(s)>1
disp('La condición CFL no se cumple.');
disp('Introduzca unos nuevos valores de Dx y Dt.')
Dx=input('Paso en espacio Dx: ');
Dt=input('Paso en tiempo Dt: ');
s=c(x)*Dt/Dx;
end
disp(' ')
% Condición inicial
u(:,1)=f(x,m);
% Condición de contorno
u(1,:)=g(t,k);
% Nodos interiores
for j=2:length(x)
for n=1:length(t)-1
u(j,n+1)=s(j-1)*u(j-1,n)+(1-s(j))*u(j,n);
end
end
%% Representación grafica
plot(x,u,'r',x,uexacta,'b')
xlabel('x')
ylabel('u')
legend('Solución numérica')
15
function edf5
%Vamos a realizar el esquema de Lax-Wendroff para la ecuación de
%transporte lineal (c=cte., c>0).
%% Intervalos
%Preguntamos los pasos de espacio y tiempo
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Dx=input('Introduzca el paso del intervalo espacial Dx: ');
if isempty(Dx)
Dx=0.25;
end
Dt=input('Introduzca el paso del intervalo temporal Dt: ');
if isempty(Dt)
Dt=0.1;
end
%% Condición CFL
% Velocidad de propagación
c=input('Introduzca la velocidad de propagación c: ');
if isempty(c)
c=1;
end
while s>1
disp('La condición CFL no se cumple.');
disp('Introduzca unos nuevos valores de c, Dx y Dt.')
c=input('Velocidad de propagacion c: ');
16
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576
% Condición inicial
u(:,1)=f(x,m);
% Condición de contorno
u(1,:)=g(t,k);
% Nodos interiores
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
for j=2:length(x)-1
for n=1:length(t)-1
u(j,n+1)=u(j,n)-s/2*((u(j+1,n)-u(j-1,n))-s*(u(j+1,n)-
2*u(j,n)+u(j-1,n)));
end
end
%% Calculo de la solución exacta. Método de las características.
uexacta=zeros(length(x),length(t));
for n=1:length(t)
uexacta(:,n)=f(x-c*t(n),m);
end
%% Representación grafica
plot(x,u,'r',x,uexacta,'b')
xlabel('x')
ylabel('u')
legend('Solución numérica')
17
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
18
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
19
20
Antonio Aguilera González
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
21
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
22