#!/usr/bin/env python # coding: utf-8 # # Estudo de Sistemas de Equações # #### Em matemática, um conjunto de equações simultâneas, também conhecido como um sistema de equações, é um conjunto finito de equações para os quais tem uma única solução, nenhuma solução ou infinitas soluções. # ### Importação das Bibliotecas # In[1]: # importando a biblioteca numpy do python import numpy # importando a biblioteca matplotlib do python import matplotlib.pyplot as plt get_ipython().run_line_magic('matplotlib', 'inline') # In[2]: # importando a biblioteca 'plot_helper' from plot_helper import * # ### Matrizes como Sistemas de Equações # Podemos ter o seguinte sistema de equações: # - $x + y = 1$ # - $-x + y = 5$ # 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: # $$A.X = B$$ # $$X = A^{-1}B$$ # Vamos encontrar um possível valor para as variáveis x e y, utilizando o método acima já discutido em programas anteriores. # In[3]: # definindo uma matriz matrizA matrizA = numpy.array([[1,1],[-1,1]]) # definindo uma matriz matrizB matrizB = numpy.array([[1],[5]]) # In[4]: # imprime a matrizA print("A matriz ampliada A é:\n\n", matrizA) # In[5]: #imprime a matrizB print("A matriz B é:\n\n", matrizB) # In[6]: # define a matriz inversa matrizA_inversa de matrizA matrizA_inversa = numpy.linalg.inv(matrizA) # In[7]: # imprime a matriz inversa de A print("A matriz inversa de A é:\n\n", matrizA_inversa) # In[8]: # 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: # In[9]: # inprime os coeficientes x e y da função print("x = {} e y = {}".format(int(x), int(y))) # Logo, temos duas equações: # - $y = 1 - x$ # - $y = 5 + x$ # 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: # - $y = 1 - x$ # - $y = 5 + x$ # In[10]: # 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") # 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. # In[11]: # definindio a matriz matrizC matrizC = numpy.array([[4,7],[2,3.5]]) # In[12]: # imprimindo a matrizC print("A matriz C é:\n\n", matrizC) # Vamos aplicar uma transformação linear, considerando-a como a matriz de transformação: # In[13]: # 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: # - $y = \frac{(-4x + 1)}{7}$ # - $y = \frac{(-2x + 5)}{3.5}$ # Vamos plotar o gráfico dessas duas retas e analisar se há interseção entre elas. # In[14]: # 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") # 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. # In[15]: # definindo o determinante da matriz de coeficientes matrizC determinante = numpy.linalg.det(matrizC) # In[16]: # imprimindo o determinante. print("O determinante da matriz é: {}".format(determinante)) # 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. # ### Sistemas Lineares com mais variáveis # 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: # $$\begin{bmatrix} # 1 & 0 & 0 \\ # 0 & 1 & 0 \\ # 0 & 0 & 1 \\ # \end{bmatrix}$$ # In[17]: # definindo uma matriz da base canônica matriz = numpy.array([[1,0,0],[0,1,0],[0,0,1]]) # In[18]: # 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. # ### Exemplo: Nenhuma Variável Livre # 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}$ # In[19]: # definindo uma matriz matriz_3_dimensoes = numpy.array([[1,0,1],[1,1,0],[-1,1,1]]) # In[20]: # imprime na tela a matriz obtida print("A matriz é:\n\n", matriz_3_dimensoes) # In[21]: # 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: # In[22]: # verificando a dimensão do espaço vetorial print("A dimensão do espaço vetorial é: {}".format(numpy.linalg.matrix_rank(matriz_3_dimensoes))) # #### Exemplo: Uma Variável Livre # Agora vamos supor o seguinte sistema de equações: # - **x + 2y + 7z = 0** # - **y + 3z = 0** # - **-3x + y = 0** # Vamos resolver metodicamente e descobrir o valor de cada componente do sistema de equações: # - **1 - ) y = 3x** # - **2 - ) 3x = - 3z** # - **3 - ) 7x = - 7z** # Assim, teremos: # - **4 - ) x = -z** # - **5 - ) y = 3x** # 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: # In[23]: # definindo uma matriz matriz_2_dimensoes = numpy.array([[1,2,7],[0,1,3],[-3,1,0]]) # In[24]: # imprime a matriz print("A matriz é:\n\n", matriz_2_dimensoes) # In[25]: #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: # In[26]: # verificando a dimensão do espaço vetorial print("A dimensão do espaço vetorial é:", numpy.linalg.matrix_rank(matriz_2_dimensoes)) # #### Exemplo: 2 variáveis livres # Agora analisem esse sistema de equações: # - **x + 2y + z = 0** # - **x - 2y - z = 0** # - **3x + 6y + 3z = 0** # Vamos novamente resolver metodicamente esse sistema de equações: # - **1 - ) x = -2y - z** # ou # - **2 - ) y = (-x - z) / 2** # ou # - **2 - ) y = (-x - z) / 2** # ou # - **3 - ) z = -2y - x** # E dessa forma, temos duas variáveis livres. # Vamos analisar o gráfico abaixo sobre esse respectivo sistema. # In[27]: # definindo uma matriz matriz_1_dimensao = numpy.array([[1,2,1],[-1,-2,-1],[3,6,3]]) # In[28]: # imprimindo a matriz print("A matriz é:\n\n", matriz_1_dimensao) # In[29]: # 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: # In[30]: # verificando a dimensão do espaço vetorial print("A dimensão do espaço vetorial é:", numpy.linalg.matrix_rank(matriz_1_dimensao)) # #### Funções definidas por L. Barba e T. Wang para uma apresentação no evento SciPy 2019: # ##### plot_vector, plot_linear_transformation e plot_linear_transformations # ### Alguma Dúvida? Entre em Contato Comigo: # - [Me envie um e-mail](mailto:alysson.barbosa@ee.ufcg.edu.br);