Ejercicio: 2Eva_IIT2019_T3 EDP elíptica, placa en (1,1)
dada la ecuación del problema:
\frac{\delta ^2 u}{\delta x^2} + \frac{\delta ^2 u}{\delta y^2} = \frac{x}{y} + \frac{y}{x}1 < x < 2
1 < y < 2
Se convierte a la versión discreta usando diferencias divididas centradas:
\frac{u[i-1,j]-2u[i,j]+u[i+1,j]}{\Delta x^2} + + \frac{u[i,j-1]-2u[i,j]+u[i,j+1]}{\Delta y^2} = \frac{x_i}{y_j} + \frac{y_j}{x_i}
Se agrupan los términos Δx, Δy semejante a formar un λ al multiplicar todo por Δy2
\frac{\Delta y^2}{\Delta x^2}\Big(u[i-1,j]-2u[i,j]+u[i+1,j] \Big) + + \frac{\Delta y^2}{\Delta y^2}\Big(u[i,j-1]-2u[i,j]+u[i,j+1]\Big) = =\Delta y^2\Big( \frac{x_i}{y_j} + \frac{y_j}{x_i}\Big)los tamaños de paso en ambos ejes son de igual valor, se simplifica la ecuación
\lambda= \frac{\Delta y^2}{\Delta x^2} = 1u[i-1,j]-2u[i,j]+u[i+1,j] + + u[i,j-1]-2u[i,j]+u[i,j+1] = =\Delta y^2\Big( \frac{x_i}{y_j} + \frac{y_j}{x_i}\Big)
u[i-1,j]-4u[i,j]+u[i+1,j] + + u[i,j-1]+u[i,j+1] =\Delta y^2\Big( \frac{x_i}{y_j} + \frac{y_j}{x_i}\Big)
Iteraciones
que permite plantear las ecuaciones para cada punto en posición [i,j]
i=1, j=1
u[0,1]-4u[1,1]+u[2,1] + + u[1,0]+u[1,2] =(0.25)^2\Big( \frac{0.25}{0.25} + \frac{0.25}{0.25}\Big) 0.25ln(0.25)-4u[1,1]+u[2,1] + + 0.25ln(0.25)+u[1,2] = 0.125 -4u[1,1]+u[2,1] +u[1,2] = 0.125 - 2(0.25)ln(0.25) -4u[1,1]+u[2,1] +u[1,2] = 0.8181i=2, j=1
u[1,1]-4u[2,1]+u[3,1]+ +0.5 ln(0.5)+u[2,2]=0.15625 u[1,1]-4u[2,1]+u[3,1]+u[2,2]=0.15625-0.5 ln(0.5) u[1,1]-4u[2,1]+u[3,1]+u[2,2]=0.8493i=3, j=1
u[2,1]-4u[3,1]+u[4,1] + + u[3,0]+u[3,2] =(0.25)^2\Big( \frac{0.75}{0.25} + \frac{0.25}{0.75}\Big) u[2,1]-4u[3,1]+u[4,1]+u[3,2] = 0.20833333-0.75 ln(0.75) u[2,1]-4u[3,1]+u[4,1]+u[3,2] =0.4240Tarea: continuar con el ejercicio hasta plantear todo el sistema de ecuaciones.
A = np.array([ [-4, 1, 0, 1, 0, 0, 0, 0, 0], [ 1,-4, 1, 0, 1, 0, 0, 0, 0], [ 0, 1,-4, 0, 0, 1, 0, 0, 0], [ 1, 0, 0,-4, 1, 0, 1, 0, 0], [ 0, 1, 0, 1,-4, 1, 0, 1, 0], [ 0, 0, 1, 0, 1,-4, 0, 0, 1], [ 0, 0, 0, 1, 0, 0,-4, 1, 0], [ 0, 0, 0, 0, 1, 0, 1,-4, 1], [ 0, 0, 0, 0, 0, 1, 0, 1,-4]]) B = np.array( [0.125 - 2(0.25)ln(0.25), 0.15625 - 0.5ln(0.5), 0.20833 - 0.75 ln(0.75), ...]) B = [0.8181, 0.8493, 0.4240, ...]
Algoritmo con Python
Con valores para la matriz solución:
iteraciones: 15 error entre iteraciones: 6.772297286980838e-05 solución para u: [[0. 0.2789294 0.6081976 0.9793276 1.3862943] [0.2789294 0.6978116 1.1792239 1.7127402 2.2907268] [0.6081976 1.1792239 1.8252746 2.5338403 3.2958368] [0.9793276 1.7127402 2.5338403 3.4280053 4.3846703] [1.3862943 2.2907268 3.2958368 4.3846703 5.5451774]] >>>
y algoritmo detallado:
# 2Eva_IIT2019_T2 EDO, problema de valor inicial # método iterativo import numpy as np # INGRESO # longitud en x a = 1 b = 2 # longitud en y c = 1 d = 2 # tamaño de paso dx = 0.25 dy = 0.25 # funciones en los bordes de la placa abajo = lambda x,y: x*np.log(x) arriba = lambda x,y: x*np.log(4*(x**2)) izquierda = lambda x,y: y*np.log(y) derecha = lambda x,y: 2*y*np.log(2*y) # función de la ecuación fxy = lambda x,y: x/y + y/x # control de iteraciones maxitera = 100 tolera = 0.0001 # PROCEDIMIENTO # tamaño de la matriz n = int((b-a)/dx)+1 m = int((d-c)/dy)+1 # vectores con valore de ejes xi = np.linspace(a,b,n) yj = np.linspace(c,d,m) # matriz de puntos muestra u = np.zeros(shape=(n,m),dtype=float) # valores en los bordes u[:,0] = abajo(xi,yj[0]) u[:,m-1] = arriba(xi,yj[m-1]) u[0,:] = izquierda(xi[0],yj) u[n-1,:] = derecha(xi[n-1],yj) # valores interiores la mitad en intervalo x, # mitad en intervalo y, para menos iteraciones mx = int(n/2) my = int(m/2) promedio = (u[mx,0]+u[mx,m-1]+u[0,my]+u[n-1,my])/4 u[1:n-1,1:m-1] = promedio # método iterativo itera = 0 converge = 0 while not(itera>=maxitera or converge==1): itera = itera +1 # copia u para calcular errores entre iteraciones nueva = np.copy(u) for i in range(1,n-1): for j in range(1,m-1): # usar fórmula desarrollada para algoritmo fij = (dy**2)*fxy(xi[i],yj[j]) u[i,j]=(u[i-1,j]+u[i+1,j]+u[i,j-1]+u[i,j+1]-fij)/4 diferencia = nueva-u erroru = np.linalg.norm(np.abs(diferencia)) if (erroru<tolera): converge=1 # SALIDA print('iteraciones: ',itera) print('error entre iteraciones: ',erroru) print('solución para u: ') print(u) # Gráfica import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d import Axes3D # matrices de ejes para la gráfica 3D X, Y = np.meshgrid(xi, yj) U = np.transpose(u) # ajuste de índices fila es x figura = plt.figure() grafica = Axes3D(figura) grafica.plot_surface(X, Y, U, rstride=1, cstride=1, cmap=cm.Reds) plt.title('EDP elíptica') plt.xlabel('x') plt.ylabel('y') plt.show()