Ejercicio: 2Eva_IIT2017_T3 EDP parabólica con diferencias regresivas
Las diferencias finitas requidas en el enunciado son:
La indicación de regresiva es para la primera derivada, dependiente de tiempo t.
que al reemplazar en la ecuación sin el término de error, se convierte a.
Se reordenan los términos de forma semejante al modelo planteado en el método básico:
Se simplifica haciendo que haciendo
Cambiando la nomenclatura con solo los índices para las variables x y t, ordenando en forma ascendente los índices previo a crear el algoritmo.
Se reordena la ecuación como modelo para el sistema de ecuaciones.
Se calculan los valores constantes:
λ = dt/(16*dx2) = 0.05/[16*(1/3)2] = 0.028125 P = λ = 0.028125 Q = (-1-2λ) = (1-2*0.028125) = -1.05625 R = λ = 0.028125
Usando las condiciones del problema:
U(0,t) = U(1,t) = 0, entonces, Ta = 0, Tb = 0
Para los valores de la barra iniciales se debe usar un vector calculado como 2sin(π x) en cada valor de xi espaciados por hx = 1/3, x entre [0,1]
xi = [0,1/3, 2/3, 1] U[xi,0] = [2sin (0*π), 2sin(π/3), 2sin(2π/3), 2sin(π)] U[xi,0] = [0, 2sin(π/3), 2sin(2π/3), 0] U[xi,0] = [0, 1.732050, 1.732050, 0]
Con lo que se puede plantear las ecuaciones:
j=1: i=1
0.028125 U(0,1) + (-1.05625) U(1,1) + 0.028125 U(2,1) = -U(1,0)
j=1: i=2
0.028125 U(1,1) + (-1.05625) U(2,1) + 0.028125 U(3,1) = -U(2,0)
y reemplazando los valores de la malla conocidos:
0.028125 (0) – 1.05625 U(1,1) + 0.028125 U(2,1) = -1.732050
0.028125 U(1,1) – 1.05625 U(2,1) + 0.028125 (0) = -1.732050
hay que resolver el sistema de ecuaciones:
-1.05625 U(1,1) + 0.028125 U(2,1) = -1.732050 0.028125 U(1,1) - 1.05625 U(2,1) = -1.732050 A = [[-1.05625 , 0.028125], [ 0.028125, -1.05625 ]] B = [-1.732050,-1.732050] que resuelta con un método numérico: [ 1.68, 1.68]
Por lo que la solución para una gráfica, con los índices de (fila,columna) como (t,x):
U = [[0, 1.732050, 1.732050, 0], [0, 1.680000, 1,680000, 0]]
El error del procedimiento, tal como fué planteado es del orden de O(Δt) y O(Δx2), o error de truncamiento E = O(Δx2) + O(Δt). Δt debe ser menor que Δx en aproximadamente un orden de magnitud
Usando algoritmo en python.
Usando lo resuelto en clase y laboratorio, se comprueba la solución con el algoritmo, con hx y ht mas pequeños y más iteraciones:
# EDP parabólicas d2u/dx2 = K du/dt # método implícito # Referencia: Chapra 30.3 p.895 pdf.917 # Rodriguez 10.2.5 p.417 import numpy as np import matplotlib.pyplot as plt # INGRESO # Valores de frontera Ta = 0 Tb = 0 # longitud en x a = 0 b = 1 # Constante K K = 16 # Tamaño de paso dx = 0.1 dt = 0.01 # temperatura en barra tempbarra = lambda x: 2*np.sin(np.pi*x) # iteraciones n = 100 # PROCEDIMIENTO # Valores de x xi = np.arange(a,b+dx,dx) m = len(xi) # Resultados en tabla de u u = np.zeros(shape=(m,n), dtype=float) # valores iniciales de u j=0 u[0,j] = Ta for i in range(1,m-1,1): u[i,j] = tempbarra(xi[i]) u[m-1,j] = Tb # factores P,Q,R lamb = dt/(K*dx**2) P = lamb Q = -1 -2*lamb R = lamb vector = np.array([P,Q,R]) tvector = len(vector) # Calcula U para cada tiempo + dt j=1 while not(j>=n): u[0,j] = Ta u[m-1,j] = Tb # Matriz de ecuaciones tamano = m-2 A = np.zeros(shape=(tamano,tamano), dtype = float) B = np.zeros(tamano, dtype = float) for f in range(0,tamano,1): for c in range(0,tvector,1): c1 = f+c-1 if(c1>=0 and c1<tamano): A[f,c1] = vector[c] B[f] = -u[f+1,j-1] B[0] = B[0]-P*u[0,j] B[tamano-1] = B[tamano-1]-R*u[m-1,j] # Resuelve sistema de ecuaciones C = np.linalg.solve(A, B) # copia resultados a u[i,j] for f in range(0,tamano,1): u[f+1,j] = C[f] j=j+1 # siguiente iteración # SALIDA print('Tabla de resultados') np.set_printoptions(precision=2) print(u) # Gráfica salto = int(n/10) if (salto == 0): salto = 1 for j in range(0,n,salto): vector = u[:,j] plt.plot(xi,vector) plt.plot(xi,vector, '.m') plt.xlabel('x[i]') plt.ylabel('t[j]') plt.title('Solución EDP parabólica') plt.show()