4 - ALGEBRA-LINEAR

501 days ago by jmarcellopereira

ALGEBRA LINEAR

Some common Sage rings and fields
ZZ integers, ring

QQ rationals, field

AA, QQbar algebraic number fields, exact

RDF real double field, inexact

CDF complex double field, inexact

RR 53-bit reals, inexact, not same as RDF

RealField(400) 400-bit reals, inexact

CC, ComplexField(400) complexes, too

RIF real interval field

GF(2) mod 2, field, specialized implementations

GF(p) == FiniteField(p) p prime, field

Integers(6) integers mod 6, ring only

CyclotomicField(7) rationals with 7th root of unity √QuadraticField(-5, ’x’) rationals with x= −5

SR ring of symbolic expressions

 
       

VETORES 

v = vector([1, 0]) u = vector([0, 1]) t = vector([-1,-2]) v;u;t 
       


Gráfico de vetores 2D

plot(v,color="red", figsize = (4,4),gridlines="minor") + plot(u) + plot(t,color="green") 
       
 
       
# campo de vetores resultante var('x,y') plot_vector_field((x,y),(x,0,1),(y,0,1), figsize=(6,5), gridlines="minor") 
       

OPERAÇÕES COM VETORES

Soma e Subtração de Vetores

v = vector([1, 0]); u = vector([0, 1]); t = vector([-1,-2]); Som = v+u+t; Sub = v-u-t v; u; t; Som; Sub 
       




Viualização Gráfica 2D

plot(v,color="red", figsize = (4,4),gridlines="minor")+plot(u)+plot(t,color="green")+plot(Som,color="black") 
       
plot(v,color="red", figsize = (4,4),gridlines="minor")+plot(u)+plot(t,color="green")+plot(Sub,color="black") 
       

Vetores 3D

w = vector([1, 0, 0]); r = vector([0,1, 0]); s = vector([0,0, 1]); Som = w+r+s; Sub = w-r-s; w;r;s; Som; Sub 
       




Visualizção Gráfica 3D

 
       
plot(w,color='red', figsize = (5,6), mesh=true, thickness=3) + plot(r, thickness=3)+ plot(s,color='green',thickness=3) + plot(Som,color='green',thickness=3) 
       
plot(w,color='red', figsize = (5,6), mesh=true, thickness=3) + plot(r, thickness=3)+ plot(s,color='green',thickness=3) + plot(Sub,color='green',thickness=3) 
       
# multiplicação por escalar v = vector([1, 0]); 2*v 
       
# Multiplicação elemento por elemento entre vetores v = vector([1, 0]) u = vector([0, 1]) # Divisão por escalar v = vector([1, 0]) v/2 v.pairwise_product(u) 
       
# Divisão por escalar v = vector([1, 0]) v/2 
       
# Divisão elemento por elemento entre vetores v = vector([1, 0]) u = vector([0, 1]) 
       
# Potencia elemento por elemento v = vector([1, 2]) u = vector([3, 4]) v.apply_map(lambda x: x^2) 
       
# Potencia elemento por elemento entre vetores 
       
# Transposição v = vector([1, 0]) v.column() 
       
# Vetor aletório Va = random_vector(QQ, 3) ; Vab = random_vector(ZZ, 3) Va ; Vab 
       

# Mediana dos elementos de um vetor 
       
# Média dos valores dos elementos de um vetor 
       
# Desvio padrão dos elementos de um vetor 
       
# Valor máximo do vetor v v = vector([1, 0]) max(v) 
       
# Valor máximo de um vetor e indice 
       
# valores extremos de um vetor: minimo e máximo 
       
# Testando se o indice 3 corresponde ao elemento de maior valor do vetor v = [1 2 3]. # O valor true no teste de igualdade corresponde a verdadeiro 
       
Traceback (click to the left of this block for traceback)
...
NameError: name 'maximum' is not defined
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_sage_input_75.py", line 10, in <module>
    exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("IyBUZXN0YW5kbyBzZSBvIGluZGljZSAzIGNvcnJlc3BvbmRlIGFvIGVsZW1lbnRvIGRlIG1haW9yIHZhbG9yIGRvIHZldG9yIHYgPSBbMSAyIDNdLiAKIyBPIHZhbG9yIHRydWUgbm8gdGVzdGUgZGUgaWd1YWxkYWRlIGNvcnJlc3BvbmRlIGEgdmVyZGFkZWlybwptYXhpbXVtKHYp"),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))
  File "", line 1, in <module>
    
  File "/tmp/tmphcIltY/___code___.py", line 4, in <module>
    exec compile(u'maximum(v)
  File "", line 1, in <module>
    
NameError: name 'maximum' is not defined
# Valor mínimo de um vetor min(v) 
       
# Valor minimo de um vetor e indice 
       
Traceback (click to the left of this block for traceback)
...
NameError: name 'extreme' is not defined
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_sage_input_82.py", line 10, in <module>
    exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("ZXh0cmVtZSh2KQ=="),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))
  File "", line 1, in <module>
    
  File "/tmp/tmpuEQuGq/___code___.py", line 2, in <module>
    exec compile(u'extreme(v)
  File "", line 1, in <module>
    
NameError: name 'extreme' is not defined
# Testando se o indice 1 corresponde ao elemento de menor valor do vetor v = [1 2 3]. # O valor true no teste de igualdade corresponde a verdadeiro 
       
# Produto interno: somente vetores coluna. aqui o uso do transpose ou v' nao funciona v = vector([1, 0]) u = vector([0, 1]) v.inner_product(u) ; v.dot_product(u) 
       

# Produto externo ou vetorial vv = vector([1, 0, 0]) uu = vector([0, 1, 0]) vv.cross_product(uu) 
       
 
       

Multiplicação de Vetores

Multiplicação v(linhas_v,colunas_v) * u(linhas_u,colunas_u) , só é possível se colunas_v = linhas_u ou seja se o número de colunas de v for igual ao númer de linhas de colunas de u resultando em um vetor de m_v linhas e n_u colunas

v = vector([1, 1]) u = vector([-1, -1]) u*v 
       
       

OPERAÇÕES COM MATRIZES

A = matrix([[0, -1, -1], [1, 1, 1], [2, 4, 1]]) B = matrix([[1.1, 0.0, 1.8], [-1.7, 9.6, 1.0], [7.9, 4.6, -5.5]]) A ; B 
       

type(A) ; type(B) 
       

Soma e Subtração de Matrizes

A+B 
       
A-B 
       
 
       

Matriz aleatória

C = random_matrix(RR,3,3); D = random_matrix(ZZ,3,2) C ; D 
       

type(C) ; type(D) 
       

Determinante

show(A) A.det() ; det(A) 
       


Cofatores

show(A) A.adjoint() 
       

Multiplicação de Matrizes

Multiplicação Ma(linhas_Ma,colunas_Ma) * Mb(linhas_Mb,colunas_Mb) , só é possível se colunas_Ma = linhas_Mb ou seja se o número de colunas de Ma for igual ao número de linhas de Mb resultando em uma matriz de Ma_linhas e Mb_colunas

A*B 
       
 
       

Matrizes especiais

# matriz de zeros Mzeros_A = matrix(3, 3, 0) ; Mzeros_B = zero_matrix(3,3) Mzeros_A; Mzeros_B 
       

# matriz de uns Muns = ones_matrix(3,3) Muns 
       
# matriz identidade Miden_A = matrix(3, 3, 1) ; Miden_B = identity_matrix(3,3) Miden_A; Miden_B 
       

#matriz diagonal com termos definidos Mdiag_A = diagonal_matrix([2, 1.3, 5]); Mdiag_B = matrix(QQ, 3, 3, 8) Mdiag ; Mdiag_B 
       

 
       

Gráfico de uma matriz

Ma = random_matrix(RDF,5) Ma 
       
Ma.plot(cmap='Blues',vmin=min(min(Ma)), vmax=ceil(max(max(Ma))), colorbar=true, figsize=(6,5)) 
       
Mb = matrix([[1,2],[3,4]]) Mb 
       
Mb.apply_map(lambda x: x^2) 
       
 
       
MA = matrix(RDF,[[8.0,9.1,1.9],[0.5,5.5,3.6],[8.9,1.0,6.1]]) MB = vector(RDF,[8.1,-3.0,7.5]) MA; MB 
       

MA.augment(MB,subdivide=True) 
       

simplificando o sistema

MA.augment(MB).rref() 
       
MA.pivots() 
       

Sistemas Lineares

Resolvenddo o sistema

MA = matrix(RDF,[[8.0,9.1,1.9],[0.5,5.5,3.6],[8.9,1.0,6.1]]) MB = vector(RDF,[8.1,-3.0,7.5]) MA ; MB 
       

X = MA\MB X 
       
X = MA.solve_right(MB) X 
       
 
       

Decomposição LU

Ax = b

A = LU

P*A = L*U

  • P is a square permutation matrix, of siz, so is all zeroes, but with exactly a single one in each row and each column.
  • L is lower-triangular, square of siz, with every diagonal entry equal to one.
  • U is upper-triangular with size, i.e. entries below the “diagonal” are all zero.
P,L,U = MA.LU() P; L; U 
       


# Testando L*U 
       

Método de Cholesky

Este método se aplica quando a matriz dos coeficientes A é simétrica (A = A^t) e definida positiva. Nesta situação, a matriz A pode ser fatorada em A=LU=LL^t.

MC = matrix([[4,2,14],[2,17,-5],[14,-5,83]]) MC 
       
MC.transpose() == MC 
       
MC.cholesky() 
       
%time A = random_matrix(RDF,5000,5000) B = random_vector(RDF,5000) 
       
CPU time: 4.88 s,  Wall time: 4.88 s
CPU time: 4.88 s,  Wall time: 4.88 s
%time xx =A\B 
       
CPU time: 9.13 s,  Wall time: 9.13 s
CPU time: 9.13 s,  Wall time: 9.13 s
%time x = A.solve_right(B) 
       
CPU time: 9.21 s,  Wall time: 9.21 s
CPU time: 9.21 s,  Wall time: 9.21 s
xx[99]; x[99] 
       

Utilizando o NumPy

%time from numpy import linalg x = linalg.solve(A,B) 
       
CPU time: 21.12 s,  Wall time: 21.29 s
CPU time: 21.12 s,  Wall time: 21.29 s
reset() 
       
import numpy as np AA = np.random.rand(5000,5000) BB = np.random.rand(5000,1) Aa = np.matrix(AA) Bb = np.matrix(BB) 
       
 
       
%time xy = np.linalg.solve(Aa,Bb) 
       
CPU time: 8.91 s,  Wall time: 8.91 s
CPU time: 8.91 s,  Wall time: 8.91 s
%time xy = np.linalg.solve(AA,BB) 
       
CPU time: 8.32 s,  Wall time: 8.31 s
CPU time: 8.32 s,  Wall time: 8.31 s
reset() 
       
A = random_matrix(GF(2), 5000, 5000) b = random_vector(GF(2), 5000) 
       
A[299] 
       
%time x = A\b 
       
CPU time: 0.20 s,  Wall time: 0.24 s
CPU time: 0.20 s,  Wall time: 0.24 s
x[299] 
       
%time x = A.solve_left(b) 
       
CPU time: 0.20 s,  Wall time: 0.20 s
CPU time: 0.20 s,  Wall time: 0.20 s
x[466] 
       

Comparação com outros Softwares

Julia Octave MatLab Julia Python Sage RDF   
      2.326s*  3.38s A/B : 8.480s*

Linalg: 8.523s*

* tempo médio em segundos numa máquina I5 Haswell, 8GB Ram, Linux NETRunner 17, SageMath 7.0

Aritmética em RR(reais) é mais lento do que aritmética com tipos C nativos. 

 
       

AUTOVETORES E AUTOVALORES

A = matrix([[0, 4], [-1, 0]]) A 
       
A.eigenvalues () 
       
A.eigenvectors_left() ; A.eigenvectors_right() 
       

A.eigenmatrix_left() ; A.eigenmatrix_right() 
       

%%% Fim Algebra linear %%%