Está en la página 1de 22

27/10/22, 21:30 GDIGG_AMAT_2223_Practica3_vfernandc -- Sage

GDIGG_AMAT_2223_Practica3_vfernandc
Práctica 3. Resolución de Sistemas de Ecuaciones.
Métodos Directos
Temporalización de la práctica : Lunes 17 de octubre de 2022 (Grupo A) y Jueves 20 de octubre de 2022
(Grupo B)

Entrega de la práctica : Ver tarea en el campus virtual o agenda de la asignatura

Instrucciones:

1. Haz una copia de la hoja pública y renómbrala: si tu correo es mariomp@alumnos.unex.es añade al


final del título _mariomp , por ejemplo GDIGG_AMAT_2223_Practica3_mariomp

Para cambiar el nombre pulsa en el título de la hoja (arriba del todo, entre el logo de Sage y el menú
"Archivo/File...")

2. Comparte la hoja de trabajo con el usuario de tu profesor mediante el botón Compartir/Share de arriba a
la derecha.

3. Completa la primera celda y trabaja la práctica.

4. Cuando haya terminado, haga una copia en un único fichero PDF y ponlo en el campus virtual. Esa será
la versión que se evaluará . La hoja no se considera entregada si no se ha renombrado y compartido (pasos
1 y 2).

Para generar el PDF lo más sencillo es usar el botón Imprimir/Imprimir de arriba e imprimir la nueva
página a fichero.

5. Una vez subido el PDF al campus virtual, no podrá modificarse esta hoja de trabajo. Hacerlo conllevará
la calificación de 0 en esta práctica .

6. Los ejercicios a entregar se representan en Rojo y deben estar correctamente explicados. Los ejercicios
indicados con ** NO serán obligatorios, pero aquellos que los hagan podrán ir sumando por cada uno de
ellos 0.1 puntos adicionales en la calificación de la práctica.

Alumno: Virginia Fernández Blanco


Vectores y Matrices
Antes de comenzar a trabajar con Sistemas de Ecuaciones Lineales, es necesario hacer un repaso previo a
construir vectores y matrices en Sage, así como las distintas operaciones que podemos realizar con ellas.

En primer lugar, para crear vectores en Sage utilizamos la función vector() que permite considerar como
vector una lista de números.

v = vector([1,2,3,4]); v
(1, 2, 3, 4)

https://sage-cum.unex.es:8015/home/GDGG22vfernandc/2/print 1/22
27/10/22, 21:30 GDIGG_AMAT_2223_Practica3_vfernandc -- Sage

Como observamos se trata de un vector con números enteros, pero normalmente nos interesa trabajar con
valores reales, para ello, y de manera generalizada, se puede añadir RDF como primer argumento a la
función vector() .

v = vector(RDF,[1,2,3,4]); v
(1.0, 2.0, 3.0, 4.0)

Si queremos mostrar los vectores más elegantes, podemos utilizar la función show() .

mostrar

(1.0, 2.0, 3.0, 4.0)

Por otra parte, si se quiere tomar un elemento del vector, basta indicarlo entre [] el índice de la posición que
ocupa dicho elemento. Recordemos que en Sage se comienza en 0. Además, también podemos modificar los
elementos.

imprimir v[0] v[1] = 3; v


1.0
(1.0, 3.0, 3.0, 4.0)

Podemos operar con vectores de manera habitual. Además, observamos que los vectores Sage los muestra en
filas, para trabajar en columnas es necesario utilizar la función .column().

print 2*v
print v+2*v
vt = v.column(); show(vt)
(2.0, 6.0, 6.0, 8.0)
(3.0, 9.0, 9.0, 12.0)

()
1.0
3.0
3.0
4.0

Sin embargo, para elevar a una potencia un vector, es necesario hacerlo elemento a elemento, para ello se
utilizan las listas por comprensión.

[i^2 for i in v]
[1.0, 9.0, 9.0, 16.0]

Si se quiere aplicar funciones conocidas y programadas en Sage, se debe utilizar la función map().

map(sqrt,v)
[1.0, 1.7320508075688772, 1.7320508075688772, 2.0]

Finalmente, si queremos saber la dimensión del vector se emplea la función .length().

v.length()
4

https://sage-cum.unex.es:8015/home/GDGG22vfernandc/2/print 2/22
27/10/22, 21:30 GDIGG_AMAT_2223_Practica3_vfernandc -- Sage

Por otro lado, para construir matrices en Sage se emplea la función matrix(), al igual que ocurre con los
vectores si se queremos trabajar con números reales debemos situar como primer argumento el valor RDF.
Ahora bien, las matrices se crean como una lista de listas, esto es, una lista cuyos elementos serán listas que
representen los elementos de una fila.

A = matrix(RDF,[[1,2,4,3],[2,1,4,5],[3,4,1,6],[4,5,1,7]])
A
[1.0 2.0 4.0 3.0]
[2.0 1.0 4.0 5.0]
[3.0 4.0 1.0 6.0]
[4.0 5.0 1.0 7.0]

Para mostrar la matriz como estamos acostumbrados utilizamos la función show().

show(A)

( )
1.0 2.0 4.0 3.0
2.0 1.0 4.0 5.0
3.0 4.0 1.0 6.0
4.0 5.0 1.0 7.0

Considerando una matriz, podemos operar con ellas siempre y cuando las dimensiones coincidan. Podemos
multiplicar por escalares, sumar matrices, multiplicar matrices, pero también calcular su inversa, su
determinante, transponer matrices,...

B = 2*A; show(B)

( )
2.0 4.0 8.0 6.0
4.0 2.0 8.0 10.0
6.0 8.0 2.0 12.0
8.0 10.0 2.0 14.0

C = A*B; show(C)

( )
58.0 70.0 38.0 116.0
72.0 92.0 42.0 140.0
76.0 88.0 70.0 154.0
90.0 104.0 88.0 184.0

Para calcular la inversa de una matriz, se puede utilizar tanto la función .inverse() o A ( − 1 ) , y para calcular
su determinante se emplea la función .det().

Ainv = A.inverse(); show(Ainv)

https://sage-cum.unex.es:8015/home/GDGG22vfernandc/2/print 3/22
27/10/22, 21:30 GDIGG_AMAT_2223_Practica3_vfernandc -- Sage

( )
− 0.173913043478 0.304347826087 − 2.65217391304 2.13043478261
0.391304347826 − 0.434782608696 0.217391304348 − 0.0434782608696
0.260869565217 0.0434782608696 − 0.521739130435 0.304347826087
− 0.217391304348 0.130434782609 1.4347826087 − 1.08695652174

show(A^(-1))

( )
− 0.173913043478 0.304347826087 − 2.65217391304 2.13043478261
0.391304347826 − 0.434782608696 0.217391304348 − 0.0434782608696
0.260869565217 0.0434782608696 − 0.521739130435 0.304347826087
− 0.217391304348 0.130434782609 1.4347826087 − 1.08695652174

A.det()
-23.0
At = A.transpose(); show(At)

( )
1.0 2.0 3.0 4.0
2.0 1.0 4.0 5.0
4.0 4.0 1.0 1.0
3.0 5.0 6.0 7.0

También se puede multiplicar una matriz por un vector.

w = A*v; show(w)

(31.0, 37.0, 42.0, 50.0)

z = v*A; show(z)

(32.0, 37.0, 23.0, 64.0)

Por otro lado, para hacer referencia a un elemento de una matriz, se debe indicar la posición de dicho
elemento entre corchetes, de modo que el elemento de la fila 1 y columna 1 se corresponde al valor A[0,0].

A[0,0]
1.0
A[2,2] = A[2,2] + 2^3
show(A)

( )
1.0 2.0 4.0 3.0
2.0 1.0 4.0 5.0
3.0 4.0 9.0 6.0
4.0 5.0 1.0 7.0

https://sage-cum.unex.es:8015/home/GDGG22vfernandc/2/print 4/22
27/10/22, 21:30 GDIGG_AMAT_2223_Practica3_vfernandc -- Sage

Para trabajar con filas o columnas enteras de una matriz se utiliza el símbolo : para indicar que se toman
todos los elementos según se sitúe [:,a] o [a,:] que indica seleccionar todos los elementos de la columna o de
la fila (respectivamente) a+1.

A[:,1] #Columna 2
[2.0]
[1.0]
[4.0]
[5.0]
A[1,:] #Fila 2
[2.0 1.0 4.0 5.0]

Para conocer las dimensiones de la matriz A se utiliza la función .dimensions(), que devuelve una lista con
dos valores: el primero de ellos es el número de filas y el segundo el número de columnas.

A.dimensions()
(4, 4)

Por otro lado, en Sage podemos obtener los elementos de la diagonal de la matriz empleando la función
.diagonal(), y además la función diagonal_matrix(x) permite construir una matriz diagonal cuyos elementos
se encuentran en la lista x.

diag = A.diagonal(); show(diag)


D = diagonal_matrix(diag); show(D)

[1.0, 1.0, 9.0, 7.0]

( )
1.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 9.0 0.0
0.0 0.0 0.0 7.0

Sistemas de Ecuaciones Lineales


Dado una matriz de coeficientes A, un vector de incógnitas x y un vector de términos independientes b, se
puede construir un sistema de ecuaciones lineales de modo matricial como

Ax = b

Si la matriz A tiene inversa (esto es, su determinante es no nulo), entonces se puede obtener el vector de
incógnitas como

x = A − 1b

Como observamos para encontrar el vector de soluciones x multiplicamos por la derecha la matriz A al
vector b, por ello en Sage puede resolverse el sistema de ecuaciones lineales utilizando la función
.solve_right().

Por ejemplo, consideremos el sistema de ecuaciones lineales:

https://sage-cum.unex.es:8015/home/GDGG22vfernandc/2/print 5/22
27/10/22, 21:30 GDIGG_AMAT_2223_Practica3_vfernandc -- Sage

}
x+z =1
2x + y =2
− x + y − 2z =3

A = matrix(RDF,[[1,0,1],[2,1,0],[-1,1,-2]]); show(A)
b = vector(RDF,[1,2,3]); show(b)

( )
1.0 0.0 1.0
2.0 1.0 0.0
− 1.0 1.0 − 2.0

(1.0, 2.0, 3.0)

x = A.solve_right(b); show(x)

( − 3.0, 8.0, 4.0)

Comprobemos que efectivamente la solución obtenida es correcta.

A*x
(0.9999999999999996, 2.0, 3.000000000000001)

Método de Gauss

El primer método para resolver sistemas de ecuaciones es el método de Gauss que se trata de un método
directo, que consiste en realizar distintas transformaciones en la matriz ampliada del sistema para obtener un
nuevo sistema de ecuaciones equivalente cuya matriz de coeficientes es triangular superior

a ij > 0, i > j

pues a partir de ella se realiza una sustitución regresiva para ir encontrando los valores de las incógnitas.

Para aplicar este método, en cada fila i, F i, se debe tomar como pivote el elemento que se encuentre en la
diagonal a ii y conseguir hacer 0's por debajo de dicho elemento, es decir, a partir de la fila i + 1. Las
transformaciones que deben realizarse en la fila k (con k > i), F k, son:

a ki
Fk − F
a ii i

La transformación se realiza si y solo si a ii ≠ 0, en caso contrario, nos saltamos a la siguiente fila.

Consideremos el siguiente sistema de ecuaciones lineales:

https://sage-cum.unex.es:8015/home/GDGG22vfernandc/2/print 6/22
27/10/22, 21:30 GDIGG_AMAT_2223_Practica3_vfernandc -- Sage

}
x + 3z =1
2y + 4t =2
5x + 3z =3
6y + 4t =4

A = matrix(RDF,[[1,0,3,0],[0,2,0,4],[5,0,3,0],[0,6,0,4]]); show(A)
b = vector(RDF,[1,2,3,4]); show(b)

( )
1.0 0.0 3.0 0.0
0.0 2.0 0.0 4.0
5.0 0.0 3.0 0.0
0.0 6.0 0.0 4.0

(1.0, 2.0, 3.0, 4.0)

Para construir la matriz ampliada a partir de A y b, se utiliza la función .augment() que permite añadir una
columna.

Aamp = A.augment(b)
show(Aamp)

( )
1.0 0.0 3.0 0.0 1.0
0.0 2.0 0.0 4.0 2.0
5.0 0.0 3.0 0.0 3.0
0.0 6.0 0.0 4.0 4.0

Vamos a aplicar ahora el método de Gauss, si nos fijamos para la fila 1, el elemento de la diagonal a 11 = 1
es no nulo, luego podemos hacer ceros en las filas 2, 3 y 4, y columna 1, mediante la fórmula

a k1
Fk − F , k = 2, 3, 4
a 11 1

Pero si nos fijamos en las filas 2 y 4 ya hay ceros, luego basta hacer cero en la fila 3 y columna 1.
Recordemos que la fila 1 se corresponde con A[:,0].

Aamp[2,:] = Aamp[2,:] - Aamp[2,0]/Aamp[0,0]*Aamp[0,:]


show(Aamp)

( )
1.0 0.0 3.0 0.0 1.0
0.0 2.0 0.0 4.0 2.0
0.0 0.0 − 12.0 0.0 − 2.0
0.0 6.0 0.0 4.0 4.0

https://sage-cum.unex.es:8015/home/GDGG22vfernandc/2/print 7/22
27/10/22, 21:30 GDIGG_AMAT_2223_Practica3_vfernandc -- Sage

Debemos seguir haciendo transformaciones a partir de las siguientes filas, donde el pivote será a ii para la
fila i, y k será la fila en la que haremos ceros.

i,k = 1,3
pivote = Aamp[i,i]
Aamp[k,:] = Aamp[k,:] - Aamp[k,i]/pivote*Aamp[i,:]
show(Aamp)

( )
1.0 0.0 3.0 0.0 1.0
0.0 2.0 0.0 4.0 2.0
0.0 0.0 − 12.0 0.0 − 2.0
0.0 0.0 0.0 − 8.0 − 2.0

Observamos que la matriz de coeficientes es triangular superior, ahora ya podemos aplicar una sustitución
regresiva para resolver el sistema. Para ello, vamos a crear un vector de ceros, en el que iremos recogiendo
las soluciones del sistema de ecuaciones.

n = A.dimensions()[0]
x = vector(RDF,n); show(x)

(0.0, 0.0, 0.0, 0.0)

Para encontrar los valores de x, recordemos que debemos empezar de abajo a arriba, esto es, el valor de la
última incógnita será el cociente entre Aamp[3,4] y Aamp[3,3].

x[3] = Aamp[3,4]/Aamp[3,3]; show(x)

(0.0, 0.0, 0.0, 0.25)

Ahora la tercera incógnita se obtiene al despejarla en la fila 3 de la ecuación obtenida en la matriz ampliada,
esto es,

Aamp[2, 4] − Aamp[2, 3] ∗ x[3]


x[2] =
Aamp[2, 2]

x[2] = (Aamp[2,4]-Aamp[2,3]*x[3])/Aamp[2,2]; show(x)

(0.0, 0.0, 0.166666666667, 0.25)

Vamos a generalizarlo en la siguiente función.

def SustRegresiva(Aamp):
n = Aamp.dimensions()[0]
x = vector(RDF,n)
for i in [(n-1),(n-2)..0]:
for j in [(i+1)..(n-1)]:
x[i] = x[i] - Aamp[i,j]*x[j]
x[i] = x[i] + Aamp[i,n]
x[i] = x[i]/Aamp[i,i]
return x
https://sage-cum.unex.es:8015/home/GDGG22vfernandc/2/print 8/22
27/10/22, 21:30 GDIGG_AMAT_2223_Practica3_vfernandc -- Sage

SustRegresiva(Aamp)
(0.5, 0.5, 0.16666666666666666, 0.25)

** Ejercicio 1. Crea una función que resuelva un sistema de ecuaciones lineales


utilizando el método de Gauss, utiliza la función SustRegresiva() para encontrar el
vector solución, una vez que se han realizado las distintas transformaciones. Para ello,
la función debe recibir como argumentos la matriz de coeficientes A y el vector de
términos independientes b, y debe devolver la matriz ampliada tras aplicar las
transformaciones de Gauss, y el vector de soluciones.

def Resolver(A,b):
Aamp = A.augment(b)
dimension=A.dimensions()
print dimension
dimcol = dimension[1]
dimfil = dimension[0]
for i in [0..(dimcol-1)]:
for k in [(i+1)..(dimfil-1)]:
pivote = Aamp[i,i]
Aamp[k,:] = Aamp[k,:] - Aamp[k,i]/pivote*Aamp[i,:]
show(Aamp)
x = SustRegresiva(Aamp)
return show(Aamp),show(x)

A = matrix(RDF,[[5,-3,1,1],[1,-10,2,3],[3,-1,6,0]]); show(A)
b = vector(RDF,[1,3,0]); show(b)

Resolver (A,b)

( )
5.0 − 3.0 1.0 1.0
1.0 − 10.0 2.0 3.0
3.0 − 1.0 6.0 0.0

(1.0, 3.0, 0.0)

(3, 4)

( )
5.0 − 3.0 1.0 1.0 1.0
0.0 − 9.4 1.8 2.8 2.8
3.0 − 1.0 6.0 0.0 0.0

( )
5.0 − 3.0 1.0 1.0 1.0
0.0 − 9.4 1.8 2.8 2.8
0.0 0.8 5.4 − 0.6 − 0.6

( )
5.0 − 3.0 1.0 1.0 1.0
0.0 − 9.4 1.8 2.8 2.8
0.0 − 1.11022302463 × 10 − 16 5.55319148936 − 0.36170212766 − 0.36170212766

https://sage-cum.unex.es:8015/home/GDGG22vfernandc/2/print 9/22
27/10/22, 21:30 GDIGG_AMAT_2223_Practica3_vfernandc -- Sage

( )
5.0 − 3.0 1.0 1.0 1.0
0.0 − 9.4 1.8 2.8 2.8
0.0 − 1.11022302463 × 10 − 16 5.55319148936 − 0.36170212766 − 0.36170212766

(0.0268199233716, − 0.310344827586, − 0.0651340996169)

(None, None)
print "En este ejercicio usamos el Método de Gauss para hallar a bases de
los for los ceros, y así sacar la matriz ampliada tras aplicar las
transformaciones y el vestor solución"
En este ejercicio usamos el Método de Gauss para hallar a bases de
los for los ceros, y así sacar la matriz ampliada tras aplicar las
transformaciones y el vestor solución

Ejercicio 2. Aplica el método de Gauss para resolver el sistema de ecuaciones lineales :

}
5x − 3y + z =1
x − 10y + 2z =3
3x − y + 6z =0

A = matrix(RDF,[[5,-3,1],[1,-10,2],[3,-1,6,]]); show(A)
b = vector(RDF,[1,3,0]); show(b)

Resolver (A,b)

( )
5.0 − 3.0 1.0
1.0 − 10.0 2.0
3.0 − 1.0 6.0

(1.0, 3.0, 0.0)

(3, 3)

( )
5.0 − 3.0 1.0 1.0
0.0 − 9.4 1.8 2.8
3.0 − 1.0 6.0 0.0

( )
5.0 − 3.0 1.0 1.0
0.0 − 9.4 1.8 2.8
0.0 0.8 5.4 − 0.6

( )
5.0 − 3.0 1.0 1.0
0.0 − 9.4 1.8 2.8
0.0 − 1.11022302463 × 10 − 16 5.55319148936 − 0.36170212766

https://sage-cum.unex.es:8015/home/GDGG22vfernandc/2/print 10/22
27/10/22, 21:30 GDIGG_AMAT_2223_Practica3_vfernandc -- Sage

( )
5.0 − 3.0 1.0 1.0
0.0 − 9.4 1.8 2.8
0.0 − 1.11022302463 × 10 − 16 5.55319148936 − 0.36170212766

(0.0268199233716, − 0.310344827586, − 0.0651340996169)

(None, None)
print "La solución del sistema es:
(0.0268199233716,−0.310344827586,−0.0651340996169)"
La solución del sistema es:
(0.0268199233716,−0.310344827586,−0.0651340996169)

Método de Gauss con Pivoteo Parcial

Otro método directo para resolver sistemas de ecuaciones lineales es el método de Gauss con pivoteo
parcial. Éste consiste en aplicar el método de Gauss pero eligiendo como fila pivote (y como consecuencia,
el elemento pivote) aquella cuyo elemento pivote sea el de mayor valor absoluto de su columna. Una vez
elegido el pivote se deben intercambiar ambas filas, esto puede hacerse con la función de Sage
.swap_rows(a,b) que intercambia las filas a y b.

Por ello, el primer paso de este método es encuentrar el máximo, en valor absoluto, de la columna, que será
el pivote. A continuación, se deben intercambiar las filas y posteriormente aplicar el método de Gauss ya
visto.

Por ejemplo, consideremos el sistema de ecuaciones lineales:

}
x + 3y + 3z =1
x + 2y =2
2x + 4z =4

A = matrix(RDF,[[1,3,3],[1,2,0],[2,0,4]]); show(A)
b = vector(RDF,[1,2,4]); show(b)

( )
1.0 3.0 3.0
1.0 2.0 0.0
2.0 0.0 4.0

(1.0, 2.0, 4.0)

Aamp = A.augment(b); show(Aamp)

( )
1.0 3.0 3.0 1.0
1.0 2.0 0.0 2.0
2.0 0.0 4.0 4.0

Primero buscamos el pivote utilizando la siguiente función creada que devuelve una lista con dos valores: el
primero es el máximo del vector que recibe, y el segundo es la posición que ocupa dicho máximo en el
vector.

https://sage-cum.unex.es:8015/home/GDGG22vfernandc/2/print 11/22
27/10/22, 21:30 GDIGG_AMAT_2223_Practica3_vfernandc -- Sage

def IndexMax(v):
v = map(abs,v)
max_v = max(v)
i = 0
while v[i] != max_v:
i = i+1
return max_v,i

Si aplicamos dicha función a la primera columna de la matriz Aamp, vemos que el máximo se encuentra en
la tercera fila (posición 2 para Sage).

IndexMax(Aamp[:,0])
(2.0, 2)

Por lo tanto, apliquemos el intercambio entre la fila 1 y la fila 3.

show(Aamp)
Aamp.swap_rows(0,IndexMax(Aamp[:,0])[1]); show(Aamp)

( )
1.0 3.0 3.0 1.0
1.0 2.0 0.0 2.0
2.0 0.0 4.0 4.0

( )
2.0 0.0 4.0 4.0
1.0 2.0 0.0 2.0
1.0 3.0 3.0 1.0

Ahora considerando el pivote mayor, podemos aplicar el método de Gauss para hacer ceros debajo del
pivote en las filas 2 y 3.

Aamp[1,:] = Aamp[1,:] - Aamp[1,0]/Aamp[0,0]*Aamp[0,:]; show(Aamp)


Aamp[2,:] = Aamp[2,:] - Aamp[2,0]/Aamp[0,0]*Aamp[0,:]; show(Aamp)

( )
2.0 0.0 4.0 4.0
0.0 2.0 − 2.0 0.0
1.0 3.0 3.0 1.0

( )
2.0 0.0 4.0 4.0
0.0 2.0 − 2.0 0.0
0.0 3.0 1.0 − 1.0

Debemos volver a aplicar la búsqueda del pivote e intercambiar las filas.

Aamp.swap_rows(1,IndexMax(Aamp[1:,1])[1]+1); show(Aamp)

https://sage-cum.unex.es:8015/home/GDGG22vfernandc/2/print 12/22
27/10/22, 21:30 GDIGG_AMAT_2223_Practica3_vfernandc -- Sage

( )
2.0 0.0 4.0 4.0
0.0 3.0 1.0 − 1.0
0.0 2.0 − 2.0 0.0

Aamp[2,:] = Aamp[2,:] - Aamp[2,1]/Aamp[1,1]*Aamp[1,:]; show(Aamp)

( )
2.0 0.0 4.0 4.0
0.0 3.0 1.0 − 1.0
0.0 0.0 − 2.66666666667 0.666666666667

Una vez transformada la matriz de coefientes en triangular superior, podemos aplicar la sustitución regresiva
para resolver el sistema.

SustRegresiva(Aamp)
(2.5, -0.25, -0.25)

** Ejercicio 3. Crea una función que resuelva un sistema de ecuaciones lineales


utilizando el método de Gauss con pivoteo parcial, utiliza las funciones IndexMax() y
SustRegresiva() para encontrar el vector solución, una vez que se han realizado las
distintas transformaciones. Para ello, la función debe recibir como argumentos la
matriz de coeficientes A y el vector de términos independientes b, y debe devolver la
matriz ampliada tras aplicar las transformaciones de Gauss y el pivoteo parcial, y el
vector de soluciones.

#No me sale

def GaussPivoteoParcial (A,b):


Aamp = A.augment(b); show(Aamp)
IndexMax(v)
v = map(abs,v)
IndexMax(Aamp[:,0])

Ejercicio 4. Aplica el método de Gauss con pivoteo parcial para resolver el sistema de
ecuaciones lineales :

}
5x − 3y + z =1
x − 10y + 2z =3
3x − y + 6z =0

A = matrix(RDF,[[5,-3,1],[1,-10,2],[3,-1,6,]]); show(A)
b = vector(RDF,[1,3,0]); show(b)
Aamp = A.augment(b)
show(Aamp)

https://sage-cum.unex.es:8015/home/GDGG22vfernandc/2/print 13/22
27/10/22, 21:30 GDIGG_AMAT_2223_Practica3_vfernandc -- Sage

def IndexMax(v):
v = map(abs,v)
max_v = max(v)
i = 0
while v[i] != max_v:
i = i+1
return max_v,i

print IndexMax(Aamp[:,0])
show(Aamp)

Aamp.swap_rows(0,IndexMax(Aamp[:,0])[1]); show(Aamp)

print "Aplicamos método de Gauss para hacer ceros"


Aamp[1,:] = Aamp[1,:] - Aamp[1,0]/Aamp[0,0]*Aamp[0,:]; show(Aamp)
Aamp[2,:] = Aamp[2,:] - Aamp[2,0]/Aamp[0,0]*Aamp[0,:]; show(Aamp)
Aamp.swap_rows(1,IndexMax(Aamp[1:,1])[1]+1); show(Aamp)
Aamp[2,:] = Aamp[2,:] - Aamp[2,1]/Aamp[1,1]*Aamp[1,:]; show(Aamp)

print "El sistema de ecuaciones lineales tiene como solución: ";


SustRegresiva(Aamp)

( )
5.0 − 3.0 1.0
1.0 − 10.0 2.0
3.0 − 1.0 6.0

(1.0, 3.0, 0.0)

( )
5.0 − 3.0 1.0 1.0
1.0 − 10.0 2.0 3.0
3.0 − 1.0 6.0 0.0

(5.0, 0)

( )
5.0 − 3.0 1.0 1.0
1.0 − 10.0 2.0 3.0
3.0 − 1.0 6.0 0.0

( )
5.0 − 3.0 1.0 1.0
1.0 − 10.0 2.0 3.0
3.0 − 1.0 6.0 0.0

Aplicamos método de Gauss para hacer ceros

( )
5.0 − 3.0 1.0 1.0
0.0 − 9.4 1.8 2.8
3.0 − 1.0 6.0 0.0

https://sage-cum.unex.es:8015/home/GDGG22vfernandc/2/print 14/22
27/10/22, 21:30 GDIGG_AMAT_2223_Practica3_vfernandc -- Sage

( )
5.0 − 3.0 1.0 1.0
0.0 − 9.4 1.8 2.8
0.0 0.8 5.4 − 0.6

( )
5.0 − 3.0 1.0 1.0
0.0 − 9.4 1.8 2.8
0.0 0.8 5.4 − 0.6

( )
5.0 − 3.0 1.0 1.0
0.0 − 9.4 1.8 2.8
0.0 − 1.11022302463 × 10 − 16 5.55319148936 − 0.36170212766

El sistema de ecuaciones lineales tiene como solución:


(0.026819923371647535, -0.31034482758620685, -0.06513409961685825)

Ejercicio 5. Aplica el método de Gauss con pivoteo parcial para resolver el sistema de
ecuaciones lineales:

}
4x + 2y + z =2
2x + 5y − 2z = − 15
3x + 2y + 7z =3

A = matrix(RDF,[[4,2,1],[2,5,-2],[3,2,7,]]); show(A)
b = vector(RDF,[2,-15,3]); show(b)
Aamp = A.augment(b)
show(Aamp)

def IndexMax(v):
v = map(abs,v)
max_v = max(v)
i = 0
while v[i] != max_v:
i = i+1
return max_v,i

print IndexMax(Aamp[:,0])
show(Aamp)

Aamp.swap_rows(0,IndexMax(Aamp[:,0])[1]); show(Aamp)

print "Aplicamos método de Gauss para hacer ceros"


Aamp[1,:] = Aamp[1,:] - Aamp[1,0]/Aamp[0,0]*Aamp[0,:]; show(Aamp)
Aamp[2,:] = Aamp[2,:] - Aamp[2,0]/Aamp[0,0]*Aamp[0,:]; show(Aamp)
Aamp.swap_rows(1,IndexMax(Aamp[1:,1])[1]+1); show(Aamp)
Aamp[2,:] = Aamp[2,:] - Aamp[2,1]/Aamp[1,1]*Aamp[1,:]; show(Aamp)

print "El sistema de ecuaciones lineales tiene como solución: ";


SustRegresiva(Aamp)
https://sage-cum.unex.es:8015/home/GDGG22vfernandc/2/print 15/22
27/10/22, 21:30 GDIGG_AMAT_2223_Practica3_vfernandc -- Sage

( )
4.0 2.0 1.0
2.0 5.0 − 2.0
3.0 2.0 7.0

(2.0, − 15.0, 3.0)

( )
4.0 2.0 1.0 2.0
2.0 5.0 − 2.0 − 15.0
3.0 2.0 7.0 3.0

(4.0, 0)

( )
4.0 2.0 1.0 2.0
2.0 5.0 − 2.0 − 15.0
3.0 2.0 7.0 3.0

( )
4.0 2.0 1.0 2.0
2.0 5.0 − 2.0 − 15.0
3.0 2.0 7.0 3.0

Aplicamos método de Gauss para hacer ceros

( )
4.0 2.0 1.0 2.0
0.0 4.0 − 2.5 − 16.0
3.0 2.0 7.0 3.0

( )
4.0 2.0 1.0 2.0
0.0 4.0 − 2.5 − 16.0
0.0 0.5 6.25 1.5

( )
4.0 2.0 1.0 2.0
0.0 4.0 − 2.5 − 16.0
0.0 0.5 6.25 1.5

( )
4.0 2.0 1.0 2.0
0.0 4.0 − 2.5 − 16.0
0.0 0.0 6.5625 3.5

El sistema de ecuaciones lineales tiene como solución:


(2.2, -3.6666666666666665, 0.5333333333333333)

Ejercicio 6. Aplica el método de Gauss con pivoteo parcial para resolver el sistema de
ecuaciones lineales:

https://sage-cum.unex.es:8015/home/GDGG22vfernandc/2/print 16/22
27/10/22, 21:30 GDIGG_AMAT_2223_Practica3_vfernandc -- Sage

}
3x + z =0
4x + 9y − 3z =4
− 2x + 4z =1

A = matrix(RDF,[[3,0,1],[4,9,-3],[-2,0,4]]); show(A)
b = vector(RDF,[0,4,1]); show(b)
Aamp = A.augment(b)
show(Aamp)

def IndexMax(v):
v = map(abs,v)
max_v = max(v)
i = 0
while v[i] != max_v:
i = i+1
return max_v,i

print IndexMax(Aamp[:,0])
show(Aamp)

Aamp.swap_rows(0,IndexMax(Aamp[:,0])[1]); show(Aamp)

print "Aplicamos método de Gauss para hacer ceros"


Aamp[1,:] = Aamp[1,:] - Aamp[1,0]/Aamp[0,0]*Aamp[0,:]; show(Aamp)
Aamp[2,:] = Aamp[2,:] - Aamp[2,0]/Aamp[0,0]*Aamp[0,:]; show(Aamp)
Aamp.swap_rows(1,IndexMax(Aamp[1:,1])[1]+1); show(Aamp)
Aamp[2,:] = Aamp[2,:] - Aamp[2,1]/Aamp[1,1]*Aamp[1,:]; show(Aamp)

print "El sistema de ecuaciones lineales tiene como solución: ";


SustRegresiva(Aamp)

( )
3.0 0.0 1.0
4.0 9.0 − 3.0
− 2.0 0.0 4.0

(0.0, 4.0, 1.0)

( )
3.0 0.0 1.0 0.0
4.0 9.0 − 3.0 4.0
− 2.0 0.0 4.0 1.0

(4.0, 1)

( )
3.0 0.0 1.0 0.0
4.0 9.0 − 3.0 4.0
− 2.0 0.0 4.0 1.0

https://sage-cum.unex.es:8015/home/GDGG22vfernandc/2/print 17/22
27/10/22, 21:30 GDIGG_AMAT_2223_Practica3_vfernandc -- Sage

( )
4.0 9.0 − 3.0 4.0
3.0 0.0 1.0 0.0
− 2.0 0.0 4.0 1.0

Aplicamos método de Gauss para hacer ceros

( )
4.0 9.0 − 3.0 4.0
0.0 − 6.75 3.25 − 3.0
− 2.0 0.0 4.0 1.0

( )
4.0 9.0 − 3.0 4.0
0.0 − 6.75 3.25 − 3.0
0.0 4.5 2.5 3.0

( )
4.0 9.0 − 3.0 4.0
0.0 − 6.75 3.25 − 3.0
0.0 4.5 2.5 3.0

( )
4.0 9.0 − 3.0 4.0
0.0 − 6.75 3.25 − 3.0
0.0 0.0 4.66666666667 1.0

El sistema de ecuaciones lineales tiene como solución:


(-0.0714285714285714, 0.5476190476190477, 0.2142857142857143)

Ejercicio 7. Sea DNI la suma de los números de tu DNI y dni = DNI / 2.9 ln ( DNI ) , aplica
el método de Gauss con pivoteo parcial para resolver el siguiente sistema de
ecuaciones:

}
(12 + dni)x − y + z =1
5x + 4y − 2z =2
− 2x + y − 6z =3

DNI = 38
dni = DNI/2.9^(ln(DNI))
A = matrix(RDF,[[(12+dni),-1,1],[5,4,-2],[-2,1,-6,]]); show(A)
b = vector(RDF,[1,2,3]); show(b)
Aamp = A.augment(b)
def IndexMax(v):
v = map(abs,v)
max_v = max(v)
i = 0
while v[i] != max_v:
i = i+1
return max_v,i

https://sage-cum.unex.es:8015/home/GDGG22vfernandc/2/print 18/22
27/10/22, 21:30 GDIGG_AMAT_2223_Practica3_vfernandc -- Sage

IndexMax(Aamp[:,0])
print IndexMax(Aamp[:,0])
Aamp[1,:] = Aamp[1,:] - Aamp[1,0]/Aamp[0,0]*Aamp[0,:]; show(Aamp)
Aamp[2,:] = Aamp[2,:] - Aamp[2,0]/Aamp[0,0]*Aamp[0,:]; show(Aamp)
IndexMax(Aamp[:,1])
print IndexMax(Aamp[:,1])

Aamp[2,:] = Aamp[2,:] - Aamp[2,1]/Aamp[1,1]*Aamp[1,:]; show(Aamp)


print "El sistema de ecuaciones lineales tiene como solución: ";
SustRegresiva(Aamp)

( )
12.7902618907 − 1.0 1.0
5.0 4.0 − 2.0
− 2.0 1.0 − 6.0

(1.0, 2.0, 3.0)

(12.790261890678588, 0)

( )
12.7902618907 − 1.0 1.0 1.0
0.0 4.39092240978 − 2.39092240978 1.60907759022
− 2.0 1.0 − 6.0 3.0

( )
12.7902618907 − 1.0 1.0 1.0
0.0 4.39092240978 − 2.39092240978 1.60907759022
0.0 0.843631036089 − 5.84363103609 3.15636896391

(4.390922409778329, 1)

( )
12.7902618907 − 1.0 1.0 1.0
0.0 4.39092240978 − 2.39092240978 1.60907759022
0.0 0.0 − 5.38426141815 2.84721574554

El sistema de ecuaciones lineales tiene como solución:


(0.12566729266473922, 0.07851418406358476, -0.5288034002109824)
DNI = 38
dni = DNI/2.9^(ln(DNI))
A = matrix(RDF,[[(12+dni),-1,1],[5,4,-2],[-2,1,-6,]]); show(A)
b = vector(RDF,[1,2,3]); show(b)

x = A.solve_right(b); show(x)

( )
12.7902618907 − 1.0 1.0
5.0 4.0 − 2.0
− 2.0 1.0 − 6.0

(1.0, 2.0, 3.0)

(0.125667292665, 0.0785141840636, − 0.528803400211)

Utilizamos la función A.solve_right() para poder comparar los dos resultados. En este caso se cumple.
https://sage-cum.unex.es:8015/home/GDGG22vfernandc/2/print 19/22
27/10/22, 21:30 GDIGG_AMAT_2223_Practica3_vfernandc -- Sage

Ejercicio 8. Sea DNI la suma de los números de tu DNI y dni = DNI / 2.9 ln ( DNI ) , y sea el
sistema de ecuaciones lineales:

}
(4 − dni)x + 2y − z =2
6x + 8y + 3z =9
− 3x + 5y − 9z =1

a) Aplica el método de Gauss para resolver el sistema de ecuaciones anterior.

b) Aplica el método de Gauss con pivoteo parcial para resolver el sistema de ecuaciones
anterior.

print "A)"
DNI = 38
dni = (DNI)/2.9^(ln(DNI))

A = matrix(RDF,[[(4-dni),2,-1],[6,8,3],[-3,5,-9,]]); show(A)
b = vector(RDF,[2,9,1]); show(b)

Resolver (A,b)
A)

( )
3.20973810932 2.0 − 1.0
6.0 8.0 3.0
− 3.0 5.0 − 9.0

(2.0, 9.0, 1.0)

(3, 3)

( )
3.20973810932 2.0 − 1.0 2.0
0.0 4.26137722416 4.86931138792 5.26137722416
− 3.0 5.0 − 9.0 1.0

( )
3.20973810932 2.0 − 1.0 2.0
0.0 4.26137722416 4.86931138792 5.26137722416
0.0 6.86931138792 − 9.93465569396 2.86931138792

( )
3.20973810932 2.0 − 1.0 2.0
0.0 4.26137722416 4.86931138792 5.26137722416
0.0 0.0 − 17.7839528599 − 5.61199326569

( )
3.20973810932 2.0 − 1.0 2.0
0.0 4.26137722416 4.86931138792 5.26137722416
0.0 0.0 − 17.7839528599 − 5.61199326569

(0.176774890967, 0.874081952948, 0.315565010204)

https://sage-cum.unex.es:8015/home/GDGG22vfernandc/2/print 20/22
27/10/22, 21:30 GDIGG_AMAT_2223_Practica3_vfernandc -- Sage

(None, None)
print "B)"

DNI = 38
dni = (DNI)/2.9^(ln(DNI))

A = matrix(RDF,[[(4-dni),2,-1],[6,8,3],[-3,5,-9,]]); show(A)
b = vector(RDF,[2,9,1]); show(b)

Aamp = A.augment(b)
def IndexMax(v):
v = map(abs,v)
max_v = max(v)
i = 0
while v[i] != max_v:
i = i+1
return max_v,i
IndexMax(Aamp[:,0])
print IndexMax(Aamp[:,0])
Aamp[1,:] = Aamp[1,:] - Aamp[1,0]/Aamp[0,0]*Aamp[0,:]; show(Aamp)
Aamp[2,:] = Aamp[2,:] - Aamp[2,0]/Aamp[0,0]*Aamp[0,:]; show(Aamp)
IndexMax(Aamp[:,1])
print IndexMax(Aamp[:,1])

Aamp[2,:] = Aamp[2,:] - Aamp[2,1]/Aamp[1,1]*Aamp[1,:]; show(Aamp)


print "El sistema de ecuaciones lineales tiene como solución: ";
SustRegresiva(Aamp)
B)

( )
3.20973810932 2.0 − 1.0
6.0 8.0 3.0
− 3.0 5.0 − 9.0

(2.0, 9.0, 1.0)

(6.0, 1)

( )
3.20973810932 2.0 − 1.0 2.0
0.0 4.26137722416 4.86931138792 5.26137722416
− 3.0 5.0 − 9.0 1.0

( )
3.20973810932 2.0 − 1.0 2.0
0.0 4.26137722416 4.86931138792 5.26137722416
0.0 6.86931138792 − 9.93465569396 2.86931138792

(6.8693113879214565, 2)

( )
3.20973810932 2.0 − 1.0 2.0
0.0 4.26137722416 4.86931138792 5.26137722416
0.0 0.0 − 17.7839528599 − 5.61199326569

https://sage-cum.unex.es:8015/home/GDGG22vfernandc/2/print 21/22
27/10/22, 21:30 GDIGG_AMAT_2223_Practica3_vfernandc -- Sage

El sistema de ecuaciones lineales tiene como solución:


(0.1767748909670954, 0.874081952948054, 0.3155650102043317)
A = matrix(RDF,[[(4-dni),2,-1],[6,8,3],[-3,5,-9,]]); show(A)
b = vector(RDF,[2,9,1]); show(b)

x = A.solve_right(b); show(x)

( )
3.20973810932 2.0 − 1.0
6.0 8.0 3.0
− 3.0 5.0 − 9.0

(2.0, 9.0, 1.0)

(0.176774890967, 0.874081952948, 0.315565010204)

Como podemos observar la aproximación del resultado se asemeja a cualquiera de los dos métodos.

https://sage-cum.unex.es:8015/home/GDGG22vfernandc/2/print 22/22

También podría gustarte