Вы находитесь на странице: 1из 33

Universidad de Guadalaraja

CUCEI

Simulación de procesos fı́sicos


Reporte de trabajo

Alumno: Profesor:
Hugo Alexis Rorres Pasillas Federico Angel Velazquez Muñoz

13 de mayo de 2018
Índice
1. Introducción a Fortran 2
1.1. Elementos básicos del lenguaje . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2. Constantes y variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3. Operaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.4. Arreglos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.5. Cı́clos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.6. Condicionales (IF) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.7. Entrada y salida de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2. Pelota rebotando 5

3. Tiro parabólico 5

4. Derivación 6
4.1. Aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

5. Integración 8
5.1. Aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

6. Ecuaciones Diferenciales 9
6.1. Aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

7. Métodos de Runge-Kutta 11
7.1. Aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

8. Ecuación de difusión 12
8.1. Difusión de calor en 1D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
8.2. Aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
8.3. Difusión de calor en 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
8.4. Aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

9. Ecuación de onda 15
9.1. Aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

10.Códigos 17
10.1. Apéndice 1: Pelota rebotando . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
10.2. Apéndice 2: Tiro parabólico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
10.3. Apéndice 3: Derivadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
10.4. Apéndice 4: Integración numérica . . . . . . . . . . . . . . . . . . . . . . . . . . 21
10.5. Apéndice 5: Ecuaciones diferenciales . . . . . . . . . . . . . . . . . . . . . . . . 22
10.6. Apéndice 6: Runge-Kutta de 2do orden . . . . . . . . . . . . . . . . . . . . . . 23
10.7. Apéndice 7: Difusión de calor en 1D . . . . . . . . . . . . . . . . . . . . . . . . 25
10.8. Apéndice 8: Difusión de calor en 2D . . . . . . . . . . . . . . . . . . . . . . . . 27
10.9. Apéndice 9: Ecuación de onda en 2D . . . . . . . . . . . . . . . . . . . . . . . . 29

1
1. Introducción a Fortran
Fortran(formula translator) es un lenguaje de programación de alto nivel de propósito
general, aunque utilizado principalmente para el cálculo numérico y el cómputo cientı́fico.
Fue creado a finales del año 1953 por John W. Backus como una alternativa al lenguaje
ensamblador, utilizado por la empresa IBM.
Después de su creación, aparecieron otras versiones, las cuales pretendı́an mejorar el len-
guaje, entre las que destacan Fortran II, Fortran 77 y fortran 95.
Los programas de fortran se pueden escribir en cualquier editor de texto, conocido como
código fuente, usando la extensión .f o .95.
Una vez escrito el programa, se debe compilar, es decir, se debe generar un archivo eje-
cutable a partir de este, mediante un compilador, el cual cambia el código por instrucciones
reconocibles por la computadora.

1.1. Elementos básicos del lenguaje


El código de un programa fortran debe seguir algunos aspectos básicos, entre los que se
encuentra:

Nombre del programa. El código debe iniciar con la instrucción Program, seguido del
nombre del programa, y debe finalizar con la instrucción end program

Declaración de las variables que se utilizarán durante la ejecución del programa.

Cuerpo del programa. Es la parte donde están las instrucciones que ejecutará la compu-
tadora.

Se pueden utilizar además subrutinas dentro de un programa, con el fin de reutilizar partes
de código que se deben ejecutar varias veces, con un propósito especı́fico.
Los programas de fortran se deben escribir en lı́neas de a lo más 132 caractéres, y deben
comenzar por 6 espacios en blanco, los cuales son ignorados al ejecutarse este.

1.2. Constantes y variables


Durante la ejecución de los programas de Fortran, se pueden guardar valores en la memoria
del sistema, las cuales pueden ser constantes si el valor que almacena no cambia durante toda
la ejecución del programa, o variables, en caso de que sea necesario cambiar su valor.
Para declarar variables, se debe comenzar por el tipo de datos que contendrá, seguido de
dos signos de dos puntos (::), y el nombre de la variable. Para almacenar en un valor, se utiliza
el sı́mbolo igual, y a continuación se especifica el dato que contendrá. Los tipos de datos más
utilizados en Fortran son:
John W. Backus Pionero de la informática conocido por sus dos aportes más destacados a
la computación; creador junto a un equipo de programadores de IBM del primer Lenguaje de
programación de alto nivel, el FORTRAN, además en 1959 inventa una notación que permite
describir la sintaxis de un Lenguaje de programación de alto nivel, conocida como Backus
Normal Form, llamada posteriormente Backus-Naur Form o simplemente BNF.

2
Logical: solo pueden tener dos valores, verdadero (.true.) o falso (.false.)

Integer: contiene cualquier número entero.

Real: puede contener cualquier valor numérico, el cual se tratará como un número real
(con decimales).

Character: corresponde a cadenas de caractéres.

1.3. Operaciones
Ya que Fortran está destinado al cómputo numérico, es importante conocer la forma de
realizar operaciones matemáticas con los datos, siempre que estos sean del tipo correcto, de
lo contrario dará un error al compilar. Los sı́mbolos para realizar dichas operaciones son:

= Asignación: asigna el valor (a la derecha) a una variable.

+ Suma.

- Resta.

* Multiplicación.

/ División.

** Exponenciación.

1.4. Arreglos
Una forma muy común de guardar datos es mediante arreglos, que corresponden a por-
ciones de la memoria que pueden guardar más de un dato, cada uno identificado por ı́ndices.
Los arreglos se declaran de la misma manera que las variables, sin embargo, hay que poner
delante de esta el número de datos que contendrá (en 1 o dos componentes), por ejemplo:

real, dimension(3) :: v
real, dimension(4,5) :: m

Y para acceder a cada uno de los datos que contiene, se utilizarán los ı́ndices (1 o 2)
correspoendientes, de 1 hasta el valor máximo definido.

1.5. Cı́clos
Se utilizan los cı́clos cuando se requiere ejecutar un conjunto de instrucciones muchas
veces, y tiene una forma estándar dada por:
do i=inicio, fin, incremento
comando 1
comando 2
comando 3
...
end do

3
De esta manera, todos los comandos que están contenidos dentro de la lı́nea de do y la
de end do se ejecutarán varias veces. La primera vez la variable i tomará el valor de inicio,
y cada vez irá incrementando en incremento, hasta que sobrepase el valor de fin, donde se
detendrá el ciclo y se continuará con la ejecución de las instrucciones siguientes.

1.6. Condicionales (IF)


En ocasiones, uno desea que algunas instrucciones se ejecuten únicamente cuando se cum-
ple una condición, que deberá ser un carácter de tipo booleano. La forma general para realizar
esto con fortran es:
if (condición lógica) then
Instrucción 1
Instrucción 2
...
else
Instrucción 3
Instrucción 4
...
end if
De esta manera, el programa ejecutará las instrucciones dentro del bloque IF únicamente
cuando la condición lógica tome el valor de .True., de lo contrario omitirá tales instrucciones.
La instrucción else es opcional, e indica al programa las instrucciones que se ejecutarán en el
caso de que la expresión lógica tenga el valor de .False.

1.7. Entrada y salida de datos


La parte más importante (quizá) de todos los programas, es generar datos de salida apartir
de los datos introducidos (de entrada), los cuales pueden corresponder a muchas cantidades
de interés, como la solución a alguna integral, o la derivada de una función en un punto, etc.
La entrada y salida de datos se maneja con los comandos:
read( , )
write( , )
y, a continuación, el lugar donde se almacenarán los datos.
Ambos comandos reciben dos parámetros; el primero indica la unidad de entrada o salida
de los datos, mientras que el segundo indica el formato con los que se guardarán.

4
2. Pelota rebotando
Cuando soltamos una pelota a una cierta altura (o la lanzamos con una velocidad inicial
desde una algura h = 0), esta realizará un movimiento descrito por las ecuaciones de la caı́da
libre:
1
y = yo + voy t − gt2 (2.1)
2
De esta forma(Apéndice 1), podemos realizar la simulación de una pelota que es lanzada
desde el piso, y que cada vez que llega al piso nuevamente, esta rebota sin perder energı́a.

Figura 1: Pelota que rebota, después de ser lanzada con una velocidad vo

Como vemos en la figura (2), la pelota comienza con una altura h = 0, sin embargo, como
la velocidad es positiva, esta comienza a subir hasta que la velocidad se hace 0, y a partir de
entonces comienza a caer.
Al volver a llegar a la altura h = 0, invertimos la velocidad, de manera que esta comienza
a subir nuevamente.

3. Tiro parabólico
Uno de los temas de gran interés para la fı́sica, es el de describir el movimiento de un
objeto, cuyo movimiento es influenciado únicamente por la fuerza de la gravedad.
Podemos dividir el movimiento en sus dos componentes, una sobre el eje vertical, el cual se
describe mediante las ecuaciones de la caı́da libre, y otro para la velocidad horizontal, la cual
es constante, ya que no existe ninguna fuerza actuando en esta dirección. De esta manera, el
movimiento queda descrito por

5
1
y = yo + voy t − gt2 (3.1)
2
x = vox t (3.2)

Al realizar la simulación de unobjeto que es lanzado desde una altura yo con velocidades
vyo y vxo , vemos que la trayectoria que describe es (Apéndice 2):

Figura 2: Trayectoria de una partı́cula en un tiro parabólico.

Como vemos en la figura 3, el objeto comienza a una altura yo = 20, y a partir de entonces
comienza a subir debido a la velocidad inicial hasta que su velocidad se hace 0. A partir de
la figura, observamos que el objeto describe una trayectoria parabólica, razón por la cual se
le denomina tiro parabólico a este movimiento.

4. Derivación
Uno de los elementos más importantes dentro del cálculo es el concepto de la derivada,
la cual nos indica cómo cambia el valor de la función cuando cambia alguna(s) variable(s)
independiente(s).
Partiendo de la definición de la derivada de una función dada por:

f (xo + h) − f (xo )
f 0 (x) = lı́m (4.1)
h→0 h)
Podemos aproximar la derivada de una función en un punto, si tomamos la igualdad en
lugar del lı́mite. De esta forma, definimos dos derivadas:

Diferencias adelantadas:

6
f (xo + h) − f (xo )
f 0 (x) ≈ (4.2)
h
Diferencias atrasadas:

f (xo ) − f (xo − h)
f 0 (x) ≈ (4.3)
h
Ambas son buenas aproximaciones de la función, siempre que el intervalo h sea lo sufi-
cientemente pequeño; la primera nos indica el cambio de la función cuando la variable in-
dependiente aumenta, mientras que la segunda nos indica el cambio de la función cuando
la variable independiente disminuye. Esta claro que, conforme disminuyamos el intervalo h,
ambas derivadas se irán aproximando hasta la derivada real de la función en ese punto.
Sin embargo, para disminuir el error, se toma el promedio de las derivadas adelantada y
atrasada en ese punto, conocido como diferencias centradas:

f (xo + h) − 2f (xo ) + f (xo − h)


f 0 (x) = (4.4)
h2

4.1. Aplicación
Se utiliza el método para encontrar la derivada de una función, en este caso para f (x) =
sin(x) en el intervavalo [0, 2π]. (Apéndice 2)

(a) Derivada con 10 intervalos (b) Derivada con 50 intervalos

Figura 3: Derivada numérica de la función f (x) = sin(x)

La imgágen superior nos muestra la función f (x), mientras que la inferior nos muestra su
derivada. En los extremos se utilizan las derivadas atrasadas y adelantadas, mientras que en
todos los demás puntos se realizan las derivadas centradas. Se utiliza el método dos veces; en
la figura 3a vemos el resultado, utilizando 10 intervalos, mientras que en la figura 3b vemos
el mismo método, pero utilizado con 50 intervalos.
Como se puede apreciar en la figura 3, el método nos da buenas aproximaciones de la
derivada de una función, cuando utilizamos suficientes intervalos para realizar derivada.

7
5. Integración
Otro de los conceptos fundamentales del cálculo, es el de la integral, la cual nos da el área
bajo la curva de una función en un intervalo definido.
La integración numérica comprende un gran número de algoritmos que permiten calcular
el valor numérico de una integral definida, cada uno con sus respectivos errores.
El problema básico que se trata resolver es el de calcular una solución apoximada de la
integral
Z b
f (x)dx (5.1)
a
Uno de los métodos que nos permite tener el menor error, es el conocido como la regla de
Simpson, que consiste en dividir el intervalo en intervalos más pequeños, y encontrar el área
de estos intervalos, aproximándolos al área de una parábola que se ajuste a la función.

Figura 4: Regla de Simson para integrales definidas.

Al igual que con el método de los rectángulos, se realiza una mejor aproximación cuando
el intervalo se divide en un mayor número de puntos. Sin embargo, al utilizar parábolas en
lugar de rectángulos, la integral contiene un menor error que el método de los rectángulos,
aun cuando no se realicen demaciadas diviciones.
Realizando la interpolación de una parábola en cada intervalo, vemos que la integral está
dada por:
Z b    
a+b
f (x)dx = f (a) + 4 + f (b) (5.2)
a 2

5.1. Aplicación
Como ejemplo, se realiza una integral fácilmente calculable, con el fin de comparar el
resultado.

8
En este caso, utilizamos la función f (x) = x sin(x) en el intervalo de 0 a 3 ∗ pi. Realizando
esta integral sabemos que la integral es
Z 3π
x sin(x) = 3π ≈ 9,42478
0
Utilizando el método de Simpson realizando 20 subdiviciones (Apéndice 3), de manera que
los intervalos tengan un valor de h = 3 ∗ π/20, el valor obtenido es de
Z 3π
x sin(x) ≈ 9,42494011
0

Como vemos, aun con relativamente pocos intervalos el valor obtenido numéricamente de
la integral se aproxima muy bien al valor real.

6. Ecuaciones Diferenciales
Un tema de gran interés tanto por la fı́sica como por muchas otras áreas es el de las ecua-
ciones diferenciales, ya que nos permite modelar sistemas mediante sus cambios. Sin embargo,
aunque se lleva ya mucho tiempo el estudio de este tipo de ecuaciones, muchas veces su reso-
lución analı́tica es demasiado complicada o incluso imposible hasta para los matemáticos más
experimentados. Es por ello que se han inventado muchos métodos de resolución mediante el
uso de las computadoras.
Uno de los métodos más utilizados, y que además nos sirve para una gran cantidad de
ecuaciones diferenciales con valor inicial, es el método de las diferencias finitas, el cual consiste
en reemplazar cada una de las derivadas que intervienen la ecuación por sus apoximaciones
numéricas. De esta manera, se obtiene una relación de recurencia que nos permite obtener
todos los valores a partir de las condiciones iniciales, aunque con un error que la gran mayorı́a
de veces puede ser despreciado.
Recordando la propia definición de la derivada, podemos utilizar la aproximación para la
derivada adelantada como sigue:

f (x + h) − f (x)
f (x) ≈ (6.1)
h
Además, si recordamos que la segunda derivada de una función es la derivada de su primera
derivada, entonces podemos escribir

f 0 (x + h) − f 0 (x)
f 00 (x) ≈ (6.2)
h
Donde las derivadas f 0 (x + h)yf 0 (x) las podemos sustituir a su vez por las aproximaciones
de la primera derivada.
Podemos encontrar aproximacines de las derivadas de orden superior, reemplazando cada
vez las derivadas de orden inferiores. Además, se pueden utilizar las derivadas centradas con
el fin de disminuir el error. El método de diferencias finitas consiste en reemplazar estas
aproximaciones en la ecuación diferencial y encontrar una relación de recurencia a partir de
esta ecuación.

9
6.1. Aplicación
Una de las ecuaciones más comunes dentro de la fı́sica, es la de la segunda ley de Nuewton,
la cual nos describe la cinemática de un cuerpo sometido a varias fuerzas. Podemos utilizar
esta ecuación para el caso en el que la única fuerza que actúa en un objeto es el de la gravedad,
de esta forma, la ecuación diferencial que nos resulta es

d2 y
= −g (6.3)
dt2
donde g es la constante de gravedad, y en la superficie de la Tierra tiene un valor aproximado
de g = 9,81m/s2
Si cambiamos la segunda derivada por su derivada centrada, tenemos

yi+1 − 2yi + yi+1


= −g (6.4)
h
yi+1 = 2yi − gh2 − yi−1 (6.5)

De esta manera, tenemos la ecuación de recurrencia, lo que nos permite obtener la apro-
ximación de la solución a la ecuación diferencial de segundo orden a partir de los dos valores
iniciales.

Figura 5: Solución numérica y real de la ecuación diferencial de la segunda ley de Newton.

Como podemos ver en la fitura 5, la solución a esta ecuación por este método nos da una
buena idea acerca de cómo se comporta la función solución de la ecuación; sin embargo, se
puede ver también que la solución no es exacta, sino que lleva un error, el cual va aumentando
conforme se busquen valores más lejanos a las condiciones iniciales.

10
7. Métodos de Runge-Kutta
Dentro de los métodos numéricos para la resolución de ecuaciones diferenciales, los llama-
dos métodos de Runge-Kutta (RK) son, quizá, los más importantes, ya que logran obtener
una gran exactitud sin la necesidad de dividir en demasiados intervalos.
Existen muchos métodos distintos de Runge-Kutta para la resolución de ecuaciones dife-
renciale, sin embargo, todos tienen la forma general dada por:

yi+1 = yi + φ(xi , yi , h)h (7.1)


donde la función φ es alguna función encontrada mediante algún método de RK, y se conoce
como la función incremento, que puede verse como la pendiente representativa de la solución
en ese intervalo. Dicha función puede escribirse en general como:

φ = a1 k1 + a2 k2 + a3 k3 + · · · + an kn (7.2)
donde las a son algunas constantes y las k son

k1 = f (xi , yi ) (7.3)
k2 = f (xi + p1 h, yi + q11 k1 h)
k3 = f (xi + p2 h, yi + q21 k1 h + q22 k2 h)
..
.
kn = f (xi + pn−1 h, yi + q(n−1)1 k1 h + q(n−2)2 k2 h + . . . q(n−1)(n−1)kn−1 h)

donde las p y las q son algunas constantes. Una vez que se elige el orden del método de
Runge-Kutta a utilizar, las constantes a, q, y p se encuentran igualando las ecuaciones con
los primeros n términos de la serie de Taylor.
Eligiendo n = 2, el método de Runge-Kutta de segundo orden e igualando las k con los
términos de la serie de Taylor, se obtiene el sistema de ecuaciones

a1 = 1 − a2 (7.4)
1
p1 = q11 = (7.5)
2a2
De esta forma, podemos tener varios métodos de Runge-Kutta de segundo orden depen-
diendo del valor que usemos para a2 .

7.1. Aplicación
Podemos resolver la ecuación de la segunda ley de Newton para el caso de un objeto en el
campo gravitatorio de la Tierra. De esta forma, la ecuación diferencial resultante es

d2 y
= −g (7.6)
dt2
donde g es la constante gravitatoria, que tiene un valor de g = 9,81m/s2 cerca de la superficie
de la Tierra.

11
Sin embargo, ya que la ecuación anterior es de segundo orden, podemos cambiarla por el
sistema de ecuaciones siguiente:

dy
=V (7.7)
dt
dV
= −g
dt
y ası́ utilizar el método de Runge-Kutta dos veces; una para encontrar las velocidades en
función del tiempo, y la segunda para encontrar las posiciones en función del tiempo, las
cuales a su vez utilizan los resultados obtenidos de las velocidades.
Usando una velocidad inicial de 20m/s y una posición inicial de 10m, el resultado obtenido
por el método para esta ecuación diferencial es

Figura 6: Solución numérica y real de la ecuación diferencial de la segunda ley de Newton


mediante el método de Runge-Kutta de segundo orden.

Como podemos ver en la figura 6, la solución obtenida para la velocidad en el tiempo es


prácticamente exacta, debido a que la función es una constante. Sin embargo, para el caso
de las posiciones la ecuación ya no es exacta, debido a que se utilizan los datos encontrados
anteriormente, y se considera que en cada intervalo de tiempo de las diviciones la velocidad
es constante. Sin embargo, se puede observar cómo incluso con el método de segundo orden
de RK la solución es muy parecida a la solución real de la ecuación diferencial.

8. Ecuación de difusión
Una de las aplicaciones principales de las ecuaciones derivadas parciales, es el de simular
procesos que ocurren a nuestro alrededor a través del tiempo.

12
La ecuación de difusión de calor, es una ecuación en derivadas parciales homogénea de
primer orden que nos describe cómo se conduce el calor a través de un medio. Dicha ecuación
queda escrita como

∂T
= c2 ∇2 T (8.1)
∂t

8.1. Difusión de calor en 1D


Para el caso de una dimensión, la ecuación diferencial anterior se reduce a

∂T ∂2T
= c2 2 (8.2)
∂t ∂x
sobre la región

0<x<L y 0<t<∞
bajo las condiciones de frontera e iniciales dadas por

T (0, t) = T1 (8.3)
T (L, t) = T2
T (x, 0) = To

Utilizando las ecuaiones de discretización para las derivadas de la temperatura

∂T Ti+1,k − Ti.k
≈ (8.4)
∂t ∆t2
∂2T Ti+1,k − 2Ti,k + Ti−1,k

∂x2 ∆x2
Finalmente, utilizando estas discretizaciones en la ecuación de difusión de calor unidimen-
sional y reorganizando, obtenemos la relación de recurrencia:

∆t
Ti,k+1 = Ti,k + c2 [Ti+1,k − 2Ti,k + Ti−1,k ] (8.5)
∆x2

8.2. Aplicación
Utilizamos la ecuación de difusión de calor para una varilla de longitud L = 1m, con las
condiciones siguientes (Apéndice 7):

T (0, t) = 20 (8.6)
T (L, t) = 0
T (x, 0) = 5

13
Figura 7: Distribución de la temperatura en una varilla a distintos tiempos.

es decir, una barra con temperatura inicial de 5o C, la cual se somente a una temperatura
de 20o C en un extremo y de 0o C en el otro. De esta forma, se obtiene la distribución de la
temperatura en la varilla en diferentes tiempo siguiente:
Como podemos observar en la figura 7, al inicio la temperatura es constante en toda la
varilla, con un cambio brusco en cada extremo. Sin embargo, al pasar alguń tiempo la variación
de la temperatura con la posición x es constante, como se esperarı́a debido a la experiencia.

8.3. Difusión de calor en 2D


Podemos realizar un procedimiento similar al anterior, pero esta vez para el caso bidimen-
sional, en el cual la ecuación diferencial es escritra como:

∂T ∂2T ∂2T
= c2x 2 + c2y 2 (8.7)
∂t ∂x ∂y
En este caso, podemos sustituir nuevamente las discretizaciones de la temperatura, tal
como lo hicimos en el caso unidimensional, con lo que nos queda la discretización como:

∆t ∆t
Ti,j,k+1 = Ti,j,k + c2x 2
[Ti+1,j,k − 2Ti,j,k + Ti−1,j,k + c2y [Ti,j+1,k − 2Ti,j,k + Ti,j−1,k ] (8.8)
∆x ∆x2

8.4. Aplicación
En este caso, utilizamos la ecuación de difusión de calor bidimensional para simular una
placa sobre la que se transmite el calor, por lo que cambia la temperatura (Apéndice 8).
Como condiciones iniciales, se utiliza una placa a temperatura To = 0o C. Posteriormente,
se pone una fuente de calor rectangular sobre el centro de esta placa, la cual es constante
durante todo el tiempo, y como condiciones de frontera, se establece que la temperatura en

14
los bordes de la placa sea igual que en los puntos adyacentes de la discretización. Después de
algún tiempo, la distribución de la temperatura sobre la placa es:

Figura 8: Distribución de la temperatura en una placa después de un tiempo t.

9. Ecuación de onda
La ecuación de onda es otra de las ecuaciones diferenciales de gran interés fı́sico. Se trata
de una ecuación diferencial en derivadas parciales sineal de segundo grado, la cual describe la
propagación de alguna onda en un medio.
Es importanet en varios campos de la fı́sica, tales como la acústica, la óptica, la hidrologı́a,
etc. y está descrita de forma general por

∂2u
= c2 ∇2 u (9.1)
∂t2
donde u es alguna propiedad que se propaga por el espacio, y c es la velocidad de movimiento
de la onda.
Nuevamente, la onda puede viajar en 1, 2 o 3 dimensiones, por lo que la función depende
de las dimensiones espaciales de la onda y del tiempo.
Para el caso bidimensional, podemos utilizar las discretizaciones de las derivadas tal como
lo hicimos con la ecuación de difusión de calor. En este caso, la discretización de la onda nos
queda de la forma:

DISCRET IZACION = ON DA (9.2)

9.1. Aplicación
Como ejemplo, tomamos una onda sinuidal plana que se desplaza a lo largo del espacio
bidimensional, cuyo frente de onda es constante a lo largo de la recta x = cte (Apéndice 9).

15
Como condiciones de frontera, establecemos que la perturbación se realiza en la recta
x = 0, la cual varı́a con el tiempo en forma de onda sinuidal, mientras que en todas las
fronteras restantes, el valor de la perturbación tomará el valor que toma el punto adyacente.
Además, como condiciones iniciales, la perturbación en toda la región es cero.
Después de un tiempo t, la perturbación toma la forma siguiente.

Figura 9: Propagación de una onda sinuidal plana a lo largo del eje y

Como podemos ver en la figura 9, la perturbación de la onda viaja a lo largo del eje y,
mientras que a lo largo de la recta x = cte, la perturbación es la misma. La perturbación viaja
en este caso en la dirección positiva, ya que utilizamos una velocidad de 0.1m/s, y una vez
que choca contra el otro extremo, la perturbación se regresa, interfiriendo con la onda que se
mueve en el sentido contrario.

16
10. Códigos
10.1. Apéndice 1: Pelota rebotando
1 PROGRAM CLibre
2
3 IMPLICIT NONE
4
5 INTEGER, PARAMETER : : n=100
6 REAL, PARAMETER : : g=−9.81
7 REAL, PARAMETER : : PI =3.141592
8 INTEGER : : i
9 REAL : : yo
10 REAL : : vo
11 REAL : : v horizontal
12 REAL : : t h e t a
13 REAL : : t t o t a l
14 REAL : : dt
15 REAL, DIMENSION( n ) : : x
16 REAL, DIMENSION( n ) : : y
17 REAL, DIMENSION( n ) : : v v e r t i c a l
18 REAL, DIMENSION( n ) : : t
19
20
21 WRITE( ∗ , ∗ ) ’ A l t u r a i n i c i a l (m) : ’
22 READ( ∗ , ∗ ) yo
23 WRITE( ∗ , ∗ ) ’ V e l o c i d a d i n i c i a l (m/ s ) : ’
24 READ( ∗ , ∗ ) vo
25 WRITE( ∗ , ∗ ) ’ Angulo i n i c i a l ’
26 READ( ∗ , ∗ ) t h e t a
27 t h e t a=t h e t a ∗ ( PI / 1 8 0 )
28
29 WRITE( ∗ , ∗ ) ’ I n t r o d u z c a e l tiempo t o t a l d e l r e c o r r i d o ’
30 READ( ∗ , ∗ ) t t o t a l
31
32 dt=t t o t a l /n
33 v h o r i z o n t a l=vo ∗ c o s ( t h e t a )
34 v v e r t i c a l ( 1 )=vo ∗SIN ( t h e t a )
35
36 OPEN( u n i t =100 , f i l e =’ d a t o s . dat ’ )
37 DO i =1 ,n
38
39 IF ( i ==1) THEN
40 t ( 1 ) =0
41 x ( 1 ) =0
42 y ( 1 )=yo
43 ELSE
44 t ( i )=t ( i −1)+dt
45 v v e r t i c a l ( i )=v v e r t i c a l ( i −1)+g ∗ dt
46
47 x ( i )=x ( i −1)+v h o r i z o n t a l ∗ dt
48 y ( i )=y ( i −1)+v v e r t i c a l ( i −1)∗ dt +(1/2) ∗ g ∗ dt ∗∗2
49 ENDIF
50
51 WRITE( 1 0 0 , 1 5 0 ) t ( i ) , x ( i ) , y ( i )
52 ENDDO
53
54 150 FORMAT( 3 f 8 . 2 )
55
56 CLOSE( 1 0 0 )
57 STOP
58
59 END PROGRAM

17
10.2. Apéndice 2: Tiro parabólico
1 PROGRAM CLibre
2
3 IMPLICIT NONE
4
5 INTEGER, PARAMETER : : n=100
6 REAL, PARAMETER : : g=−9.81
7 REAL, PARAMETER : : PI =3.141592
8 INTEGER : : i
9 REAL : : yo
10 REAL : : vo
11 REAL : : v horizontal
12 REAL : : t h e t a
13 REAL : : t t o t a l
14 REAL : : dt
15 REAL, DIMENSION( n ) : : x
16 REAL, DIMENSION( n ) : : y
17 REAL, DIMENSION( n ) : : v v e r t i c a l
18 REAL, DIMENSION( n ) : : t
19
20
21 WRITE( ∗ , ∗ ) ’ A l t u r a i n i c i a l (m) : ’
22 READ( ∗ , ∗ ) yo
23 WRITE( ∗ , ∗ ) ’ V e l o c i d a d i n i c i a l (m/ s ) : ’
24 READ( ∗ , ∗ ) vo
25 WRITE( ∗ , ∗ ) ’ Angulo i n i c i a l ’
26 READ( ∗ , ∗ ) t h e t a
27 t h e t a=t h e t a ∗ ( PI / 1 8 0 )
28
29 WRITE( ∗ , ∗ ) ’ I n t r o d u z c a e l tiempo t o t a l d e l r e c o r r i d o ’
30 READ( ∗ , ∗ ) t t o t a l
31
32 dt=t t o t a l /n
33 v h o r i z o n t a l=vo ∗ c o s ( t h e t a )
34 v v e r t i c a l ( 1 )=vo ∗SIN ( t h e t a )
35
36 OPEN( u n i t =100 , f i l e =’ d a t o s . dat ’ )
37 DO i =1 ,n
38
39 IF ( i ==1) THEN
40 t ( 1 ) =0
41 x ( 1 ) =0
42 y ( 1 )=yo
43 ELSE
44 t ( i )=t ( i −1)+dt
45 v v e r t i c a l ( i )=v v e r t i c a l ( i −1)+g ∗ dt
46
47 x ( i )=x ( i −1)+v h o r i z o n t a l ∗ dt
48 y ( i )=y ( i −1)+v v e r t i c a l ( i −1)∗ dt +(1/2) ∗ g ∗ dt ∗∗2
49 ENDIF
50
51 WRITE( 1 0 0 , 1 5 0 ) t ( i ) , x ( i ) , y ( i )
52 ENDDO
53
54 150 FORMAT( 3 f 8 . 2 )
55
56 CLOSE( 1 0 0 )
57 STOP
58
59 END PROGRAM

18
10.3. Apéndice 3: Derivadas
1 program d e r i v a d a
2
3
4
5 i n t e g e r , p a r a m e t e r : : d i =10
6 r e a l , p a r a m e t e r : : PI =3.1416
7 real : : a ,b
8 r e a l : : dx
9 integer : : i
10 r e a l , dimension ( di ) : : x
11 r e a l , dimension ( di ) : : y
12 r e a l , dimension ( di ) : : yder
13
14
15 a=0
16 b=2∗PI
17 dx=(b−a ) / d i
18
19 open ( u n i t =100 , f i l e =’ d a t s . dat ’ )
20
21 do i =1 , d i
22 i f ( i ==1) then
23 x ( i )=a
24 else
25 x ( i )=x ( i −1)+dx
26 endif
27
28 enddo
29
30 c a l l funcion (x , y)
31
32
33
34
35
36 call d e r i v a t t l ( x , y , dx , y d e r )
37
38
39 do i =1 , d i
40 w r i t e (100 ,200) x ( i ) , y ( i ) , yder ( i )
41 enddo
42
43 200 format (3 f 8 . 2 )
44 cl ose (100)
45
46 end program d e r i v a d a
47
48 c −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
49 subroutine funcion (x , y)
50
51
52 i n t e g e r , p a r a m e t e r : : d i =50
53 r e a l , dimension ( di ) : : x
54 r e a l , dimension ( di ) : : y
55
56 y = sin (x)
57
58
59
60 return
61 end
62
63 c −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

19
64
65 s u b r o u t i n e d e r i v a t t l ( x , y , dx , y d e r )
66
67
68 i n t e g e r , p a r a m e t e r : : d i = 50
69 integer : : i
70 r e a l : : dx
71
72 r e a l , dimension ( di ) : : x
73 r e a l , dimension ( di ) : : y
74 r e a l , dimension ( di ) : : yder
75
76
77 y d e r ( 1 ) =(y ( 2 )−y ( 1 ) ) /dx
78
79 do i =2 , di −1
80 y d e r ( i ) =(y ( i +1)−y ( i −1) ) / ( 2 ∗ dx )
81 enddo
82
83 y d e r ( d i ) =(y ( d i )−y ( di −1) ) /dx
84
85 return
86 end

20
10.4. Apéndice 4: Integración numérica
1 PROGRAM Simpson
2
3 IMPLICIT NONE
4
5 REAL, PARAMETER : : Pi = 3 . 1 4 1 5 9 2
6
7 REAL : : a,b
8 REAL : : Int , Intpar
9 REAL : : dx
10 REAL : : x1 , x2 , xm
11 REAL : : Fx1 , Fx2 , Fxm
12 INTEGER :: i ,n
13
14 a=0
15 b=3∗ p i
16
17 n=20
18 dx=(b−a ) /n
19
20
21 I n t =0
22
23 do i =1 ,n
24 x1=a+( i −1)∗dx
25 x2=x1+dx
26 xm= 0. 5∗( x1+x2 )
27
28 CALL f u n ( Fx1 , x1 )
29 CALL f u n ( Fx2 , x2 )
30 C a l l f u n (Fxm, xm)
31
32 I n t p a r = 1 / 6 . 0 ∗ dx ∗ ( Fx1+4∗Fxm+Fx2 )
33 I n t=I n t + I n t p a r
34 enddo
35
36 Write ( ∗ , ∗ ) I n t
37
38 END PROGRAM
39
40
41
42 SUBROUTINE f u n ( Fx , x )
43
44 REAL Fx , x
45 Fx = x∗ s i n ( x )
46
47 RETURN
48
49 END

21
10.5. Apéndice 5: Ecuaciones diferenciales
1 PROGRAM EDOsegundo
2
3 IMPLICIT NONE
4
5 INTEGER,PARAMETER : : n=50
6 REAL,PARAMETER : : g=−9.81
7 INTEGER : : i
8
9 REAL, DIMENSION( n ) : : y
10 REAL, DIMENSION( n ) : : t
11 REAL : : y1 , y2
12 REAL : : dt
13
14 OPEN( u n i t =100 , f i l e =’ d a t o s S . dat ’ )
15 y1=0
16 y2=3
17 dt =0.1
18 y ( 1 )=y1
19 y ( 2 )=y2
20
21 t ( 1 ) =0
22 t ( 2 )=t ( 1 )+dt
23
24 do i =1 ,n
25
26 IF ( i >2) THEN
27 y ( i ) =2∗y ( i −1)−y ( i −2)+g ∗ dt ∗∗2
28 t ( i )=t ( i −1)+dt
29 ENDIF
30
31 WRITE( 1 0 0 , 1 1 0 ) t ( i ) , y ( i )
32 ENDDO
33
34 110 FORMAT( 2 f 1 0 . 2 )
35 CLOSE( 1 0 0 )
36
37 END PROGRAM

22
10.6. Apéndice 6: Runge-Kutta de 2do orden
1 PROGRAM RungeKutta2
2
3 REAL : : Ti , Vi , Yi
4 INTEGER :: n, i
5 REAL : : dt
6 REAL : : V, Y
7
8 dt =0.1
9 n=50
10 Vi=20
11 V=Vi
12 Ti=0
13 Yi=10
14 Y=Yi
15
16 OPEN( u n i t =100 , f i l e =’ d a t o s . dat ’ )
17
18 WRITE( 1 0 0 , 1 5 0 ) Ti , V, Y
19
20 do i =1 ,n
21 Ti=Ti+dt
22 CALL RK2(V, Ti , Vi , dt )
23
24 CALL RK2V(Y, Ti , Yi , V, dt )
25
26 WRITE( 1 0 0 , 1 5 0 ) Ti , V, Y
27 Vi=V
28 Yi=Y
29
30 enddo
31
32 CLOSE( 1 0 0 )
33
34 150 FORMAT( 3 f 1 0 . 2 )
35
36
37 END PROGRAM
38
39
40 c−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−!
41 c−−−−−−−−−−−−−−−−−−−−−RUNGE KUTTA 2−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−!
42 c−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−!
43 SUBROUTINE RK2( yf , x i , y i , h )
44
45 REAL :: h
46 REAL :: a2
47 REAL :: a1 , p1 , q11
48 REAL :: k1 , k2
49 REAL :: xi , y i
50 REAL :: xk2 , yk2
51
52
53 a2=1/2
54
55 a1=1−a2
56 p1 =1/(2∗ a2 )
57 q11=p1
58
59
60 CALL f u n c i o n ( k1 , x i , y i )
61
62 xk2=x i+p1 ∗h
63 yk2=y i+q11 ∗ k1 ∗h

23
64
65 CALL f u n c i o n ( k2 , xk2 , yk2 )
66
67 y f = y i + ( a1 ∗ k1 + a2 ∗ k2 ) ∗h
68
69 RETURN
70
71 END SUBROUTINE
72
73
74
75 SUBROUTINE RK2V( yf , x i , y i , Vo , h )
76
77 REAL :: h
78 REAL :: a2
79 REAL :: a1 , p1 , q11
80 REAL :: k1 , k2
81 REAL :: x i , y i , Vo
82 REAL :: xk2 , yk2
83
84
85 a2=1/2
86
87 a1=1−a2
88 p1 =1/(2∗ a2 )
89 q11=p1
90
91 k1=Vo
92 K2=Vo
93
94 y f = y i + ( a1 ∗ k1 + a2 ∗ k2 ) ∗h
95
96 RETURN
97
98 END SUBROUTINE
99
100 c−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−!
101 C−−−−−−−−−−−−−−−−−−FUNCION DE LA ODE−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−!
102 c−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−!
103
104 SUBROUTINE f u n c i o n ( fx , x , y )
105
106 REAL : : x , y
107 REAL : : f x
108
109 f x = −9.81
110
111 RETURN
112
113 END SUBROUTINE
114
115 c−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−!
116 c−−−−−−−−−−−−−−−−−−FUNCION: VELOCIDAD−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−!
117 c−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−!
118 SUBROUTINE v e l o c i d a d ( fx , Vo)
119
120 REAL : : Fx , Vo
121
122 Fx = Vo
123
124 RETURN
125
126 END SUBROUTINE

24
10.7. Apéndice 7: Difusión de calor en 1D
1 PROGRAM D i f u s i o n
2
3
4
5 REAL, PARAMETER : : dx =0.1
6 REAL, PARAMETER : : dt =0.2
7 REAL, PARAMETER : : L t o t =1 , Ttot=40
8 INTEGER, PARAMETER : : d i t=Ttot / dt
9 INTEGER, PARAMETER : : d i x=L t o t /dx
10 REAL : : t o
11 REAL : : t f
12 REAL, DIMENSION ( dix , d i t ) : : t
13 INTEGER i
14 INTEGER k
15 REAL : : c
16 real : : j
17
18 c−−−−−−−−−−−−−−CONDICIONES DEL SISTEMA−−−−−−−−c
19 c =0.08
20 t o =20
21 t f =0
22
23 c−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−c
24
25 OPEN( u n i t =100 , f i l e =’ d a t o s D i f u s i o n . dat ’ )
26
27 c−−−−−−−−−−−−−−−−−−CONDICIONES INICIALES−−−−−−c
28 T ( : , 1 ) =5
29 T( 1 , 1 )=t o
30 T( dix , 1 )=t f
31 c−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−c
32
33 c−−−−−SOLUCION A LA ECUACION DE DIFUSION−−−−−c
34 DO K=2 , d i t
35
36 DO i =1 , d i x
37
38 SELECT CASE( i )
39
40 CASE( 1 )
41 T( i , k )=t o
42 ! T( i , k )=T( i , k−1)∗ s i n ( r e a l ( k ) )
43 CASE ( d i x )
44 ! T( i , k )=T( i −1 ,k )
45 T( i , k )=t f
46
47
48 CASE DEFAULT
49
50
51 T( i , k )=t ( i , k−1)+(c ∗ ∗ 2 ) ∗ ( dt /dx ∗ ∗ 2 ) ∗
52 & (T( i +1 ,k−1)−2∗T( i , k−1)+T( i −1 ,k−1) )
53
54 END SELECT
55
56
57 ENDDO
58
59 ENDDO
60
61
62 c
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

25
c
63
64 WRITE( 1 0 0 , 1 5 0 ) T
65
66
67 CLOSE( 1 0 0 )
68 150 FORMAT( 1 0 f 1 0 . 2 )
69
70 END PROGRAM

26
10.8. Apéndice 8: Difusión de calor en 2D
1 PROGRAM D i f u s i o n 2 D
2
3
4 IMPLICIT NONE
5
6 REAL, PARAMETER : : PI =3.141592
7
8 REAL, PARAMETER :: dx =0.05
9 REAL, PARAMETER :: dy =0.05
10 REAL, PARAMETER :: dt =0.2
11 REAL, PARAMETER :: Xtot=2
12 REAL, PARAMETER :: Ytot=4
13 REAL, PARAMETER :: Ttot =300
14
15 REAL, PARAMETER : : Cf =0.055
16 REAL : : Cx , Cy
17 REAL : : Ca
18
19 INTEGER, PARAMETER : : d i x=Xtot /dx
20 INTEGER, PARAMETER : : d i y=Ytot /dy
21 INTEGER, PARAMETER : : d i t=Ttot / dt
22
23 REAL, DIMENSION( dix , d i y ) : : Ti
24 REAL, DIMENSION( dix , d i y ) : : Tf
25 REAL, DIMENSION( dix , d i y ) : : U,V
26
27 INTEGER : : i , j , k , l , uy
28 REAL : : Advx , Advy
29
30
31 INTEGER : : d a t o s
32 CHARACTER( l e n =19) : : nom
33
34 c−−−−−−−−−−−−−−−−−CALCULOS INICIALES−−−−−−−−C
35
36 Cx=(Cf ∗ ∗ 2 ) ∗ ( dt /dx ∗ ∗ 2 )
37 Cy=(Cf ∗ ∗ 2 ) ∗ ( dt /dy ∗ ∗ 2 )
38
39 Ca=0.10
40 c−−−−−−−−−−−−−CONDICIONES INICIALES−−−−−−−−−c
41 !!!!! Temperaturas T( x , y ) en toda l a p l a c a en e l tiemo t=0
42 U ( : , : ) =0
43 V ( : , : ) =0
44 Ti ( : , : ) = 0
45 DO l =35 ,45
46 ! Ti ( 1 , i ) =20
47 Ti ( 2 0 : 2 5 , l ) =20
48 ENDDO
49 ! Ti ( 1 , : ) =20
50 C−−−−−−−−−−−GUARDA CONDICIONES INICIALES−−−−C
51
52 d a t o s=1
53 CALL nombre ( d a t o s , nom)
54
55 OPEN( u n i t =100 , f i l e =nom)
56 WRITE( 1 0 0 , 1 5 0 ) Ti
57 CLOSE( 1 0 0 )
58
59 C−−−−−−APLICACION DE LA ECUACION DE DIFUSION−−−−−−−−C
60 tiempo :DO k=2 , d i t
61 ejeX :DO i =1 , d i x
62
63 SELECT CASE( i )

27
64 CASE( 1 )
65
66 Tf ( i , : ) =Ti ( 1 , : )
67 CASE( d i x )
68 Tf ( i , : ) =Ti ( i , : )
69 CASE DEFAULT
70
71 ejeY :DO j =1 , d i y
72
73 SELECTCASE( j )
74 CASE( 1 )
75 Tf ( i , j )=0
76 ! Tf ( i , j )=Ti ( i , j +1)
77 CASE( d i y )
78 Tf ( i , j )=0
79 ! f ( i , j )=Ti ( i , j −1)
80 CASE DEFAULT
81
82 V ( : , : ) =−c o s ( 2 ∗ PI ∗k / 1 5 0 0 )
83 !U ( : , : ) =c o s ( 2 ∗ PI ∗k / 6 0 0 )
84 Advx=u ( i , j ) ∗ ca ∗ ( Ti ( i +1 , j )−Ti ( i −1 , j ) )
85 Advy=V( i , j ) ∗ ca ∗ ( Ti ( i , j +1)−Ti ( i , j −1) )
86
87
88 Tf ( i , j )=Ti ( i , j )+Cx∗ ( Ti ( i +1 , j ) −2∗Ti ( i , j )+Ti ( i −1 , j ) ) +
89 & Cy∗ ( Ti ( i , j +1)−2∗Ti ( i , j )+Ti ( i , j −1) )
90 ENDSELECT
91
92 ENDDO ejeY
93 ! Tf ( : , 1 )=Tf ( : , 2 )
94 ! Tf ( : , d i y )=Tf ( : , diy −1)
95 ENDSELECT
96
97 ENDDO ejeX
98 !−−−−−−−−−−Guarda l o s d a t o s en un nuevo a r c h i v o −−−−−−−−−−−−−−−c
99
100 DO l =35 ,45
101 ! Ti ( 1 , i ) =20
102 Tf ( 2 0 : 2 5 , l ) =20
103 ENDDO
104 ! cambios :DO l =1 ,29
105
106 ! Tf ( 1 , l )=Tf ( 2 , l )
107 ! Tf (1 ,80 − l )=Tf (2 ,80 − l )
108 !ENDDO cambios
109
110 d a t o s=k
111 CALL nombre ( d a t o s , nom)
112 OPEN( u n i t =100 , f i l e =nom)
113 WRITE( 1 0 0 , 1 5 0 ) Tf
114 CLOSE( 1 0 0 )
115 Ti=Tf
116
117 ENDDO tiempo
118
119 150 format (40 f 7 . 2 )
120 END PROGRAM
121 c−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−c
122 C−−−−−−−−−−−−−−−−−−−−SUBROUTINE: Guardar d a t o s −−−−−−−−−−C
123 c−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−c
124
125
126 SUBROUTINE nombre ( i , nom)
127
128 INTEGER : : i

28
129 CHARACTER( l e n =4) : : i c h a r
130 CHARACTER( l e n =19) : : nom
131
132 200 format ( I4 . 4 )
133 WRITE( i c h a r , 2 0 0 ) i
134
135 nom=’ d a t o s / d a t o s ’ / / i c h a r // ’ . dat ’
136
137 END SUBROUTINE

29
10.9. Apéndice 9: Ecuación de onda en 2D
1 PROGRAM WaveEquation
2
3
4
5 REAL, PARAMETER : : PI = 3 . 1 4 1 5 9 2
6
7 REAL, PARAMETER :: dx = 1
8 REAL, PARAMETER :: dY = 1
9 REAL, PARAMETER :: dt = 0 . 1
10 REAL, PARAMETER :: Lx = 300
11 REAL, PARAMETER :: Ly = 50
12 REAL, PARAMETER :: T = 100
13
14 REAL : : Vx , Vy
15
16
17 INTEGER, PARAMETER : : PunX = Lx/dx
18 INTEGER, PARAMETER : : PunY = Ly/dY
19 INTEGER, PARAMETER : : Tk = T/ dt
20
21 REAL, DIMENSION(PunX , Puny ) : : Ho
22 REAL, DIMENSION(PunX , PunY) : : H1
23 REAL, DIMENSION(PunX , PunY) : : Hf
24
25 INTEGER : : i , j , k
26 REAL : : A1 , A2 , A3
27
28 CHARACTER ( 1 9 ) : : nom
29
30 Vx=10
31 Vy=10
32
33
34
35
36
37 !!−−−−−−−−−−−−−SOLUCION DE LA ECUACION DE ONDA−−−−−−−−−−−−−!!
38
39 DO k=1 , Tk
40 SELECT CASE( k )
41
42 CASE( 1 )
43 Ho ( : , : ) = 0
44
45 CALL nombre ( k , nom)
46 OPEN( u n i t =100 , f i l e =nom)
47 WRITE( 1 0 0 , 1 5 0 ) Ho
48 CLOSE( 1 0 0 )
49
50 CASE( 2 )
51 H1 ( : , : ) = 0
52 H1 ( 1 , : ) = s i n ( 2 ∗ PI ∗ ( k−1) / 1 0 0 )
53
54 CALL nombre ( k , nom)
55 OPEN( u n i t =100 , f i l e =nom)
56 WRITE( 1 0 0 , 1 5 0 ) H1
57 CLOSE( 1 0 0 )
58
59 CASE DEFAULT
60
61 DO i =1 , PunX
62
63 DO j =1 , PunY

30
64
65 SELECT CASE( i )
66
67 CASE( 1 )
68
69 ! IF ( k<=50) then
70 Hf ( i , j ) = s i n ( 2 ∗ PI ∗ ( k−1) / 1 0 0 )
71 ! else
72 ! Hf ( i , j ) = 0
73 ! endif
74 CASE(PunX)
75
76 Hf ( i , j ) = 0
77
78 CASE DEFAULT
79
80 SELECT CASE ( j )
81 CASE( 1 )
82 Hf ( i , j ) = H1( i , j +1)
83 CASE(PunY)
84 Hf ( i , j ) = H1( i , j −1)
85 CASE DEFAULT
86
87 A1=(Vx∗ dt /dx ) ∗ ∗ 2 ∗ (H1( i +1 , j ) ) −2∗H1( i , j )+H1( i −1 , j )
88 A2=(Vy∗ dt /dx ) ∗ ∗ 2 ∗ (H1( i , j +1)−2∗H1( i , j )+H1( i , j −1) )
89 A3=−Ho( i , j ) + 2∗H1( i , j )
90
91 Hf ( i , j )=A1+A2+A3
92
93
94
95 ENDSELECT
96
97 END SELECT
98
99 ENDDO
100
101 ENDDO
102
103 Hf (PunX , : ) =Hf (PunX− 1 , : )
104 Hf ( : , 1 )=Hf ( : , 2 )
105 Hf ( : , PunY)=Hf ( : , PunY−1)
106
107
108 CALL nombre ( k , nom)
109 OPEN( u n i t =100 , f i l e =nom)
110 WRITE( 1 0 0 , 1 5 0 ) Hf
111 CLOSE( 1 0 0 )
112
113
114 Ho=H1
115 H1=Hf
116
117
118
119
120 ENDSELECT
121
122 ENDDO
123
124
125 150 format (300 f 7 . 2 )
126
127 ENDPROGRAM
128

31
129
130
131
132
133
134 SUBROUTINE nombre ( i , nom)
135
136 INTEGER : : i
137 CHARACTER( l e n =4) : : i c h a r
138 CHARACTER( l e n =19) : : nom
139
140 200 format ( I4 . 4 )
141 WRITE( i c h a r , 2 0 0 ) i
142
143 nom=’ d a t o s / d a t o s ’ / / i c h a r // ’ . dat ’
144
145 END SUBROUTINE

32

Вам также может понравиться