# importando a biblioteca numpy do python
import numpy
# importando a biblioteca matplotlib do python
import matplotlib.pyplot as plt
%matplotlib inline
# importando a biblioteca 'plot_helper'
from plot_helper import *
Podemos ter o seguinte sistema de equações:
e expressá-los com o uso de matrizes:
$\begin{bmatrix} 1 & 1 \\ -1 & 1 \\ \end{bmatrix} $ . $\begin{bmatrix} x \\ y \\ \end{bmatrix}$ = $\begin{bmatrix} 1 \\ 5 \\ \end{bmatrix}$
Pode-se descobrir as incógnitas utilizando os seguintes métodos:
Vamos encontrar um possível valor para as variáveis x e y, utilizando o método acima já discutido em programas anteriores.
# definindo uma matriz matrizA
matrizA = numpy.array([[1,1],[-1,1]])
# definindo uma matriz matrizB
matrizB = numpy.array([[1],[5]])
# imprime a matrizA
print("A matriz ampliada A é:\n\n", matrizA)
A matriz ampliada A é: [[ 1 1] [-1 1]]
#imprime a matrizB
print("A matriz B é:\n\n", matrizB)
A matriz B é: [[1] [5]]
# define a matriz inversa matrizA_inversa de matrizA
matrizA_inversa = numpy.linalg.inv(matrizA)
# imprime a matriz inversa de A
print("A matriz inversa de A é:\n\n", matrizA_inversa)
A matriz inversa de A é: [[ 0.5 -0.5] [ 0.5 0.5]]
# faz a multiplicação da matriz inversa matrizA_inversa com a matrizB
(x,y) = numpy.dot(matrizA_inversa, matrizB)
E desse modo, temos como valor de x e y:
# inprime os coeficientes x e y da função
print("x = {} e y = {}".format(int(x), int(y)))
x = -2 e y = 3
Logo, temos duas equações:
Com elas podemos usar representações gráficas para analisar os resultados do sistema. Para esse fim, temos a ideia de que:
Os gráficos destas equações são retas, digamos $l_{1}$ e $l_{2}$. Como um ponto (x,y) está na reta se, e somente se, os números x e y satisfazem a equação da reta, as soluções do sistema de equações correspondem a pontos de corte $l_{1}$ e $l_{2}$. Existem três possibilidades:
As retas $l_{1}$ e $l_{2}$ podem ser paralelas, caso em que não há interseção e consequentemente não existe nenhuma solução do sistema.
As retas $l_{1}$ e $l_{2}$ podem cortar-se em um único ponto, caso em que o sistema tem exatamente uma solução.
As retas $l_{1}$ e $l_{2}$ podem coincidir, caso em que existe uma infinidade de soluções.
Vamos agora ver como se dá o comportamento gráfico das duas equações:
# define valores arbitrários para a variável x, entre -4 e 2
valoresX = numpy.linspace(-4,2)
# coordenadas associadas ao x
x1, x2 = -1, 1
# valor resultante da operação do sistema
b1, b2 = 1, 5
# definindo o tamanho da figura
plt.figure(figsize=(10,5))
# plota a primeira reta y = 1 - x
plt.plot(valoresX, x1 * valoresX + b1, color = "Red", label = "y = 1 - x ")
# plota a segunda reta y = 5 + x
plt.plot(valoresX, x2 * valoresX + b2, color = "Yellow", label = " y = 5 + x")
# adiciona o ponto de interseção entre as retas
plt.scatter(x, y, color = "Green", label = "Valores para (x,y)")
# adiciona legendas ao gráfico
plt.legend()
# remove a caixa preta nas bordas do gráfico
plt.box(False)
# desenho do quadriculado do gráfico
plt.grid(True)
plt.title("Gráfico que relaciona y em função de x")
Text(0.5, 1.0, 'Gráfico que relaciona y em função de x')
Pode-se perceber o único valor aceitável para a variável y é y = 3, dado que so há um ponto de interseção. De mesmo modo, o único valor aceitável para x é x = -2, dado que só há um ponto de interseção.
Vamos tentar fazer o mesmo exemplo com a seguinte matriz de coeficientes:
$\begin{bmatrix} 4 & 7 \\ 2 & 3.5 \\ \end{bmatrix}$
Observe que a segunda linha da matriz de coeficientes possuí a metade dos valores da primeira linha. Logo, percebe-se que são múltiplos.
# definindio a matriz matrizC
matrizC = numpy.array([[4,7],[2,3.5]])
# imprimindo a matrizC
print("A matriz C é:\n\n", matrizC)
A matriz C é: [[4. 7. ] [2. 3.5]]
Vamos aplicar uma transformação linear, considerando-a como a matriz de transformação:
# aplicando a transformação linear com a matrizC
plot_linear_transformation(matrizC)
É perceptível que os vetores são colineares.
Vamos plotar o seu gráfico utilizando as seguintes equações de reta, levando em consideração os valores resultantes da matriz de coeficientes anteriores e valores arbitrátios $b_{1} = 1$ e $b_{2} = 5$.
São elas:
Vamos plotar o gráfico dessas duas retas e analisar se há interseção entre elas.
# define valores arbitrários para a variável x, entre -4 e 2
valoresX = numpy.linspace(-4,2)
# coordenadas associadas a x
x1, x2 = -4 / 7, -2 / 3.5
# valor resultante da operação do sistema
b1, b2 = 1 / 7, 5 / 3.5
# definindo o tamanho da figura
plt.figure(figsize = (10,5))
# plota a primeira reta y = (-4x + 1) / 7
plt.plot(valoresX, x1 * valoresX + b1, color = "Black", label = "y = (-4x + 1) / 7")
# plota a segunda reta y = (-2x + 5) / 3.5
plt.plot(valoresX, x2 * valoresX + b2, color = "Gray", label = "y = (-2x + 5) / 3.5")
# adiciona a legenda no gráfico
plt.legend()
# remove a caixa preta nas bordas do gráfico
plt.box(False)
# desenho do quadriculado do gráfico
plt.grid(True)
# adiciona o título ao gráfico
plt.title("Gráfico de y em função de x")
Text(0.5, 1.0, 'Gráfico de y em função de x')
Como era de se esperar, as retas são paralelas e não há interseção entre elas. Portanto, não há soluções para esse sistema.
Podemos usar o determinante para verificar a ideia acima.
# definindo o determinante da matriz de coeficientes matrizC
determinante = numpy.linalg.det(matrizC)
# imprimindo o determinante.
print("O determinante da matriz é: {}".format(determinante))
O determinante da matriz é: 0.0
Como era esperado, quando um sistema linear possui pelo menos uma solução, seu determinante da matriz de coeficientes tem que ser diferente de zero.
Nos exemplos acima, consideramos apenas duas equações em duas incógnitas, vamos ver que as mesmas três possibilidades (definições quando há uma interseção, mais interseções ou nenhuma interseção entre retas) valem para sistemas lineares arbitrários. Agora, vamos ver sistemas com 3 incógnitas.
Antes de começar, vamos ver um pouco como se dá uma transformação linear que envolvem 3 dimensões.
Temos a matriz abaixo, representando a base canônica:
# definindo uma matriz da base canônica
matriz = numpy.array([[1,0,0],[0,1,0],[0,0,1]])
# plotando o gráfico da matriz de transformação
plot_3d_linear_transformation(matriz)
Note que não houve mudanças significativas, dado que era uma transformação da base canônica para outra base canônica.
Agora observe como ocorreria uma transformação linear de uma matriz em 3 dimensões, essa que não descreve mais a base canônica. Além disso, considerando tal matriz como uma matriz de coeficientes para um sistema linear, tal sistema teria solução e nenhhuma variável livre. Por esse motivo, a trasformação mantém um espaço vetorial de três dimensões.
Considere a matriz:
$matriz = \begin{bmatrix} 1 & 0 & 1 \\ 1 & 1 & 0 \\ -1 & 1 & 1 \\ \end{bmatrix}$
# definindo uma matriz
matriz_3_dimensoes = numpy.array([[1,0,1],[1,1,0],[-1,1,1]])
# imprime na tela a matriz obtida
print("A matriz é:\n\n", matriz_3_dimensoes)
A matriz é: [[ 1 0 1] [ 1 1 0] [-1 1 1]]
# plotando o gráfico da matriz de transformação
plot_3d_linear_transformation(matriz_3_dimensoes)
E dessa forma, pode-se averiguar que ela tem três dimensões, dado que entre as três variáveis disponíveis nenhuma é uma variável livre:
# verificando a dimensão do espaço vetorial
print("A dimensão do espaço vetorial é: {}".format(numpy.linalg.matrix_rank(matriz_3_dimensoes)))
A dimensão do espaço vetorial é: 3
Agora vamos supor o seguinte sistema de equações:
Vamos resolver metodicamente e descobrir o valor de cada componente do sistema de equações:
Assim, teremos:
Assim, veja que z é uma variável livre.
então, na verdade, só temos duas equações que satisfazem o sistema. Desse modo, teremos o seguinte gráfico:
# definindo uma matriz
matriz_2_dimensoes = numpy.array([[1,2,7],[0,1,3],[-3,1,0]])
# imprime a matriz
print("A matriz é:\n\n", matriz_2_dimensoes)
A matriz é: [[ 1 2 7] [ 0 1 3] [-3 1 0]]
#plota o gráfico da matriz
plot_3d_linear_transformation(matriz_2_dimensoes)
Como era de se esperar, dado que esse sistema tem uma variável livre entre três variáveis disponíveis, teremos um espaço vetorial de duas dimensões ao invés de três.
Comprove isso vendo que:
# verificando a dimensão do espaço vetorial
print("A dimensão do espaço vetorial é:", numpy.linalg.matrix_rank(matriz_2_dimensoes))
A dimensão do espaço vetorial é: 2
Agora analisem esse sistema de equações:
Vamos novamente resolver metodicamente esse sistema de equações:
ou
ou
ou
E dessa forma, temos duas variáveis livres.
Vamos analisar o gráfico abaixo sobre esse respectivo sistema.
# definindo uma matriz
matriz_1_dimensao = numpy.array([[1,2,1],[-1,-2,-1],[3,6,3]])
# imprimindo a matriz
print("A matriz é:\n\n", matriz_1_dimensao)
A matriz é: [[ 1 2 1] [-1 -2 -1] [ 3 6 3]]
# plota o gráfico da matriz de transformação
plot_3d_linear_transformation(matriz_1_dimensao)
Como era de se esperar, após toda uma análise, teremos um espaço vetorial de uma dimensão ao invés de três dimensões, dado que tal sistema linear possui duas variáveis livres entres três variáveis disponíveis.
Novamente, verifique tal afirmação abaixo:
# verificando a dimensão do espaço vetorial
print("A dimensão do espaço vetorial é:", numpy.linalg.matrix_rank(matriz_1_dimensao))
A dimensão do espaço vetorial é: 1