Está en la página 1de 20

TRABAJO N°1 DE MODELACION NUMERICA

Método de diferencias finitas

JESUS RAMON SANCHEZ DURAN


CC. 1´090.391.696 de Cúcuta

PROFESOR:
Daniel López De Mesa Aguilar

ING. CIVIL

MAESTRÍA EN INGENIERÍA CIVIL/ENFASIS EN PROFUNDIZACION EN GEOTÉCNIA

UNIVERSIDAD DE MEDELLÍN

2020
Punto 1. Presente un código en el que genere un vector con los números del 1 al 6. Guarde
en una variable la sumatoria de todos los elementos del vector. El código debe funcionar
para cualquier vector de cualquier magnitud.

Código:
Created on Wed Sep 30 14:15:22 2020
@author: JR SANCHEZ
"""
import numpy as np
vector=np.linspace(1,6,6)
suma=0
for i in vector:
suma=suma+i
print(suma)

Consola:
runfile('D:/USUARIO/Escritorio/Modelacion Numerica/Ejercicio del Trabajo_1/Ejercicio
for.py', wdir='D:/USUARIO/Escritorio/Modelacion Numerica/Ejercicio del Trabajo_1')
1.0
3.0
6.0
10.0
15.0
21.0
Punto 2. Presenta el código para generar la gráfica y la gráfica de la función e x, tal que el
resultado sea igual al de la diapositiva de clases.
Código:
# -*- coding: utf-8 -*-
"""
Created on Wed Oct 07 5:40:29 2020
@author: JR SANCHEZ
"""
import numpy as np
import matplotlib.pyplot as pl
import math
fig = pl.figure(figsize=(4.8,5.0)) # Se genera la ventana para la figura con dimensiones 4.8 x 5.0
fig.patch.set_facecolor('w') # El fondo de la figura queda de color blanco
# Definición de funciones.
def f1(x):
return math.exp(x)
# Valores del eje x que toma el gráfico.
x = np.linspace(-5,5,100)
# Gráfica.
pl.plot(x, [f1(i) for i in x], marker = '.', linestyle='-', color='r', linewidth = 0.5, label = '$f(x)=e^{x}$') #
características de la gráfica de la función
pl.xlabel('$x$', fontsize = 8) # características del título del eje "x"
pl.ylabel('$f(x)$', fontsize = 8) # características del título del eje "y"
pl.axis([-5, 5, 0, 150]) # Límites del eje "x" y del eje "y"
pl.xticks(np.arange(-5, 5.5,1)) # Delta del eje "x"
pl.yticks(np.arange(0, 151, 10)) # Delta del eje "y"
pl.grid(True) # Activar la grilla o cuadrícula de fondo
pl.legend(loc = 1, fontsize = 8) # Activar la visualización de la leyenda de una gráfica
pl.tick_params(axis='both', which='major', labelsize= 8) # Tamaño de los números de los ejes
fig.tight_layout() # Extiende bien la figura en la ventana
pl.show() # Para mostrar la figura

Consola:
Punto 3. Graficar la función ex y su expansión en series de Taylor. Presente un análisis de
sensibilidad en Word en función del número de términos de la serie de Taylor.

Código:
# -*- coding: utf-8 -*-
"""
# ECUACION DE LA EXPANSION DE TAYLOR
Created on Wed Oct 10 16:05:55 2020
@author: JR SANCHEZ
"""
import numpy as np
import matplotlib.pyplot as pl
import math
fig = pl.figure(figsize=(4.8,5.0)) # Se genera la ventana para la figura con dimensiones 4.8 x 5.0
fig.patch.set_facecolor('w') # El fondo de la figura queda de color blanco
# Definición de funciones.
def f1(x):
return math.exp(x)
#valores de a
a=0
def f2(x):
return math.exp(a)*((1+(x-a)/1)+((x-a)**2/(2*1))+((x-a)**3/(3*2*1))+((x-a)**4/(4*3*2*1))+((x-
a)**5/(5*3*2*1))+((x-a)**6/(6*5*4*3*2*1)))
def f3(x):
return math.exp(a)*((1+(x-a)/1)+((x-a)**2/(2*1))+((x-a)**3/(3*2*1))+((x-a)**4/(4*3*2*1))+((x-
a)**5/(5*3*2*1)))
def f4(x):
return math.exp(a)*((1+(x-a)/1)+((x-a)**2/(2*1))+((x-a)**3/(3*2*1))+((x-a)**4/(4*3*2*1)))
def f5(x):
return math.exp(a)*((1+(x-a)/1)+((x-a)**2/(2*1))+((x-a)**3/(3*2*1)))
def f6(x):
return math.exp(a)*((1+(x-a)/1)+((x-a)**2/(2*1)))
def f7(x):
return math.exp(a)*((1+(x-a)/1))
# Valores del eje x que toma el gráfico.
x = np.linspace(-6,6,200)
# Gráfica f1 (diapositiva 13).
pl.plot(x, [f1(i) for i in x], marker = 'x', linestyle='-', color='k', linewidth = 1.7, label = '$f(x)=e^{x}$') #
características de la gráfica de la función
pl.plot(x, [f2(i) for i in x], marker = 'x', linestyle='-', color='r', linewidth = 1.7, label = '$f(x)=Taylor(6)$') #
características de la gráfica de la función
pl.plot(x, [f3(i) for i in x], marker = 'x', linestyle='-', color='b', linewidth = 1.7, label = '$f(x)=Taylor(5)$') #
características de la gráfica de la función
pl.plot(x, [f4(i) for i in x], marker = 'x', linestyle='-', color='y', linewidth = 1.7, label = '$f(x)=Taylor(4)$') #
características de la gráfica de la función
pl.plot(x, [f5(i) for i in x], marker = 'X', linestyle='-', color='m', linewidth = 1.7, label = '$f(x)=Taylor(3)$') #
características de la gráfica de la función
pl.plot(x, [f6(i) for i in x], marker = 'x', linestyle='-', color='g', linewidth = 1.7, label = '$f(x)=Taylor(2)$') #
características de la gráfica de la función
pl.plot(x, [f7(i) for i in x], marker = 'x', linestyle='-', color='c', linewidth = 1.7, label = '$f(x)=Taylor(1)$') #
características de la gráfica de la función
pl.xlabel('$x$', fontsize = 8) # características del título del eje "x"
pl.ylabel('$f(x)$', fontsize = 8) # características del título del eje "y"
pl.axis([-7, 7, 0, 150]) # Límites del eje "x" y del eje "y"
pl.xticks(np.arange(-7, 7.1, 1)) # Delta del eje "x"
pl.yticks(np.arange(-150, 150, 10)) # Delta del eje "y"
pl.grid(True) # Activar la grilla o cuadrícula de fondo
pl.legend(loc = 2, fontsize = 8) # Activar la visualización de la leyenda de una gráfica
pl.tick_params(axis='both', which='major', labelsize=8) # Tamaño de los números de los ejes
fig.tight_layout() # Extiende bien la figura en la ventana
pl.show() # Para mostrar la figura
# Definición de funciones.
def f1(x):
return math.exp(x)
#a=1
a=3
def f2(x):
return math.exp(a)*((1+(x-a)/1)+((x-a)**2/(2*1))+((x-a)**3/(3*2*1))+((x-a)**4/(4*3*2*1))+((x-
a)**5/(5*3*2*1))+((x-a)**6/(6*5*4*3*2*1)))
def f3(x):
return math.exp(a)*((1+(x-a)/1)+((x-a)**2/(2*1))+((x-a)**3/(3*2*1))+((x-a)**4/(4*3*2*1))+((x-
a)**5/(5*3*2*1)))
def f4(x):
return math.exp(a)*((1+(x-a)/1)+((x-a)**2/(2*1))+((x-a)**3/(3*2*1))+((x-a)**4/(4*3*2*1)))
def f5(x):
return math.exp(a)*((1+(x-a)/1)+((x-a)**2/(2*1))+((x-a)**3/(3*2*1)))
def f6(x):
return math.exp(a)*((1+(x-a)/1)+((x-a)**2/(2*1)))
def f7(x):
return math.exp(a)*((1+(x-a)/1))
# Valores del eje x que toma el gráfico.
x = np.linspace(-6,6,200)
# Gráfica f1 (diapositiva 13).
pl.plot(x, [f1(i) for i in x], marker = '+', linestyle='-', color='k', linewidth = 1.7, label = '$f(x)=e^{x}$') #
características de la gráfica de la función
pl.plot(x, [f2(i) for i in x], marker = '+', linestyle='-', color='r', linewidth = 1.7, label = '$f(x)=Taylor(6)$') #
características de la gráfica de la función
pl.plot(x, [f3(i) for i in x], marker = '+', linestyle='-', color='b', linewidth = 1.7, label = '$f(x)=Taylor(5)$') #
características de la gráfica de la función
pl.plot(x, [f4(i) for i in x], marker = '+', linestyle='-', color='y', linewidth = 1.7, label = '$f(x)=Taylor(4)$') #
características de la gráfica de la función
pl.plot(x, [f5(i) for i in x], marker = '+', linestyle='-', color='m', linewidth = 1.7, label = '$f(x)=Taylor(3)$') #
características de la gráfica de la función
pl.plot(x, [f6(i) for i in x], marker = '+', linestyle='-', color='g', linewidth = 1.7, label = '$f(x)=Taylor(2)$') #
características de la gráfica de la función
pl.plot(x, [f7(i) for i in x], marker = '+', linestyle='-', color='c', linewidth = 1.7, label = '$f(x)=Taylor(1)$') #
características de la gráfica de la función
pl.xlabel('$x$', fontsize = 8) # características del título del eje "x"
pl.ylabel('$f(x)$', fontsize = 8) # características del título del eje "y"
pl.axis([-7, 7, 0, 150]) # Límites del eje "x" y del eje "y"
pl.xticks(np.arange(-7, 7.1, 1)) # Delta del eje "x"
pl.yticks(np.arange(-150, 150, 10)) # Delta del eje "y"
pl.grid(True) # Activar la grilla o cuadrícula de fondo
pl.legend(loc = 2, fontsize = 8) # Activar la visualización de la leyenda de una gráfica
pl.tick_params(axis='both', which='major', labelsize=8) # Tamaño de los números de los ejes
fig.tight_layout() # Extiende bien la figura en la ventana
pl.show() # Para mostrar la figura
Análisis:
En la expansión de la serie de taylor se tiene que cada valor de a, se tiene el siguiente análisis
Para a=0, considerando que la primera deriva de f(x) =e x es f´(x) = ex , entonces ….fn (x)=1.
Por lo que la expansión a 6 términos de la serie de Taylor tendríamos:
1 1 1 1 1 1
𝑒0 = 1 + + + + + + … = 2.718055556
1! 2! 3! 4! 5! 6!
Valor analítico de 𝑒 = 2.718281828
Vemos que la convergencia es casi completa cuando a=0 (e0=1) para los polinomios de
grado 3,4,5 y 6 sobre el eje y =1.

Según la gráfica, ara a= 3, efectivamente la solución analítica y las expansiones de la serie


de Taylor coinciden en x=3, mostrando que las curvas de polinomios 5 y 6 se ajusten
convergen mejor respecto a la curva analítica. En conclusión, A medida que aumenta el
grado del polinomio de la serie de taylor, se aproxima a la mejor a la función.

Punto 4. Soluciona el problema del vertimiento de sodio.

La red mostrada descarga al río una concentración de sodio de 0.07𝑘𝑔/𝑚3. Una comisión
enviada al sitio tomó una muestra de agua en el punto 𝐿, a 200 𝑚 de distancia, y la
concentración de 𝑁𝑎 en el laboratorio fue 0.04𝑘𝑔/𝑚^3. Una bocatoma, por motivos de
cercanía al pueblo, debe construirse lo más cerca posible al punto 0. Si se sabe que el agua
se considera potable para ∅≤0.05𝑘𝑔/𝑚3, ¿a qué distancia mínima del punto 0 se puede
construir la bocatoma? La velocidad media del río es 0.01 𝑚/𝑠, y el coeficiente de
difusividad molecular del sodio. en el agua es Γ=1.33m2/s
Solución: Lógica programada:
4.1 ¿a qué distancia mínima del punto 0 se puede construir la bocatoma?
De acuerdo con la solución analítica y conociendo que el agua se considera potable con una
concentración Φ ≤ 0.05 kg/m3, a una distancia como mínima de 158 a 160 m desde el punto
0. Ver gráfico de solución analítica.

4.2 Resuelva con CDS y con BDS, compare y analice.


La grafica anterior muestra la curva con de la función analíticas con cada la función de cada
uno de los métodos del sistema de Diferencia central (CDS) y Backward (BDS).

Para un Φ ≤ 0.05 kg/m3 se tienen la distancia mínima de construcción de la bocatoma:

Metodología Distancia (m)


Analítico 159
CDS 152
BDS 168

Se presentan las soluciones obtenidas que la metodología BDS, a diferencia del enfoque de
la metodología CDS, aporta una solución que no converge adecuadamente, generando
severas diferencias en cuanto a la posición de la bocatoma desde el punto 0. El enfoque
central se ajusta más a la solución analítica desarrollada.

Código CDS:

Código BDS:
4.3 Resuelva con varios números de nodos, compare y analice.

Se corre la programación con diferentes valores de nodos, que para la lógica del código está
declarado como variable n:

n 200
Metodología Distancia (m)
Analítico 159
CDS 151
BDS 168

n 100
Metodología Distancia (m)
Analítico 160
CDS 155
BDS 172
n 10
Metodología Distancia (m)
Analítico 160
CDS 158
BDS 172

n 2
Metodología Distancia (m)
Analítico 132
CDS 132
BDS 132

De las gráficas anteriores expuestas, se puede concluir que al disminuir (arranca 200
termina 2) el número de nodos (variable n del código) la solución para cada esquema o
metodología, incluyendo la solución analítica que está en función de n en el código, adoptan
una tendencia lineal, alejándose un poco de la solución real que representa la ecuación de
transporte. Vemos que para n=2 las tendencias son 3 líneas rectas casi paralelas. Como la
solución ingenieril del problema planteada es a que distancia del punto de vertimiento o 0
se puede construir la bocatoma, se recomendaría usar el n de mallas más fina (depende de
la capacidad del equipo donde se programe) y buscar realmente la concentración máxima
permitida de 0.05 kg/m3.

4.4 Realice un análisis de sensibilidad con la velocidad del río y el coeficiente de difusividad.

Se tiene inicialmente que la velocidad u=0.01 y y coeficiente difusividad gama=1.33,


propone realizar un valor doble y medio del valor actual para velocidad y el coeficiente. Se
tiene los siguientes resultados:

Condición inicial:
gama 1.33
u 0.01
n 200
Metodología Distancia (m)
Analítico 159
CDS 151
BDS 168

I. Doblando velocidad:

gama 1.33
u 0.02
n 200
Metodología Distancia (m)
Analítico 175
CDS 169
BDS 185
II. Reduciendo al 50% la velocidad:

gama 1.33
u 0.005
n 200
Metodología Distancia (m)
Analítico 148
CDS 137
BDS 154

III. Aumentando la difusividad a 2 con velocidad original:

gama 2.00
u 0.01
n 200
Metodología Distancia (m)
Analítico 155
CDS 140
BDS 180
IV. bajando la difusividad a 0.65 (mitad) con velocidad original:

gama 0.65
u 0.01
n 200
Metodología Distancia (m)
Analítico 175
CDS 170
BDS 150

Del anterior conjunto de graficas se puede concluir que a mayor velocidad del rio, la
concentración de sodio incrementa su dispersión, por lo que el punto para construir la
bocatoma se ira alejando cada vez más del punto 0, se puede observar los valores tabulados
en cada gráfica. Respecto al coeficiente difusividad se observa que el esquema backward
“BDS” incide mayormente con variabilidad de este valor, lo que se puede ver que es un
término que se repite en el desarrollo en la solución de la ecuación del sistema backward.

4.5 En el código de python, en cada paso de cálculo muestre el residual y defina un criterio
de convergencia.

Inicialmente se desarrolló un código en Python utilizando el esquema central (CDS), Se


partió de la siguiente ecuación que se solución de la ecuación diferencial inicial:

Se declaran las variables de acuerdo al problema dado corresponden a la ecuación


despejada, donde u es la velocidad, gama el coeficiente de difusividad (r), L la longitud a la
cual fue tomada la muestra, n el número de nodos de la malla para el análisis y se usa la
función len () para que devuelva el número de elementos del vector definido.

Se propone en el código ciclo para actualizar y recorrer todas las posiciones del vector
creado inicialmente, utilizando la función del CDS. Se aplica el criterio de convergencia de
Gauss-Seidel, a partir de un residual definido por:

1 𝑢∆𝑥 𝛷𝑖+1 − 𝛷𝑖−1


𝑅𝑒𝑠 = ∑ |𝑄𝑝 − [𝛷 + ( ) [ ( ) − 𝛷𝑖+1 − 𝛷𝑖−1 ]]|
2 𝛾 2
𝑛
∆𝑥 = 𝐿/𝑙𝑒𝑛(𝑣𝑒𝑐𝑡𝑜𝑟)
El vector converge bajo la condición:
Residual/Fφ<0.001

Donde Fφ (F) corresponde a un valor de concentración definido a criterio que para este caso
corresponde a una concentración mínima dentro del rango para poder hacer la bocatoma.

El esquema Backward se parte de la siguiente ecuación deducida:


En el residual para que tenga convergencia el vector para el esquema SDB, este definido
por:
𝑢∆𝑥
𝛷𝑖+1 + 𝛷𝑖−1 + ( ) 𝛷𝑖−1
𝛾
𝑅𝑒𝑠 = ∑ |𝑄𝑝 − [𝛷𝑖 − ]|
𝑢∆𝑥
𝑛 ( 𝛾 + 2)
∆𝑥 = 𝐿/𝑙𝑒𝑛(𝑣𝑒𝑐𝑡𝑜𝑟)
El vector converge bajo la condición:
Residual/Fφ<0.001

También podría gustarte