Vamos resolver alguns problemas numéricos usando a biblioteca SymPy da linguagem de programação Python.
Primeiro vamos carregar as funções que vamos utilizar da biblioteca.
from sympy import Matrix, zeros, linsolve, S
41.1 Escolher base de sistemas geradores
Exemplo 41.1 Provamos na aula que todo sistema gerador de um espaço vetorial \(V\) contem um subsistema que seja uma base de \(V\). Considere o seguinte problema numérico. Seja \(W_1\) o subespaço de \(\mathbb R^{12}\) gerado pelas linhas do seguinte matriz.
Para toda linha L da matriz M1 fazemos a seguinte computação.
Juntar a linha L à matriz bas_esc.
Computar a forma escalonada reduzida da matriz obtida no ponto i) e chame esta matriz bas_esc.
Se a matriz bas_esc tem uma linha nula, então a linha L é linearmente dependente das linhas já processadas e ela não é necessária na base de \(W_1\). Neste caso, deletamos a última linha nula da bas_esc.
Se a matriz bas_esc não tem linha nula, então a linha L é L.I. das linhas já processadas e ela precisa ser inserida na base de \(W_1\). Neste caso, inserimos o índice de L na lista ind_bas.
Este procedimento está implementado na função seguinte.
def ache_base( M ):# achar número de linhas e colunas em M rows, cols = M.shape# a lista vai conter a base# e a matriz que vai conter a forma esc reduzida ind_bas, bas_esc = [], Matrix( [] )for i inrange( rows ):# adicione a linha i de M a forma escalonada bas_esc = bas_esc.row_insert( bas_esc.rows, M[i,:] )# faça escalonamento bas_esc, _ = bas_esc.rref()# se a última linha é nula, pode deletar e # neste case esta linha não está na base if bas_esc.row(-1) == zeros( 1, cols ): bas_esc.row_del( bas_esc.rows-1 )else: # se a última linha é não nula, adiciona índice i à base ind_bas.append( i )# devolva a forma escalonada e a base return bas_esc, ind_bas
Obtemos que as linhas da matriz devolvida pela função no campo anterior formam uma base na forma escalonada reduzida para o espaço \(W_1\). Além disso, as linhas indexadas por \(0\), \(1\), \(2\), \(4\) também formam uma base de \(W_1\). Portanto \(\dim W_1=4\).
Primeiro queremos saber se \(W_1=W_2\). É fácil verificar que todo subespaço de \(\mathbb R^n\) possui base na forma escalonada reduzida e esta base é única. Portanto \(W_1=W_2\) se e somente se as suas bases na forma escalonada reduzida são as mesmas.
Vamos calcular a base escalondada reduzida usando o método rref() já disponível em SymPy.
Como as formas escalonadas reduzidas das duas matrizes são diferentes, temos que \(W_1\neq W_2\). Além disso, a computação anterior mostra também que \(\dim W_2=3\) enquanto \(\dim W_1=4\) (como já foi verificado).
41.3 Computar a soma
Exemplo 41.3 Vamos calcular a soma dos espaços \(W=W_1+W_2\). Como \(W_i\) é gerado pelas linhas de \(M_i\), temos que a soma vai ser gerado pela matriz \(M\) que obtemos por colar \(M_2\) abaixo de \(M_1\). Para calcular a base de \(W\), calculamos a forma escalonada reduzida de \(M\).
Obtemos que a forma escalonda reduzida de \(M\) contém \(5\) linhas não nulas. Portanto \[
\dim W=\dim (W_1+W_2)=5.
\] Isso implica também que \[
\dim (W_1\cap W_2) = \dim W_1+\dim W_2-\dim (W_1+W_2)=4+3-5=2.
\]
41.4 Determinar a base da interseção
Exemplo 41.4 Vamos usar o Algoritmo de Zassenhaus. Vamos montar a matriz em blocos da forma seguinte: \[
X=\begin{bmatrix} M_1& M_1\\ M_2 & 0 \end{bmatrix}
\] onde \(0\) significa uma matriz nula do tamanho certo. Ao calcular, a forma escalonada reduzida de \(X\), obtemos uma matriz em blocos \[
\begin{bmatrix} C_1 & C_2\\ 0 & C_3 \\ 0 & 0 \end{bmatrix}.
\] A parte \(C_1\) contém uma base para \(W_1+W_2\) enquanto a parte \(C_3\) contém uma base de \(W_1\cap W_2\).
Vamos verificar que os vetores estão nos espaços \(W_1\) e \(W_2\). Precisa escrever as duas linhas como combinação linear das linhas de \(M_1\) e \(M_2\). Para isso, podemos usar a função linsolve disponível em SymPy. Note que quando trabalhamos com equações lineares, nós vamos trabalhar com as colunas da matriz e precisa-se trabalhar com as transpostas.
Esta computação mostra que as duas linhas da matriz B_int pertencem ao espaço \(W_1\). O leitor pode verificar que elas pertencem também ao espaço \(W_2\).