Ejercicio: 1Eva_2024PAOI_T2 Temperatura en nodos de placa cuadrada
literal a
El planteamiento de las ecuaciones según se cita en la solución iterativa es el promedio de los nodos adjacentes:
a = \frac{100+40+b+c}{4} b = \frac{40+20+a+d}{4} c = \frac{100+80+a+d}{4} d = \frac{80+20+c+b}{4}reordenando las ecuaciones para su forma maticial:
4a -b -c = 100+40 4b -a -d= 40+20 4c -a -d= 100+80 4d -c -b= 80+20literal b
la forma matricial del sistema de ecuaciones es:
\begin{bmatrix} 4 & -1 &-1 & 0 \\ -1 & 4 & 0 &-1 \\ -1 & 0 & 4 &-1 \\ 0 & -1 &-1 & 4 \end{bmatrix} \begin{bmatrix} a \\ b \\ c \\ d \end{bmatrix} = \begin{bmatrix} 140 \\ 60 \\ 180 \\ 100 \end{bmatrix}matriz aumentada:
\left[ \begin{array} {cccc|c} 4 & -1 &-1 & 0 & 140\\ -1 & 4 & 0 &-1 & 60 \\ -1 & 0 & 4 &-1 & 180 \\ 0 & -1 &-1 & 4 & 100 \end{array}\right]al revisar el procedimiento de pivoteo parcial por filas se muestra que ya se encuentra pivoteada la matriz. Por lo que no es necesario realizar cambios en las filas.
literal c
Las expresiones a partir de la matriz aumentada y pivoteada para usar en un método iterativo como Gauss-Seidel son:
a = 0.25(b+c+140) b = 0.25*(a+d+60) c = 0.25(a+d+180) d = 0.25(c+b+100)el vector inicial debe considerar que las temperaturas serán medias entre los bordes de la placa
X0 = [ (100+40)/2, (40+20)/2, (100+80)/2, (80+20)/2 ]
X0 = [ 70, 30, 90, 50 ]
literal d iteraciones
itera = 0
a = 0.25(30+90+140)= 65
b = 0.25*(65+50+60) = 43.75
c = 0.25(65+50+180) = 73.75
d = 0.25(73.75+43.75+100) = 54.375
error = max|[65-70, 43.75-30, 73.75-90, 54.375-50]|
error = max|[ -5, 13.75, -16.25, 4.375| = 16.25
X1 = [ 65, 43.75, 73.75, 54.375 ]
itera = 1
a = 0.25(43.75+73.75+140)= 64.375
b = 0.25*(64.375+54.375+60) = 44.687
c = 0.25(64.375+54.375+180) = 74.687
d = 0.25(74.687+44.687+100) = 54.843
error = max|[64.375-65, 44.687-43.75, 74.687-73.75, 54.843-54.375]|
error = max|[-0.625, 0.937, 0.937, 0.468| = 0.937
X2 = [ 64.375, 44.687, 74.687, 54.843 ]
itera = 2
a = 0.25(44.687+74.687+140)= 64.843
b = 0.25*(64.843 +54.843+60) = 44.921
c = 0.25(64.843+54.843+180) = 74.921
d = 0.25(74.921+44.921+100) = 54.960
error = max|[64.843-64.375, 44.921-44.687, 74.921-74.687, 54.960-54.843]|
error = max|[0.468, 0.234, 0.234, 0.117| = 0.468
X3 = [ 64.843, 44.921, 74.921, 54.960 ]
literal e
El método converge pues los errores en cada iteración disminuyen. Los valores obtenidos en el resultado son acorde a las temperaturas esperadas en los nodos.
Algoritmos con Python
Los resultados obtenidos son:
X 0 = [65. 43.75 73.75 54.375] X 1 = [64.375 44.6875 74.6875 54.84375] X 2 = [64.84375 44.921875 74.921875 54.9609375] X 3 = [64.9609375 44.98046875 74.98046875 54.99023438] X 4 = [64.99023438 44.99511719 74.99511719 54.99755859] X 5 = [64.99755859 44.9987793 74.9987793 54.99938965] X 6 = [64.99938965 44.99969482 74.99969482 54.99984741] X 7 = [64.99984741 44.99992371 74.99992371 54.99996185] X 8 = [64.99996185 44.99998093 74.99998093 54.99999046] X 9 = [64.99999046 44.99999523 74.99999523 54.99999762] respuesta X: [[64.99999046] [44.99999523] [74.99999523] [54.99999762]] verificar A.X=B: [[139.99997139] [ 59.99999285] [179.99999285] [100. ]] >>>
el algoritmo usado es:
# 1Eva_2024PAOI_T2 Temperatura en nodos de placa cuadrada # Método de Gauss-Seidel import numpy as np # INGRESO A = np.array([[4,-1,-1,0], [-1,4,0,-1], [-1,0,4,-1], [0,-1,-1,4]],dtype=float) B = np.array([140,60,180,100],dtype=float) X0 = np.array([70,30,90,50],dtype=float) tolera = 0.0001 iteramax = 100 # PROCEDIMIENTO # Gauss-Seidel tamano = np.shape(A) n = tamano[0] m = tamano[1] # valores iniciales X = np.copy(X0) diferencia = np.ones(n, dtype=float) errado = 2*tolera itera = 0 while not(errado<=tolera or itera>iteramax): # por fila for i in range(0,n,1): # por columna suma = 0 for j in range(0,m,1): # excepto diagonal de A if (i!=j): suma = suma-A[i,j]*X[j] nuevo = (B[i]+suma)/A[i,i] diferencia[i] = np.abs(nuevo-X[i]) X[i] = nuevo print('X',itera,'=',X) errado = np.max(diferencia) itera = itera + 1 # Respuesta X en columna X = np.transpose([X]) # revisa si NO converge if (itera>iteramax): X=0 # revisa respuesta verifica = np.dot(A,X) # SALIDA print('respuesta X: ') print(X) print('verificar A.X=B: ') print(verifica)