Está en la página 1de 24

Toni_AG

www.wuolah.com/student/Toni_AG

29076

Practica-3.pdf
Práctica 3

3º Ampliación de Matemáticas

Grado en Ingeniería en Tecnología Industriales

Escuela de Ingenierías Industriales


Universidad de Málaga

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

Antonio Aguilera González

Práctica 3 – Ampliación de matemáticas


Diferencias finitas para la ecuación de transporte lineal

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.

1.1. Primer problema

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

𝑢𝑡 + 𝑐𝑢𝑥 = 0, 0 < 𝑥 < 10, 𝑡 > 0


{𝑢(𝑥, 0) = 𝑓(𝑥)
𝑢(0, 𝑡) = 𝑓(0)

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.2. Segundo problema

Modifica ahora el programa anteriormente implementado para que aproxime


numéricamente las soluciones del problema de valores iniciales con condiciones de
contorno siguiente (𝑐 > 0):

𝑢𝑡 + 𝑐𝑢𝑥 = 0, 0 < 𝑥 < 10, 𝑡 > 0


{𝑢(𝑥, 0) = 𝑓(𝑥)
𝑢(0, 𝑡) = 𝑔(𝑡)

Obsérvese que solamente hemos cambiado la expresión para la condición de contorno,


que ahora está dada por una segunda función g que también debe darse mediante un m-
fichero g.m. Habrá que calcular un vector con t valores

1
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576

Antonio Aguilera González

𝑡 = 𝐷𝑡: 𝐷𝑡: 𝑛𝑝𝑡 + 𝐷𝑡;

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.

1.3. Tercer problema

Escribe un programa MATLAB análogo al realizado anteriormente para la


discretización, en este caso, de la ecuación

𝑢𝑡 + 𝑐(𝑥)𝑢𝑥 = 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.

Realiza de nuevo un número suficiente de “instantáneas” de forma que puedas hacerte


una idea sobre la forma de la solución y, cuando sea posible, compara los resultados
obtenidos con la solución exacta.

1.4. Cuarto problema

Escribe, por último, un programa MATLAB que discretice la ecuación

𝑢𝑡 + (𝑐(𝑥)𝑢)𝑥 = 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.5. Quinto problema

Implementar otros esquemas en diferencias finitas, al menos para la ecuación de


transporte lineal: Lax-Friedrichs, Lax-Wendroff…

Pídele a los reyes: Quiero la mejor impresora relación calidad/precio.


a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576

Antonio Aguilera González

2.- Desarrollo teórico


2.1. Esquema de diferencias finitas (regresivo) para los problemas 1, 2 y 3

Hacemos el desarrollo de Taylor para una función 𝑓(𝑥 + ℎ):

𝑓 ′ (𝑥)
𝑓(𝑥 + ℎ) = 𝑓(𝑥) + (𝑥 + ℎ − 𝑥) + ⋯
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 + 𝑛∆𝑡

Podemos reemplazar 𝑢𝑡 y 𝑢𝑥 por aproximaciones análogas a las expresiones en (1) y


(2), dependiendo del esquema que queramos conseguir.

En este caso se nos pide discretizar 𝑢𝑡 mediante diferencias progresivas y 𝑢𝑥 mediante


diferencias regresivas.

𝑢(𝑥𝑗 , 𝑡𝑛+1 ) − 𝑢(𝑥𝑗 , 𝑡𝑛 )


𝑢𝑡 (𝑥𝑗 , 𝑡𝑛 ) ≃
∆𝑡

𝑢(𝑥𝑗 , 𝑡𝑛 ) − 𝑢(𝑥𝑗−1 , 𝑡𝑛 )
𝑢𝑥 (𝑥𝑗 , 𝑡𝑛 ) ≃
∆𝑥
Si usamos la nomenclatura

Pídele a los reyes: Quiero la mejor impresora relación calidad/precio.


a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576

Antonio Aguilera González

𝑢(𝑥𝑗 , 𝑡𝑛 ) = 𝑢𝑗,𝑛

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:

𝑢𝑗,𝑛+1 − 𝑢𝑗,𝑛 = −𝑠(𝑢𝑗,𝑛 − 𝑢𝑗−1,𝑛 ) →

→ 𝑢𝑗,𝑛+1 = 𝑢𝑗,𝑛 − 𝑠𝑢𝑗,𝑛 + 𝑠𝑢𝑗−1,𝑛 →

𝑢𝑗,𝑛+1 = 𝑠𝑢𝑗−1,𝑛 + (1 − 𝑠)𝑢𝑗,𝑛 (3)

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.

2.2. Solución analítica del tercer problema

La velocidad de propagación se define:

𝑑𝑥
𝑐(𝑥) =
𝑑𝑡
Si separamos las variables e integramos, obtenemos

𝑑𝑥
∫ = ∫ 𝑑𝑡
𝑐(𝑥)
𝑥
Como en este caso 𝑐(𝑥) = 1 + 10

4
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576

Antonio Aguilera González

𝑑𝑥 𝑑𝑥 10
∫ 𝑥 = ∫ 𝑑𝑡 → ∫ 10 + 𝑥 = ∫ 𝑑𝑡 → ∫ 10 + 𝑥 𝑑𝑥 = ∫ 𝑑𝑡
1 + 10
10
Hacemos un cambio de variable

𝑢 = 𝑥 + 10

De forma que

𝑑𝑢 = 𝑑𝑥 + 0 → 𝑑𝑢 = 𝑑𝑥

Así podemos resolver la primera integral

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 + 𝑥 𝑢

Deshaciendo el cambio de antes

10
∫ 𝑑𝑥 = 10ln(𝑥 + 10)
10 + 𝑥

Volviendo a la ecuación de antes y sumando el término constante

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+𝑘

Como 𝑒 𝑘 es una constante podemos llamarla K


𝑡 𝑡
𝑥 + 10 = 𝑒 𝑘 𝑒 10 = 𝐾𝑒 10

Obtenemos
𝑡
𝑥 = 𝐾𝑒 10 − 10

Para 𝑡 = 0, (𝑥 = 𝑥0 ) obtenemos

𝑥0 = 𝐾𝑒 0 − 10 → 𝑥0 = 𝐾 − 10 → 𝐾 = 𝑥0 + 10

Podemos reescribir la ecuación de las curvas


𝑡
𝑥 = (𝑥0 + 10)𝑒 10 − 10 (4)

Estas son las curvas características.

Pídele a los reyes: Quiero la mejor impresora relación calidad/precio.


a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576

Antonio Aguilera González

Despejando 𝑥0
𝑡 𝑡 𝑡
𝑥 + 10 = (𝑥0 + 10)𝑒 10 → 𝑥0 + 10 = (𝑥 + 10)𝑒 −10 → 𝑥0 = (𝑥 + 10)𝑒 −10 − 10

La solución según el método de las características para este caso será:


𝑡
𝑢(𝑥, 𝑡) = 𝑓(𝑥0 ) = 𝑓((𝑥 + 10)𝑒 −10 − 10) (5)

2.3. Esquema de diferencias finitas para el problema 4

Definimos una malla en 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.
𝑥𝑗 = 𝑥0 + 𝑗∆𝑥

𝑡𝑛 = 𝑡0 + 𝑛∆𝑡

Podemos reemplazar 𝑢𝑡 y 𝑢𝑥 por aproximaciones análogas a las expresiones en (1) y


(2), dependiendo del esquema que queramos conseguir.

Tenemos en ese caso la ecuación

𝑢𝑡 + (𝑐(𝑥)𝑢)𝑥 = 0

Si llamamos

𝐹(𝑢) = 𝑐(𝑥)𝑢

Tenemos

𝑢𝑡 + (𝐹(𝑢))𝑥 = 0

Discretizamos 𝑢𝑡 mediante diferencias progresivas y (𝐹(𝑢))𝑥 mediante diferencias


regresivas.

𝑢(𝑥𝑗 , 𝑡𝑛+1 ) − 𝑢(𝑥𝑗 , 𝑡𝑛 )


𝑢𝑡 (𝑥𝑗 , 𝑡𝑛 ) ≃
∆𝑡

𝐹(𝑢(𝑥𝑗 , 𝑡𝑛 )) − 𝐹(𝑢(𝑥𝑗−1 , 𝑡𝑛 ))
(𝐹(𝑢))𝑥 (𝑥𝑗 , 𝑡𝑛 ) ≃
∆𝑥
Si usamos la nomenclatura

𝑢(𝑥𝑗 , 𝑡𝑛 ) = 𝑢𝑗,𝑛

Nos queda
𝑢𝑗,𝑛+1 − 𝑢𝑗,𝑛
𝑢𝑡 (𝑥𝑗 , 𝑡𝑛 ) ≃
∆𝑡

Pídele a los reyes: Quiero la mejor impresora relación calidad/precio.


a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576

Antonio Aguilera González

𝐹(𝑢𝑗,𝑛 ) − 𝐹(𝑢𝑗−1,𝑛 )
(𝐹(𝑢))𝑥 (𝑥𝑗 , 𝑡𝑛 ) ≃
∆𝑥
Sustituyendo en la ecuación

𝑢𝑗,𝑛+1 − 𝑢𝑗,𝑛 𝐹(𝑢𝑗,𝑛 ) − 𝐹(𝑢𝑗−1,𝑛 )


𝑢𝑡 + (𝐹(𝑢))𝑥 = 0 → + =0
∆𝑡 ∆𝑥
Como hemos dicho que

𝐹(𝑢) = 𝑐(𝑥)𝑢

Nos queda

𝑢𝑗,𝑛+1 − 𝑢𝑗,𝑛 𝑐(𝑥𝑗 )𝑢𝑗,𝑛 − 𝑐(𝑥𝑗−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.
+ =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:

𝑢𝑗,𝑛+1 = 𝑢𝑗,𝑛 − 𝑠𝑗 𝑢𝑗,𝑛 + 𝑠𝑗−1 𝑢𝑗−1,𝑛 →

𝑢𝑗,𝑛+1 = 𝑠𝑗−1 𝑢𝑗−1,𝑛 + (1 − 𝑠𝑗 )𝑢𝑗,𝑛 (6)

Con este esquema obtenemos la solución u de forma numérica (aproximada).

2.4. Esquema de Lax-Wendroff para el problema 5

Según la teoría, Lax-Wendroff es de la forma


𝑠
𝑢𝑗,𝑛+1 = 𝑢𝑗,𝑛 − ((𝑢𝑗+1 − 𝑢𝑗−1,𝑛 ) − 𝑠(𝑢𝑗+1,𝑛 − 2𝑢𝑗,𝑛 + 𝑢𝑗−1,𝑛 ))
2
donde

Pídele a los reyes: Quiero la mejor impresora relación calidad/precio.


a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576

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

Antonio Aguilera González

3.- Implementación en MATLAB


3.1. Primer problema

3.1.1. Función edf1.m

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

% Número de pasos en el tiempo


npt=input('Introduzca el número de pasos de tiempo npt: ');
if isempty(npt)
npt=10;
end

% Intervalo del espacio.


x=0:Dx:10; %Va entre 0 y 10 porque en el problema de valor inicial
(PVI)
%la ecuación está definida en este intervalo.

% Intervalo del tiempo


t=0:Dt:npt*Dt; %Empieza en cero porque en el PVI pone la ecuación está
%definida para ese tiempo.

%% Elección de la condición inicial u(x,0)=f(x):


disp(' ')
disp('Seleccione la condición inicial:')
disp('[1] f(x)=0.5*x.^2')
disp('[2] f(x)=(x-2).*exp(-2*(x-2).^2)')
m=input('Introduzca la elección de su dato inicial (1 o 2): ');
disp(' ')

%% Condición CFL
% Velocidad de propagación
c=input('Introduzca la velocidad de propagación c: ');
if isempty(c)
c=1;
end

% Definimos una variable s para comprobar la condición CFL


s=c*Dt/Dx;

%Según la condición CFL, el valor s debe de ser menor o igual a 1. Si


este
%valor es mayor que 1 la condición CFL no se cumple y por tanto
tendremos
%que cambiar los valores hasta que se cumpla la condición.
%El comando while sirve para que, mientras se cumpla la condición que
le

Pídele a los reyes: Quiero la mejor impresora relación calidad/precio.


a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576

Antonio Aguilera González

%acompaña, se ejecute lo que hay dentro. De esya forma, mientras s


siga
%siendo mayor que 1, te seguirá pidiendo datos nuevos de c, Dx y Dt.
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(' ')

%% Cálculo de la solución aproximada. Esquema de diferencias finitas.


u=zeros(length(x),length(t));

% 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

Pídele a los reyes: Quiero la mejor impresora relación calidad/precio.


a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576

Antonio Aguilera González

3.1.2. Función f.m

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

3.2. Segundo problema

3.2.1. Función edf2.m

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

% Número de pasos en el tiempo


npt=input('Introduzca el número de pasos de tiempo npt: ');
if isempty(npt)
npt=10;
end

% Intervalo del espacio.


x=0:Dx:10;

% Intervalo del tiempo


t=0:Dt:npt*Dt;

%% Elección de la condición inicial u(x,0)=f(x):


disp(' ')
disp('Seleccione la condición inicial:')
disp('[2] f(x)=(x-2).*exp(-2*(x-2).^2)')
disp('[3] f(x)=0')
m=input('Introduzca la elección de su dato inicial (2 o 3): ');
disp(' ')

%% Elección de la condición de contorno u(0,t)=g(t):


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
% Velocidad de propagación

11

Pídele a los reyes: Quiero la mejor impresora relación calidad/precio.


a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576

Antonio Aguilera González

c=input('Introduzca la velocidad de propagación c: ');


if isempty(c)
c=1;
end

% Definimos una variable s para comprobar la condición CFL


s=c*Dt/Dx;

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(' ')

%% Cálculo de la solución aproximada. Esquema de diferencias finitas.


u=zeros(length(x),length(t));

% 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')

3.2.2. Función g.m

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

Antonio Aguilera González

3.3. Tercer problema.

3.3.1. Función edf3.m

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

% Intervalo del espacio.


x=0:Dx:10;

% Intervalo del tiempo


t=0:Dt:npt*Dt;

%% Elección de la condición inicial u(x,0)=f(x):


disp(' ')
disp('Seleccione la condición inicial:')
disp('[2] f(x)=(x-2).*exp(-2*(x-2).^2)')
disp('[3] f(x)=0')
m=input('Introduzca la elección de su dato inicial (2 o 3): ');
disp(' ')

%% Elección de la condición de contorno u(0,t)=g(t):


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
%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

Pídele a los reyes: Quiero la mejor impresora relación calidad/precio.


a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576

Antonio Aguilera González

%% Cálculo de la solución aproximada. Esquema de diferencias finitas.


u=zeros(length(x),length(t));

% 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')

3.3.2. Función c.m

function c(x)
c(x)=1+(x/10);
end

3.4. Cuarto problema. Función edf4.m

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

% Número de pasos en el tiempo


npt=input('Introduzca el número de pasos de tiempo npt: ');
if isempty(npt)
npt=10;
end

14

Pídele a los reyes: Quiero la mejor impresora relación calidad/precio.


a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576

Antonio Aguilera González

% Intervalo del espacio.


x=0:Dx:10;

% Intervalo del tiempo


t=0:Dt:npt*Dt;

%% Elección de la condición inicial u(x,0)=f(x):


disp(' ')
disp('Seleccione la condición inicial:')
disp('[2] f(x)=(x-2).*exp(-2*(x-2).^2)')
disp('[3] f(x)=0')
m=input('Introduzca la elección de su dato inicial (2 o 3): ');
disp(' ')

%% Elección de la condición de contorno u(0,t)=g(t):

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(' ')

%% Cálculo de la solución aproximada. Esquema de diferencias finitas.


u=zeros(length(x),length(t));

% 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

Pídele a los reyes: Quiero la mejor impresora relación calidad/precio.


a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576

Antonio Aguilera González

3.5. Quinto problema. Función edf5.m

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

% Número de pasos en el tiempo


npt=input('Introduzca el número de pasos de tiempo npt: ');
if isempty(npt)
npt=10;
end

% Intervalo del espacio.


x=0:Dx:10;

% Intervalo del tiempo


t=0:Dt:npt*Dt;

%% Elección de la condición inicial u(x,0)=f(x):


disp(' ')
disp('Seleccione la condición inicial:')
disp('[2] f(x)=(x-2).*exp(-2*(x-2).^2)')
disp('[3] f(x)=0')
m=input('Introduzca la elección de su dato inicial (2 o 3): ');
disp(' ')

%% Elección de la condición de contorno u(0,t)=g(t):


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
% Velocidad de propagación
c=input('Introduzca la velocidad de propagación c: ');
if isempty(c)
c=1;
end

% Definimos una variable s para comprobar la condición CFL


s=c*Dt/Dx;

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

Antonio Aguilera González

Dx=input('Paso en espacio Dx: ');


Dt=input('Paso en tiempo Dt: ');
s=c*Dt/Dx;
end
disp(' ')

%% Cálculo de la solución aproximada. Esquema de Lax-Wendroff.


u=zeros(length(x),length(t));

% 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

Pídele a los reyes: Quiero la mejor impresora relación calidad/precio.


a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576

Antonio Aguilera González

4.- Representaciones gráficas


4.1. Primer problema

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

Pídele a los reyes: Quiero la mejor impresora relación calidad/precio.


a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576

Antonio Aguilera González

4.2. Segundo problema

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

Pídele a los reyes: Quiero la mejor impresora relación calidad/precio.


a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576

4.3. Tercer problema

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

Antonio Aguilera González

4.4. Cuarto problema

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

Pídele a los reyes: Quiero la mejor impresora relación calidad/precio.


a64b0469ff35958ef4ab887a898bd50bdfbbe91a-2000576

Antonio Aguilera González

4.5. Quinto problema

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

Pídele a los reyes: Quiero la mejor impresora relación calidad/precio.

También podría gustarte