1. Normas de vector o Matriz
Referencia: Chapra 10.3.1 p298 pdf322, Burden 7.1 p320, Rodríguez 4.4.1 p132, MATG1049 Algebra Lineal - Norma, distancias y ángulos
Es una manera de expresar la magnitud de sus componentes:
Sea X un vector de n componentes:
||X|| = \sum_{i=1}^{n}|X_i| ||X|| = max|X_i| , i=1,2, ...,n ||X|| = \left( \sum_{i=1}^{n}X_i^2 \right) ^{1/2}Sea una matriz A de nxn componentes:
||A|| = max(\sum_{j=1}^{n}|a_{i,j}|, i = 1,2,...,n) ||A|| = max(\sum_{i=1}^{n}|a_{i,j}|, j = 1,2,...,n) ||A|| = \left( \sum_{i=1}^{n}\sum_{j=1}^{n} a_{i,j}^2 \right) ^{1/2}2. Ejercicios
Ejercicio 1. Usando los conceptos de normas mostradas, para el siguiente vector:
x= [5, -3, 2]
a) calcule las normas mostradas (en papel),
b) Realice los respectivos algoritmos en python,
c) Determine los tiempos de ejecución de cada algoritmo. ¿Cúál es el más rápido?
Ejercicio 2. Usando los conceptos de normas mostradas, para la siguiente matriz:
A = [[5, -3, 2],
[4, 8,-4],
[2, 6, 1]]
Repita los literales del ejercicio anterior.
Nota: para convertir una lista X en arreglo use: np.array(X)
3. Normas con Python y Numpy
Algunas normas vectoriales y matriciales con Python. Cálculo del número de condición.
Se presenta un ejemplo usando la matriz A y el vector B en un programa de prueba.
A = [[3,-0.1,-0.2],
[0.1,7,-0.3],
[0.3,-0.2,10]]
B = [7.85,-19.3,71.4]
Instrucciones en Python:
# Normas vectoriales y matriciales
# Referencia: Chapra 10.3, p299, pdf323
import numpy as np
def norma_p(X,p):
Xp = (np.abs(X))**p
suma = np.sum(Xp)
norma = suma**(1/p)
return(norma)
def norma_euclidiana(X):
norma = norma_p(X,2)
return(norma)
def norma_filasum(X):
sfila = np.sum(np.abs(X),axis=1)
norma = np.max(sfila)
return(norma)
def norma_frobenius(X):
tamano = np.shape(X)
n = tamano[0]
m = tamano[1]
norma = 0
for i in range(0,n,1):
for j in range(0,m,1):
norma = norma + np.abs(X[i,j])**2
norma = np.sqrt(norma)
return(norma)
def num_condicion(X):
M = np.copy(X)
Mi = np.linalg.inv(M)
nM = norma_filasum(M)
nMi= norma_filasum(Mi)
ncondicion = nM*nMi
return(ncondicion)
# Programa de prueba #######
# INGRESO
A = [[3,-0.1,-0.2],
[0.1,7,-0.3],
[0.3,-0.2,10]]
B = [7.85,-19.3,71.4]
p = 2
# PROCEDIMIENTO
# Matrices como arreglo, numeros reales
A = np.array(A,dtype=float)
B = np.array(B,dtype=float)
normap = norma_p(B, p)
normaeucl = norma_euclidiana(B)
normafilasuma = norma_filasum(A)
numerocondicion = num_condicion(A)
# SALIDA
print('vector:',B)
print('norma p: ',2)
print(normap)
print('norma euclididana: ')
print(normaeucl)
print('******')
print('matriz: ')
print(A)
print('norma suma fila: ',normafilasuma)
print('n mero de condici n:')
print(numerocondicion)
cuyos resultados del ejercicio serán:
vector: [ 7.85 -19.3 71.4 ]
norma p: 2
74.3779033046778
norma euclididana:
74.3779033046778
******
matriz:
[[ 3. -0.1 -0.2]
[ 0.1 7. -0.3]
[ 0.3 -0.2 10. ]]
norma suma fila: 10.5
número de condición:
3.6144243248254124
>>>
compare sus resultados con las funciones numpy:
np.linalg.norm(A)
np.linalg.cond(A)
Referencias: [1] http://www.numpy.org/devdocs/reference/generated/numpy.linalg.norm.html
[2] http://www.numpy.org/devdocs/reference/generated/numpy.linalg.cond.html
4.Numero de Condición
Referencia: Chapra 10.3.2 p300/pdf324, Burden 9Ed 7.5 p470, Rodríguez 4.4.3 p133
El número de condición de una matriz A, es una forma de medir la sensibilidad del resultado del sistema de ecuaciones ante pequeños cambios en los valores de la entrada X. El número de condición de una matriz se usa para cuantificar su nivel de mal condicionamiento.
Sea A.X=B un sistema de ecuaciones lineales, entonces:
cond(A) = ||A|| ||A-1||
es el número de condición de la matriz A.
Los pequeños errores, por ejemplo por truncamiento, pueden amplificarse y afectar la precisión de la solución. Si el número de condición es cercano a 1 o 'bajo', implica que la matriz está bien condicionada, errores pequeños en los valores tienen poco impacto en la solución.
Instrucción en Python
np.linalg.cond(A)
Ejemplo: Si la matriz A es la identidad, el número de condición es 1.
A = [[1,0,0],
[0,1,0],
[0,0,1]]
>>> np.linalg.cond(A)
1.0
Otro ejemplo: 1Eva2010TI_T3_MN Precio artículos
A = [[2,2,4,1],
[2,2,5,2],
[4,1,1,2],
[2,5,2,1]]
np.linalg.cond(A)
18.46408777611575
realizando el pivoteo parcial por filas a la matriz A, no afecta el número de condición.
A = [[4,1,1,2],
[2,5,2,1],
[2,2,5,2],
[2,2,4,1]]
np.linalg.cond(A)
18.464087776115733
Se observará que si el número de condición está alejado de 1, es 'alto', al aplicar los métodos iterativos de Jacobi o Gauss-Seidel, resultan NO convergentes. Lo que puede ser un factor para seleccionar el método a usar para encontrar la solución al sistema de ecuaciones.
Tarea
Usando como base los procedimientos desarrollados en Python, elabore un algoritmo para encontrar el número de condición de una matriz.
"el error relativo de la norma de la solución calculada puede ser tan grande como el error relativo de la norma de los coeficientes de [A], multiplicada por el número de condición."
Por ejemplo,
- si los coeficientes de [A] se encuentran a t dígitos de precisión (esto es, los errores de redondeo son del orden de 10–t) y
- Cond [A] = 10c,
- la solución [X] puede ser válida sólo para t – c dígitos (errores de redondeo ~ 10c–t).
verifique el resultado obtenido con el algoritmo, comparando con usar la instrucción
np.linalg.cond(A)