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+20
literal 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)