Prévia do material em texto
06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 1/72 Sistemas de equações lineares e ajustes de curvas em Python Prof. Francisco Roberto da Rocha Gomes Descrição Sistemas de equações lineares e ajuste de curvas, utilizando exemplos na linguagem Python, e métodos clássicos para solução de sistemas lineares na forma direta e iterativas e interpolação de Lagrange e Newton. Propósito Solução de sistemas lineares e interpolação e ajuste de curvas é essencial para formação de um profissional que trabalhará com modelagem matemática. Preparação Antes de iniciar o estudo deste conteúdo, pesquise e acesse as páginas indicadas para a execução dos scripts: a) Python: https://www.python.org/ b) Jupyter: https://jupyter.org/try 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 2/72 c) Google: https:/research.google.com/colaboratory/ Objetivos Módulo 1 Métodos diretos para resolução de sistemas: Gauss-Jordan e decomposição LU Reconhecer os conceitos básicos de métodos diretos e iterativos. Módulo 2 Métodos iterativos para resolução de sistemas: Gauss-Jacobi e Gauss-Seidel Aplicar os recursos do Python na solução de sistemas de equações lineares. Módulo 3 Interpolação polinomial: Lagrange e Newton Analisar os principais métodos de interpolação. Módulo 4 Ajuste de funções: funções polinomiais e linearizáveis Calcular extrapolações com ajuste de curvas. O conteúdo a seguir, divididos em quatro módulos, é o mais importante no assunto de modelagem matemática, pois, a partir de agora, todos os outros métodos utilizarão algum tipo de solução de sistemas equações lineares, seja por meio de métodos diretos, como a eliminação de Gauss, seja por Introdução 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 3/72 1 - Métodos diretos para resolução de sistemas: Gauss- Jordan e decomposição LU Ao �nal deste módulo, você será capaz de reconhecer os conceitos básicos de métodos diretos e iterativos. métodos iterativos, como Gauss-Seidel. Veremos um exemplo disso no modulo de interpolação e de ajuste de curvas, em que utilizamos métodos de solução de sistemas lineares. A interpolação, por muito tempo, foi a ferramenta mais utilizada, eram comuns publicações de diversas tabelas de valores calculados de funções complexas. Para obter um valor que não estava tabelado, usava-se interpolação. A teoria de interpolação é muito importante para entender outros métodos de modelagem matemática, como a integração numérica. Por fim, apresentaremos técnicas de ajuste de curvas, que nos permitem realizar extrapolações, a partir de dados coletados em experimentos e observações. O ajuste de curvas tem uma ligação estreita com estatística, tanto que as soluções são estimativas que dependem das observações e do modelo matemático. 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 4/72 Soluções de sistemas lineares Solução de sistemas lineares é umas das mais importantes nos métodos numéricos. Para exemplificar os métodos, usaremos um problema, que será o nosso modelo para apresentar alguns métodos diretos de resolução de sistemas. Problema Suponha que um objeto possa estar em qualquer lugar dos n+1 pontos uniformemente espaçados $$$\mathrm{x}_{0}, \mathrm{x}_{1}, \ldots, \mathrm{x}_{\mathrm{n}}$$$. Quando um objeto se encontra no lugar $$$\mathrm{X}_{\mathrm{i}}$$$, ele tem a mesma probabilidade de se mover para $$$\mathrm{X}_{\mathrm{i}+1}$$$ ou para $$$\mathrm{X}_{\mathrm{i}-1}$$$, mas não pode ir diretamente para nenhum outro lugar. Considere as probabilidades $$$\left\{P_{i}\right\}_{i=0}^{n}$$$ de que um objeto que parte do lugar $$$\mathrm{X}_{\mathrm{i}}$$$ chegue ao extremo esquerdo $$$\mathrm{x}_{0}$$$ antes de alcançar o extremo direito $$$\mathrm{x}_{n}$$$. Dado que o objeto pode mover-se até $$$\mathrm{X}_{\mathrm{i}}$$$ apenas a partir de $$$\mathrm{X}_{\mathrm{i}-1}$$$ ou de $$$\mathrm{X}_{\mathrm{i}+1}$$$ e o faz com a probabilidade 1/2 para cada um desses lugares: $$2 P_{i}=P_{i-1}+P_{i+1}, \text { para } i=1,2,3, \ldots, \mathrm{n}-1$$ Rotacione a tela. Seja o vetor $$$\mathbf{p}=\left[\begin{array}{llll}P_{1} & P_{2} & \left.{\ldots . .} P_{n- 1}\right]^{\top}\end{array}\right.$$$, a matriz A e o vetor b, tal que Ap = b. Considere os itens a seguir: a) Resolva o sistema usando n = 4. b) Resolva o sistema usando n = 100. Solução do item a: A chave desse problema é perceber que $$$P_{0}=1$$$ e que $$$P_{n}=0,$$$, no caso do item a, $$$P_{4}=0$$$, então, fazendo i = 1, 2 e 3, teremos as seguintes equações: $$ \begin{aligned} &2 P_{1}=P_{0}+P_{2} \\ &2 P_{2}=P_{1}+P_{3} \\ &2 P_{3}=P_{2}+P_{4} \end{aligned} $$ 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 5/72 Rotacione a tela. Organizando as equações obtemos o seguinte sistema: $$\begin{gathered} 2 P_{1}-P_{2}=P_{0} \\ -P_{1}+2 P_{2}-P_{3}=0 \\ -P_{2}+2 P_{3}=P_{4} \end{gathered}$$ Rotacione a tela. Substituindo $$$P_{ 0}=1$$$ e $$$P_{4}=0$$$ e colocando na forma matricial, teremos: $$\left[\begin{array}{ccc} 2 & -1 & 0 \\ -1 & 2 & -1 \\ 0 & -1 & 2 \end{array}\right]\left[\begin{array}{l} P_{1} \\ P_{2} \\ P_{3} \end{array}\right]=\left[\begin{array}{l} 1 \\ 0 \\ 0 \end{array}\right]$$ Rotacione a tela. Como foi sugerido no problema, chamaremos de A a matriz: $$\left[\begin{array}{ccc} 2 & -1 & 0 \\ -1 & 2 & -1 \\ 0 & -1 & 2 \end{array}\right]$$ Rotacione a tela. E de p e b, respectivamente, os vetores: $$\left[\begin{array}{l} P_{1} \\ P_{2} \\ P_{3} \end{array}\right] \mathrm{e}\left[\begin{array}{l} 1 \\ 0 \\ 0 \end{array}\right]$$ Rotacione a tela. Comentário O principal método que vamos abordar e que será a semente para os outros é a eliminação de Gauss. O princípio desse método é criar uma matriz que definimos como matriz aumentada do sistema, [A|b], ou seja, acrescentar uma coluna na matriz A igual ao vetor b. 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 6/72 Em nosso problema fica assim: $$[A \vee b]=\left[\begin{array}{cccc} 2 & -1 & 0 & 1 \\ -1 & 2 & -1 & 0 \\ 0 & -1 & 2 & 0 \end{array}\right]$$ Rotacione a tela. Após criar a matriz aumentada, vamos realizar o escalonamento, que é fazer uma escada na matriz aumentada e zerar os elementos que se encontram abaixo da escada, conforme a seguir: $$=\left[\begin{array}{cccc} 2 & -1 & 0 & 1 \\ -1 & 2 & -1 & 0 \\ 0 & -1 & 2 & 0 \end{array}\right]$$ Rotacione a tela. Para realizar os seguintes passos 1º passo A primeira linha a ser modificada será a linha 2, então, para zerar o termo -1 devemos multiplicar a linha 1 por um fator m e subtrair na linha 2. No caso do nosso problema, $$$m=-1 / 2$$$, resultando na seguinte operação: $$\operatorname{Linha}(2)=\operatorname{Linha}(2)-m \times \operatorname{Linha}(1)$$ Rotacione a tela. A linha 1 dessa operação é chamada de linha pivô. Não é necessário fazer essa operação na linha 3 utilizando a linha pivô 1, pois já existe um elemento zero. Podemos visualizar o resultado dessa operação na imagem a seguir: 2º passo 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 7/72 Vamos modificar a terceira linha, e a segunda linha será a nossa linha pivô, logo, semelhante ao 1º passo: $$\operatorname{Linha}(3)=\operatorname{Linha}(3)-m \times \operatorname{Linha}(2)$$ Rotacione a tela. Em que m = - 2/3, o que resulta em todos os elementos abaixo da escada iguais a zero, conforme a imagema seguir: 3º passo Vamos observar o sistema de equações após as modificações: $$\begin{gathered}2 P_{1}-P_{2}=1 \\3 / 2 P_{2}-P_{3}=1 / 2 \\4 / 3 P_{3}=2 / 6\end{gathered}$$ Rotacione a tela. Vamos resolver esse sistema usando um método elementar: substituição retroativa . Em nosso caso, resolvemos a última linha, que é a terceira linha, depois substituímos o valor encontrado na linha anterior, segunda linha, e por fim, substituímos o segundo valor na primeira linha. Como mostrado nas equações a seguir: $$\begin{gathered}4 / 3 P_{3}=2 / 6 \Rightarrow P_{3}=1 / 4=0,25 \\3 / 2 P_{2}-1 / 4=1 / 2 \Rightarrow P_{2}=1 / 2=0,5 \\2 P_{1}-1 / 2=1 \Rightarrow P_{1}=3 / 4=0,75\end{gathered}$$ Rotacione a tela. Solução do item b: Para solucionar o item b, para n = 100, levaremos muito tempo fazendo à mão, logo, precisaremos realizar um algoritmo do método abordado no item a. 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 8/72 Eliminação de Gauss Veja agora os principais conceitos citados ao longo deste módulo. Algoritmo do método de eliminação de Gauss Método da substituição retroativa Para começarmos a descrever o algoritmo, iniciaremos pelo final, descreveremos o algoritmo da substituição retroativa. Note que, após o processo de escalonamento, o sistema linear ficou com esta aparência: $$\left[\begin{array}{ccc}2 & -1 & 0 \\0 & 3 / 2 & -1 \\0 & 0 & 4 / 3\end{array}\right]\left[\begin{array} {l}P_{1} \\P_{2} \\P_{3}\end{array}\right]=\left[\begin{array}{c}1 \\1 / 2 \\2 / 6\end{array}\right]$$ Rotacione a tela. A matriz A transformou-se em uma matriz triangular superior, a qual a batizaremos de U (do inglês up). De um modo geral, um sistema triangular superior (Ux=c) de ordem 3x3 tem o seguinte formato: 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 9/72 $$ \left[\begin{array}{ccc} U_{0,0} & U_{0,1} & U_{0,2} \\ 0 & U_{1,1} & U_{1,2} \\ 0 & 0 & U_{2,2} \end{array}\right]\left[\begin{array}{l} x_{0} \\ x_{1} \\ x_{2} \end{array}\right]=\left[\begin{array}{l} c_{0} \\ c_{1} \\ c_{2} \end{array}\right] $$ Rotacione a tela. Resolvendo-o: $$ 1^{\circ}-x_{2}=\frac{c_{2}}{U_{2,2}}, 2^{\circ}-\chi_{1}=\frac{c_{1}-U_{1,2} x_{2}}{U_{1,1}} \mathrm{e} 3^{\circ}-\chi_{0}=\frac{c_{0}-U_{0,1} x_{1}-U_{0,2} x_{2}}{U_{0,0}}$$ Rotacione a tela. Generalizando para um sistema triangular superior de ordem n: $$ x_{i}=\frac{\left(c_{i}-\sum_{j=i+1}^{n-1} U_{i, j} x_{j}\right)}{U_{i, i}} \text { para } i=n-1, n-2, \ldots, 1,0 $$ Rotacione a tela. Em Python, definiremos a seguinte função: Python Vamos descrever essa função SubRet(U,c). O primeiro ponto são os parâmetros de entrada, a matriz U e vetor c, do sistema triangular superior (Ux=c). No Python, para escrever uma matriz e um vetor, usamos o módulo Numpy, iniciando com import numpy as np. Escrever uma matriz é semelhante a escrever uma lista, mas usando o comando np.array(lista). Vamos aplicar como exemplo o problema anterior: $$ x_{i}=\frac{\left(c_{i}-\sum_{j=i+1}^{n-1} U_{i, j} x_{j}\right)}{U_{i, i}} \text { para } i=n-1, n-2, \ldots, 1,0 $$ def SubRet(U,c): n=c.size x=np.zeros(n) for i in reversed(range(n)): x[i] = (c[i] -U[i,i+1:]@x[i+1:])/U[i,i] return x 1 2 3 4 5 6 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 10/72 Rotacione a tela. Teremos U = np.array([[2.,-1.,0.],[0.,3/2,-1.],[0.,0.,4/3]]) e c=np.array([1.,1/2,2/6]) A segunda linha utiliza o comando n=c.size. Isso significa que n receberá o tamanho de c, no nosso exemplo, n=3, que será a ordem da matriz, 3x3. O terceiro comando, x=np.zeros(n), cria um vetor de tamanho n, caso 3, com todos os elementos iguais a zero. Isso é feito para criar o espaço em que serão colocados os valores de x calculados. A quarta linha é o comando for com a variável i iterando no vetor reversed(range(n)). O comando range cria uma lista de números inteiros de 0 a n-1, o comando reversed inverte o início e o fim, ou seja, o vetor começa em n-1 e vai até o 0, como se encontra na fórmula de x. Por último, a quinta linha do programa,$$$x[i]=(c[i]-U[i, i+1:[@ x[i+1:]) / U[i, i]$$$, que é tradução no Python para a fórmula: $$x_{i}=\frac{\left(c_{i}-\sum_{j=i+1}^{n-1} U_{i, j} x_{j}\right)}{U_{i, i}}$$ Rotacione a tela. Define-se produto escalar de dois vetores, v e u, como: $$$v \odot u=\sum_{i}^{n-1} v_{i} u_{i}$$$, logo, em Python, v@u resulta no somatório do produto de cada elemento do vetor v e u. Na fórmula de x, temos um somatório que multiplica uma linha - i da matriz U, iniciando na coluna j=i+1 como parte do vetor x, que começa em i+1 até o final n-1. Resumindo, para resolver o problema: Atenção! Devemos atentar para o comando @, que faz a multiplicação matricial, ou seja, se temos duas matrizes A e B, o produto matricial de AB em Python é A@B. Da mesma maneira, quando queremos realizar o produto escalar de dois vetores v e u. 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 11/72 $$ \left[\begin{array}{ccc} 2 & -1 & 0 \\ 0 & 3 / 2 & -1 \\ 0 & 0 & 4 / 3 \end{array}\right]\left[\begin{array}{l} P_{1} \\ P_{2} \\ P_{3} \end{array}\right]=\left[\begin{array}{c} 1 \\ 1 / 2 \\ 2 / 6 \end{array}\right] $$ Rotacione a tela. Utilizaremos esta linha de código: Python Como resultado do print(SubRet(U,c)), teremos [0.75 0.5 0.25]. Método de Eliminação de Gauss Usando os passos já vistos, basicamente multiplicamos por um fator m uma linha k, pivô, e subtraímos das linhas abaixo da linha pivô $$$(\mathrm{k}+1, \mathrm{k}+2, \ldots . \mathrm{n}-1)$$$, zerando os elementos abaixo do elemento da diagonal principal da matriz $$$\mathrm{A_{k,k}}$$$, ou seja, iniciamos com o sistema Ax=b e transformamos no sistema Ux=c como na formulação a seguir: $$\operatorname{linh} a(i)=\operatorname{linh} a(i)-m \times \operatorname{linh} a(\text { pivô }), \text { onde } m=\frac{A_{i, k}}{A_{k, k}}$$ Rotacione a tela. Expondo na forma matricial: import numpy as np U= np.array([[2.,-1.,0.],[0,3/2,-1],[0,0,4/3]]) c=np.array([1.0,1/2,2/6]) def SubRet(U,c): n=c.size x=np.zeros(n) for i inreversed(range(n)): x[i] = (c[i] -U[i,i+1:]@x[i+1:])/U[i,i] return x print(SubRet(U,c)) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 12/72 $$\operatorname{linha}(i)=\operatorname{linha}(i)-m \times \operatorname{linha}(\text { pivô }), \text { onde } m=\frac{A_{i, k}}{A_{k, k}}$$ Rotacione a tela. Essa expressão escrita em Python ficaria da seguinte forma: Python Com isso, podemos definir uma função que realiza a eliminação de Gauss: Python A única diferença nesse algoritmo é o comando U=np.copy(A) e c=np.copy(b). Para manter o registro dos dados iniciais (A e b), definimos como cópia as matrizes U e b, as quais serão transformadas e depois utilizaremos o método da substituição retroativa já estudado. O exemplo a seguir resolve o nosso problema de motivação: $$ \left[\begin{array}{ccc} 2 & -1 & 0 \\ -1 & 2 & -1 \\ 0 & -1 & 2 \end{array}\right]\left[\begin{array}{l} P_{1} \\ P_{2} \\ P_{3} \end{array}\right]=\left[\begin{array}{l} 1 \\ 0 \\ 0 \end{array}\right] $$ Rotacione a tela. Python for k in range(n-1): for i in range(k+1,n): m = A[i,k]/A[k,k] A[i,k:] -= m*A[k,k:] b[i] -= m*b[k] def ElimGauss(A, b): U = np.copy(A) c = np.copy(b) n = c.size for j in range(n-1): for i in range(j+1,n): 1 2 3 4 5 1 2 3 4 5 6 06/06/2022 21:26 Sistemas de equaçõeslineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 13/72 Python Método de eliminação de Gauss-Jordan O método de eliminação de Gauss-Jordan é semelhante ao método de Gauss. Vimos que em Gauss o sistema original Ax=b é transformado em sistema equivalente Ux=c, em que U é uma matriz triangular superior, e usamos a solução de substituição retroativa. O método de Gauss-Jordan usa os mesmos processos elementares de multiplicação das linhas pivô e subtração das outras linhas da matriz original A. A diferença é que, em Gauss-Jordan, fazemos isso em todas as linhas, as que estão abaixo (Gauss) e as que estão acima, zerando todos os elementos, exceto a da diagonal principal, que será dividida pelo seu próprio valor para torná-lo igual a 1, transformando-a em uma matriz equivalente, Rx=d. Essa matriz é definida como a matriz reduzida de A e é igual à matriz identidade, I. No fim desse método, o vetor d será a solução do sistema. Veremos os passos no sistema do problema original: import numpy as np A=np.array([[2.,-1.,0.],[-1.,2.,-1.],[0.,-1.,2.]]) b=np.array([1.,0,0]) def ElimGauss(A, b): U =np.copy(A) c = np.copy(b) n = c.size for j inrange(n-1): for i inrange(j+1,n): m = U[i,j]/U[j,j] U[i,j:] -= m*U[j,j:] c[i] -= m*c[j] x= [0.75 0.5 0.25] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 14/72 $$ [A \vee b]=\left[\begin{array}{cccc} 2 & -1 & 0 & 1 \\ -1 & 2 & -1 & 0 \\ 0 & -1 & 2 & 0 \end{array}\right] $$ Rotacione a tela. 1º passo (k=0) Começaremos na primeira linha e dividiremos toda a linha pelo elemento da diagonal principal, $$$\mathrm{A}[\mathrm{k}, \mathrm{k}]=\mathrm{A}[0,0]=2,$$$, resultando na seguinte matriz: $$ \left[\begin{array}{cccc} 1 & -1 / 2 & 0 & 1 / 2 \\ -1 & 2 & -1 & 0 \\ 0 & -1 & 2 & 0 \end{array}\right] $$ Rotacione a tela. Em seguida, vamos subtrair todas as linhas que estão abaixo e acima, mas como é a primeira linha, não temos acima, logo, Para 2ª linha e 3ª linha, o fator de multiplicação é $$$\mathrm{m}=\mathrm{A}[\mathrm{i}, \mathrm{k}] / \mathrm{A}[\mathrm{k}, \mathrm{k}]$$$, em que i varia de 0 a n-1, com exceção de k. Para 2ª linha, $$$\mathrm{m}=\mathrm{A}[1,0] / \mathrm{A}[0,0]$$$, como $$$\mathrm{A}[0,0]=1$$$, então, $$$\mathrm{m}=\mathrm{A}[1,0]=-1$$$. Para 3ª linha, em nosso problema não é necessário, pois ele já é igual a zero. Semelhante à eliminação de Gauss, faremos: $$\operatorname{linha}(i)=\operatorname{linha}(i)-m \times \operatorname{linha}(k)$$ Rotacione a tela. Resultando na seguinte matriz equivalente: Atenção! Observe que já foi colocada a matriz aumentada do sistema. 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 15/72 $$\left[\begin{array}{cccc}1 & -1 / 2 & 0 & 1 / 2 \\0 & 3 / 2 & -1 / 2 & 1 / 2 \\0 & -1 & 2 & 0\end{array}\right]$$ Rotacione a tela. 2º passo (k=1) Vamos repetir todo o processo do passo 1. 3º passo (k=3) Vamos repetir todo o processo do passo 1. O resultado final é o sistema equivalente, Rx=d: $$\left[\begin{array}{llll}1 & 0 & 0 & 3 / 4 \\0 & 1 & 0 & 1 / 2 \\0 & 0 & 1 & 1 / 4\end{array}\right]$$ Rotacione a tela. A implementação em Python é igual ao algoritmo da eliminação de Gauss, com duas diferenças: devemos dividir os elementos da diagonal principal por eles mesmos, e a condicional de não realizar a operação elementar de multiplicar a linha pivô pelo fator m e subtrair na linha pivô, o que fizemos com o comando (if i != k);, lembre-se de que != significa diferente em Phyton. Veja o programa: Python Atenção! Note que o vetor d = x, ou seja, a solução do sistema. import numpy as np A=np.array([[2.,-1.,0.],[-1.,2.,-1.],[0.,-1.,2.]]) 1 2 3 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 16/72 Decomposição LU A decomposição ou fatoração LU consiste em decompor a matriz A em dois fatores de matrizes, uma matriz triangular inferior, definida de L (do inglês, low), e o outro fator em uma matriz superior U, com a qual já trabalhamos. É fácil demonstrar que os elementos da matriz inferior, L, são os multiplicadores m, utilizados em cada iteração do método da eliminação de Gauss (STRANG, 2005), ou seja, para uma matriz de ordem 3, teremos: $$ \left[\begin{array}{lll} A_{0,0} & A_{0,1} & A_{0,2} \\ A_{1,0} & A_{1,1} & A_{1,2} \\ A_{2,0} & A_{2,1} & A_{2,2} \end{array}\right]=\left[\begin{array}{ccc} 1 & 0 & 0 \\ L_{1,0} & 1 & 0 \\ L_{2,0} & L_{2,1} & 1 \end{array}\right]\left[\begin{array}{ccc} U_{0,0} & U_{0,1} & U_{0,2} \\ 0 & U_{1,1} & U_{1,2} \\ 0 & 0 & U_{2,2} \end{array}\right] $$ Rotacione a tela. A ideia principal para resolver um sistema Ax=b usando a fatoração LU é a seguinte: $$A x=b \rightarrow L \underbrace{Ux}_{c}=b$$ Rotacione a tela. Logo, teremos dois sistemas: 1) Sistema de uma matriz triangular superior, para o qual já temos o algoritmo de solução (substituição retroativa): b=np.array([1.,0,0]) def GaussJordan(A, b): R = np.copy(A) d = np.copy(b) n = d.size for k in range(n): d[k]/=R[k,k] R[k,:]/=R[k,k] for i in range(n): ifi!=k: m = R[i,k] 4 5 6 7 8 9 10 11 12 13 14 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 17/72 $$U x=c$$ Rotacione a tela. 2) Sistema de uma matriz triangular inferior, para o qual apresentaremos o algoritmo de solução, que definiremos como substituição sucessiva. $$ \begin{gathered} L c=b \\ {\left[\begin{array}{ccc} L_{0.0} & 0 & 0 \\ L_{1,0} & L_{1.1} & 0 \\ L_{2,0} & L_{2,1} & L_{2.2} \end{array}\right]\left[\begin{array}{l} c_{0} \\ c_{1} \\ c_{2} \end{array}\right]=\left[\begin{array}{l} b_{0} \\ b_{1} \\ b_{2} \end{array}\right]} \end{gathered} $$ Rotacione a tela. Resolvendo-o: $$1^{\circ}-c_{0}=\frac{b_{0}}{L_{0,0}}, 2^{\circ}-c_{1}=\frac{b_{1}-L_{1,0} c_{0}}{L_{1,1}} \quad \textrm{e} \quad 3^{\circ}-c_{2}=\frac{b_{2}-L_{2,0} c_{0}-L_{2,1} c_{1}}{L_{2,2}}$$ Rotacione a tela. Generalizando para um sistema triangular superior de ordem n: $$c_{i}=\frac{\left(b_{i}-\sum_{j=0}^{i-1} L_{i, j} c_{j}\right)}{L_{i, i}} \text { para } i=0,1,2 \ldots, n-1$$ Rotacione a tela. Em Python, definiremos a seguinte função: Python Para finalizar o algoritmo da decomposição LU, lembre-se de que é o mesmo da eliminação de Gauss, mas a def SubSuc(L,b): n=b.size c=np.zeros(n) for i inrange(n): c[i] = (bs[i] -L[i,:i]@c[:i])/L[i,i] return c 1 2 3 4 5 6 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 18/72 diferença é que iremos salvar os valores de m: Python E a solução por decomposição LU é dada por: Python Como exemplo, resolveremos o nosso problema original: $$ \left[\begin{array}{ccc} 2 & -1 & 0 \\ -1 & 2 & -1 \\ 0 & -1 & 2 \end{array}\right]\left[\begin{array}{l} P_{1} \\ P_{2} \\ P_{3} \end{array}\right]=\left[\begin{array}{l} 1 \\ 0 \\ 0 \end{array}\right] $$ Rotacione a tela. Python def Dec_LU(A): n = A.shape[0] U = np.copy(A) L = np.identity(n) for j in range(n-1): for i in range(j+1,n): m = U[i,j]/U[j,j] U[i,j:] -= m*U[j,j:] L[i,j] = m return L, U def solucao_LU(A,b): L,U = Dec_LU(A) c = SubSuc(L,b) x = SubRet(U,c) return x 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html#19/72 Vem que eu te explico! Os vídeos a seguir abordam os assuntos mais relevantes do conteúdo que você acabou de estudar. Módulo 1 - Vem que eu te explico! Métodos diretos para resolução de sistemas: Gauss-Jordan e decomposição LU-I Módulo 1 - Vem que eu te explico! Métodos diretos para resolução de sistemas: Gauss-Jordan e decomposição LU-II import numpy as np A=np.array([[2.,-1.,0.],[-1.,2.,-1.],[0.,-1.,2.]]) b=np.array([1.,0,0]) def SubSuc(L,b): n=b.size c=np.zeros(n) for i in range(n): c[i] = (b[i] -L[i,:i]@c[:i])/L[i,i] return c def SubRet(U,c): n=c.size 1 2 3 4 5 6 7 8 9 10 11 12 13 14 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 20/72 Vamos praticar alguns conceitos? Falta pouco para atingir seus objetivos. Questão 1 O comando em Python: A=np.array([[1,2,3],[4,5,6]]), resulta em. A um vetor de ordem 1 por 2. 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 21/72 B um vetor de ordem 2 por 1. C uma matriz 3x3. D uma matriz 3x2. E uma matriz 2x3. Responder Questão 2 Na decomposição da matriz A= LU, as matrizes L e U são respectivamente A triangular inferior e triangular superior. B triangular superior e triangular inferior. C diagonal e tridiagonal. D pentagonal e identidade 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 22/72 2 - Métodos iterativos para resolução de sistemas: Gauss-Jacobi e Gauss-Seidel Ao �nal deste módulo, você será capaz de aplicar os recursos do Python na solução de sistemas de equações lineares. D pentagonal e identidade. E diagonal e triangular inferior. Responder 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 23/72 Considerações iniciais A solução de sistemas lineares pelos métodos iterativos ou indiretos é geralmente utilizada no ambiente computacional para evitar locação de memória e reduzir o tempo de processamento, pois os métodos iterativos não realizam transformação da matriz A, do sistema Ax = b; simplesmente utiliza os próprios elementos de A para realizar os cálculos, com objetivo de determinar o valor de x. Como motivação, vamos utilizar o mesmo problema do anterior, para resolvermos o seguinte sistema: $$\left[\begin{array}{ccc} 2 & -1 & 0 \\ -1 & 2 & -1 \\ 0 & -1 & 2 \end{array}\right]\left[\begin{array}{l} P_{1} \\ P_{2} \\ P_{3} \end{array}\right]=\left[\begin{array}{l} 1 \\ 0 \\ 0 \end{array}\right] $$ Rotacione a tela. Método iterativo Vamos apresentar como é o processo iterativo, e, para isso, resolveremos uma equação linear do 1º grau bem simples, utilizando a técnica dos métodos iterativos. Vamos usar o seguinte exemplo: Encontrar o valor de x na equação $$$5 x+1=0$$$. É fácil de verificar que $$$x=-1 / 5$$$ resolve o problema, mas vamos solucionar de um modo diferente. Primeiro, notamos $$$5 x=4 x+x$$$ e substituímos na equação: $$4 x+x+1=0 \rightarrow 4 x=-x-1 \rightarrow x=\frac{-x}{4}-\frac{1}{4}$$ Rotacione a tela. Chegamos a uma equação em que podemos usar a equação iterativa, ou seja: $$x=\frac{-x}{4}-\frac{1}{4} \rightarrow x_{k+1}=\frac{-x_{k}}{4}-\frac{1}{4}$$ Rotacione a tela. Colocaremos um chute inicial $$$ x_{0} $$$ e realizaremos os cálculos para $$$\mathrm{k}=0,1,2, \ldots \ldots \mathrm{n}$$$. 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 24/72 Faremos para n=3: $$ \begin{gathered} k=\mathrm{n} \rightarrow x_{n+1}=\frac{-x_{\mathrm{n}}}{4}-\frac{1}{4}=\frac{-x_{0}} {4^{\mathrm{n}}}-\left(\frac{1}{4}-\frac{1}{4^{2}}+\frac{1}{4^{3}}-\frac{1}{4^{4}}+ \cdot\cdot\cdot + \frac{(-1)^{n+1}}{4^{n}}\right) \end{gathered} $$ Rotacione a tela. Generalizando para k=n, teremos: $$k=n \rightarrow x_{n+1}=\frac{-x_{n}}{4}-\frac{1}{4}=\frac{-x_{0}}{4^{n}}-\left(\frac{1}{4}-\frac{1} {4^{2}}+\frac{1}{4^{3}}-\frac{1}{4^{4}}+\cdots+\frac{(-1)^{n+1}}{4^{n}}\right) $$ Rotacione a tela. Entre parênteses, temos a soma de uma progressão geométrica (PG), cujo valor inicial é 1/4 e a razão é também -1/4. Suponha que podemos computacionalmente realizar números grandes de n, a ponto de considerá-lo infinito, ou seja $$$k \rightarrow \infty$$$, então, teremos a primeira parcela $$$\frac{-x_{0}} {4^{n}} \rightarrow 0$$$ e a PG, sabemos que a soma da progressão infinita é dada por: $$\frac{a_{0}}{1-q^{\prime}}$$ Rotacione a tela. Em que a0 é o termo inicial e q é a razão da PG, logo: $$\left(\frac{1}{4}-\frac{1}{4^{2}}+\frac{1}{4^{3}}-\frac{1}{4^{4}}+\cdots\right)=\frac{\frac{1}{4}} {1+\frac{1}{4}}=\frac{1}{5^{\prime}}$$ Rotacione a tela. Ou seja, $$$x=-1 / 5$$$ é a resposta da equação. Quando isso acontece, dizemos que o processo iterativo convergiu. Agora, vamos resolver o mesmo problema, mas mudaremos um pouco a equação de iteração: 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 25/72 $$ 4 x+x+1=0 \rightarrow x=-4 x-1 $$ Rotacione a tela. Da mesma maneira, fazendo a equação de iteração: $$x_{k+1}=-4 x_{k}-1 \text { para } \mathrm{k}=0,1, \ldots \mathrm{n}$$ Rotacione a tela. Teremos uma PG que não vai convergir e vai tender ao infinito. Nesse caso, observamos que a escolha da equação de iteração é importante para obter o sucesso da resolução do problema, que é o objetivo deste módulo: mostrar dois principais métodos iterativos para solução de sistema lineares – Jacobi e Gauss- Seidel. No entanto, antes vamos ver como usar uma equação linear para resolver um sistema de equações lineares na forma matricial e apresentar um algoritmo genérico. Decomposição da matriz A Para determinar equações de iteração, fizemos o seguinte algebrismo: $$ 5 x=4 x+x $$ Rotacione a tela. Faremos a mesma coisa a matriz A, ou seja, vamos decompô-la em uma subtração de duas matrizes, que chamaremos de M e N, ou seja: $$A=M-N$$ Rotacione a tela. Substituindo essa decomposição no sistema linear $$$A x=b$$$, teremos: $$A x=b \rightarrow(M-N) x=b$$ Rotacione a tela. 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 26/72 Multiplicando o vetor x, obteremos: $$ A x=b \rightarrow(M-N) x=b $$ Rotacione a tela. Vamos multiplicar a esquerda da equação pela inversa de M: $$ M^{-1} M x=M^{-1} N x+M^{-1} b \rightarrow x=M^{-1} N x+M^{-1} b $$ Rotacione a tela. Substituindo N por M-A e depois realizando a multiplicação matricial, obteremos: $$ \begin{gathered} x=M^{-1} N x+M^{-1} b \rightarrow x=M^{-1}(M-A) x+M^{-1} b \rightarrow x=\left(I- M^{-1} A\right) x+M^{-1} b \\ x=x-M^{-1} A x+M^{-1} b \rightarrow x=x+M^{-1}(b-A x) \end{gathered} $$ Rotacione a tela. Para finalizar, faremos algumas definições: A primeira é o vetor resíduo r, que será dado pela equação b-Ax. A segunda é o vetor passo p, que será dado pela segunda parcela da equação final anterior. Ou seja: $$\begin{gathered}r=b-A x \text{ e } p=M^{-1}(b-A x) \rightarrow p=M^{-1} r \rightarrow M p=r \text{ logo } \\x=x+M^{-1}(b-A x) \rightarrow x=x+p\end{gathered}$$ Rotacione a tela. Então, a equação de iteração ficaria da seguinte maneira: $$ x_{k+1}=x_{k}+p_{k} $$ Rotacione a tela. 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 27/72 Em que: $$M p_{k}=r_{k} \quad \textrm{e} \quad r_{k}=b-A x_{k}$$ Rotacione a tela. O algoritmo ficaria assim: 1. Determinar um chute inicial x=x0:; 2. Decompor a matriz A = M-N:;3. Calcular o vetor resíduo r = b -Ax:; 4. Resolver o sistema linear Mp =r e determinar o passo p; 5. Fazer a iteração x=x+p; 6. Verificar um critério de parada, caso não atenda repetir os passos 3, 4 e 5. Para entender melhor, vamos usar o algoritmo com o problema anterior: $$ \left[\begin{array}{ccc} 2 & -1 & 0 \\ -1 & 2 & -1 \\ 0 & -1 & 2 \end{array}\right]\left[\begin{array}{l} P_{1} \\ P_{2} \\ P_{3} \end{array}\right]=\left[\begin{array}{l} 1 \\ 0 \\ 0 \end{array}\right] $$ Rotacione a tela. Nosso chute inicial será o vetor $$$x_{0}=[0,0,0]^{T}$$$ e escolheremos uma decomposição. Como temos que resolver um sistema linear na quarta etapa no algoritmo, ou seja, resolver Mp=r, escolheremos uma matriz M que seja fácil de resolver pelo método direto. Um sistema muito fácil seria se M fosse igual à matriz identidade, ou seja, elementos iguais a 1 na diagonal principal e zero em todos os elementos, como mostrado a seguir: $$ \begin{gathered} {\left[\begin{array}{ccc} 2 & -1 & 0 \\ -1 & 2 & -1 \\ 0 & -1 & 2 \end{array}\right]=\left[\begin{array}{lll} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{array}\right]- \left[\begin{array}{ccc} -1 & 1 & 0 \\ 1 & -1 & 1 \\ 0 & -1 & -1 \end{array}\right]} \\ M p_{k}=r_{k} \rightarrow\left[\begin{array}{lll} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{array}\right] p_{k}=r_{k} \rightarrow p_{k}=r_{k} \end{gathered} $$ Rotacione a tela 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 28/72 Rotacione a tela. Isso facilita muito os cálculos. A seguir, vamos apresentar um programa em Python, que realiza as etapas do algoritmo, utilizando a matriz M como matriz identidade. Nesse programa, vamos realizar somente três iterações para observar o comportamento. Python Ao executar o programa, a saída será a seguinte: $$ \begin{aligned} &\mathrm{r}=[1.0 .0 .]\\ &k=0\\ &x_{k}=[1.0 .0 .]\\ &\mathrm{r}=\left[\begin{array}{lll} -1.1 . & 0 . \end{array}\right]\\ &k=1\\ &x_{k}=[0.1 .0 .]\\ &r=[2 .-2.1 .]\\ &k=2\\ &x_{k}=[2 .-1.1 .] \end{aligned} $$ Rotacione a tela. Atenção! Observe que a resposta se distancia da solução, que sabemos é [0.75 0.5 0.25], ou seja, não vai convergir. Portanto, a escolha de M como a matriz identidade, embora muito fácil, não é adequada para esse problema. import numpy as np A=np.array([[2.,-1.,0.],[-1.,2.,-1.],[0.,-1.,2.]]) b=np.array([1.,0,0]) def sol_Identidade(A,b,x0,kmax): #M= identidade for k in range(kmax): r = b - A@x0 print('r=',r) p = r if np.linalg.norm(p) < 1e-2 + 1e-2*np.linalg.norm(x0): break x0 += p print('k=',k) print('x_k=',x0) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 29/72 Vamos ver como fica com os dois métodos de Jacobi e Gauss-Seidel. Método de Jacobi O método de Jacobi é um caso particular do método da decomposição de matrizes, em que a escolha da matriz M é feita com a diagonal principal de A, ou seja: $$ \left[\begin{array}{lll} A_{0,0} & A_{0,1} & A_{0,2} \\ A_{1,0} & A_{1,1} & A_{1,2} \\ A_{2,0} & A_{2,1} & A_{2,2} \end{array}\right]=\left[\begin{array}{ccc} A_{0,0} & 0 & 0 \\ 0 & A_{1,1} & 0 \\ 0 & 0 & A_{2,2} \end{array}\right]-\left[\begin{array}{ccc} 0 & -A_{0,1} & -A_{0,2} \\ -A_{1,0} & 0 & -A_{1,2} \\ -A_{2,0} & - A_{2,1} & 0 \end{array}\right] $$ Rotacione a tela. Observe que essa escolha também é fácil de resolver o sistema linear Mp=r, pois basta dividir cada elemento de r[i] pelo emento da matriz diagonal, A[i,i], ou seja: $$p_{k}[i]=\frac{r_{k}[i]}{A[i, i]}$$ Rotacione a tela. A seguir, teremos o seguinte programa em Python, resolvendo o nosso problema inicial, lembrando que ao utilizar M como identidade, não convergiu: Python import numpy as np A=np.array([[2.,-1.,0.],[-1.,2.,-1.],[0.,-1.,2.]]) b=np.array([1.,0,0]) def sol_Jacobi(A,b,x0,kmax=100): #M= diagonal de A d =np.diag(A) for k in range(kmax): r = b - A@x0 print('r=',r) 1 2 3 4 5 6 7 8 9 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 30/72 O resultado ao executar a função sol_Jacobi foi: $$ \begin{gathered} \mathrm{r}=\underline{\underline{[0.00000000 \mathrm{e}+00}} \mathbf{2 . 7 7 5 5 5 7 5 6 \mathrm { e } - 1 6 - 2 . 2 2 0 4 4 6 0 5 \mathrm { e } - 1 6 ]} \\ \mathrm{p}=\underline{\underline{[0.00000000 \mathrm{e}+00}} 1.38777878 \mathrm{e}-16- 1.11022302 \mathrm{e}-16] \\ \mathrm{x}=[0.750 .50 .25] \end{gathered} $$ Rotacione a tela. Valor de x convergiu na primeira iteração. Método de Gauss-Seidel O método Gauss-Seidel também é um caso particular do método da decomposição de matrizes, visto anteriormente, em que a escolha da matriz M é feita com os elementos da triangular inferior de A, ou seja: $$ \left[\begin{array}{lll} A_{0,0} & A_{0,1} & A_{0,2} \\ A_{1,0} & A_{1,1} & A_{1,2} \\ A_{2,0} & A_{2,1} & A_{2,2} \end{array}\right]=\left[\begin{array}{ccc} A_{0,0} & 0 & 0 \\ A_{1,0} & A_{1,1} & 0 \\ A_{2,0} & A_{2,1} & A_{2,2} \end{array}\right]-\left[\begin{array}{ccc} 0 & -A_{0,1} & -A_{0,2} \\ 0 & 0 & -A_{1,2} \\ 0 & 0 & 0 \end{array}\right] $$ Rotacione a tela. Observe que essa escolha também é fácil para resolver o sistema linear Mp=r, pois basta usar o método substituição sucessiva visto no módulo 1, em decomposição LU. $$ M p=r \rightarrow\left[\begin{array}{ccc} A_{0,0} & 0 & 0 \\ A_{1,0} & A_{1,1} & 0 \\ A_{2,0} & A_{2,1} & A_{2,2} \end{array}\right]\left[\begin{array}{l} p_{0} \\ p_{1} \\ p_{2} \end{array}\right]=\left[\begin{array}{l} r_{0} \\ r_{1} \\ r_{2} \end{array}\right] $$ Rotacione a tela. p = r/d #p =r[i]/A[i,i] if np.linalg.norm(p) <1e-2 + 1e-2*np.linalg.norm(x0): break x0 += p print('k=' k) 10 11 12 13 14 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 31/72 Resolvendo-o: $$ 1^{\circ}-p_{0}=\frac{r_{0}}{A_{0,0}}, 2^{\circ}-p_{1}=\frac{r_{1}-A_{1,0} p_{0}}{A_{1,1}} \quad \textrm{e} \quad 3^{\circ}-p_{2}=\frac{r_{2}-A_{2,0} p_{0}-A_{2,1} p_{1}}{A_{2,2}} $$ Rotacione a tela. Generalizando para um sistema triangular superior de ordem n: $$ p_{i}=\frac{\left(r_{i}-\sum_{j=0}^{i-1} A_{i, j} p_{j}\right)}{A_{i, i}} \text { para } i=0,1,2 \ldots, n-1 $$ Rotacione a tela. A seguir, teremos o programa em Python, resolvendo o nosso problema inicial, lembrando que ao utilizar M como identidade, não convergiu: Python O resultado ao executar a função sol_GaussSeideil foi: $$ \begin{gathered} k=25 \\ r=[1.49011612 \mathrm{e}-087.45058060 \mathrm{e}-090.00000000 \mathrm{e}+00] \\ p=[7.4505806 \mathrm{e}-097.4505806 \mathrm{e}-093.7252903 \mathrm{e}-09] \\ import numpy as np A=np.array([[2.,-1.,0.],[-1.,2.,-1.],[0.,-1.,2.]]) b=np.array([1.,0,0]) def SubSuc(L,b): n=b.size c=np.zeros(n) for i in range(n): c[i] = (bs[i] -L[i,:i]@c[:i])/L[i,i] return c def sol_Gaussseideil(A,b,x0,kmax=100): #M= tridiagonal de A 1 2 3 4 5 6 7 8 9 10 11 12 13 14 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 32/72 x=[0.749999990 .499999990 .25] \\ k=26 \\ r=[7.4505806 \mathrm{e}-093.7252903 \mathrm{e}-090.0000000 \mathrm{e}+00] \\ p=[3.72529030 \mathrm{e}-093.72529030 \mathrm{e}-091.86264515 \mathrm{e}-09] \\ x=[0.750 .50 .25] \end{gathered} $$ Rotacione a tela. Valor de x convergiu na vigésima sexta iteração. Resolução de Sistemas Acompanhe agora um exemplo de exercício resolvido, utilizando códigos em Python aplicados às resoluções de sistemas pelo método de Gauss-Jacobi. Vamos lá! Vemque eu te explico! Os vídeos a seguir abordam os assuntos mais relevantes do conteúdo que você acabou de estudar. 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 33/72 Módulo 2 - Vem que eu te explico! Métodos Iterativos Módulo 2 - Vem que eu te explico! Método de Jacobi 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 34/72 Vamos praticar alguns conceitos? Falta pouco para atingir seus objetivos. Questão 1 Usando os métodos iterativos Gauss-Seidel, resolva o sistema linear a seguir e encontre o número de iterações utilizadas, use como chute inicial x0=[0,0,0,0]. $$ \left[\begin{array}{cccc}7 & 1 & -1 & 2 \\1 & 8 & 0 & -2 \\-1 & 0 & 4 & -1 \\2 & -2 & -1 & 6\end{array}\right]\left[\begin{array}{l}x_{1} \\x_{2} \\x_{3} \\x_{4}\end{array}\right]=\left[\begin{array}{c}3 \\-5 \\4 \\-3\end{array}\right] $$ A [1,1,1,1] e k=10 B [-1,-1,-1,-1] e k=14 C [1,-1,1,-1] e k=10 D [1,-1,1,-1] e k=14 E [1,1,1,1] e k=14 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 35/72 Responder Questão 2 Usando o método iterativo Jacobi, resolva o sistema linear a seguir e encontre o número de iterações utilizadas, use como chute inicial x_0=[0,0,0]. $$\left[\begin{array}{ccc}4 & -1 & 1 \\-1 & 4 & -2 \\1 & -2 & 4\end{array}\right]\left[\begin{array}{l}x_{1} \\x_{2} \\x_{3}\end{array}\right]=\left[\begin{array}{c}12 \\-1 \\5\end{array}\right]$$ A [1,1,1] e k=49 B [-1,-1,-1] e k=61 C [3,1,1,] e k=49 D [3,1,1] e k=61 E [3,1,1] e k=49 Responder 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 36/72 3 - Interpolação polinomial: Lagrange e Newton Ao �nal deste módulo, você será capaz de analisar os principais métodos de interpolação. Considerações iniciais Um engenheiro recebeu um projeto de instalação de uma rede elétrica em uma rodovia na região norte do país, e será necessário instalar postes e calcular quantos metros de fios serão utilizados, mas para isso precisaremos de um levantamento altimétrico do perfil da rodovia. Um levantamento altimétrico consiste em obter as alturas ao longo de um eixo, no nosso caso, no eixo principal da rodovia, como ilustra a imagem a seguir: O engenheiro solicita ao topógrafo mensurar as alturas e fornece uma tabela com os seguintes dados: 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 37/72 $$\begin{array}{|c|c|c|c|c|c|c|c|}\hline \mathrm{x}(\mathrm{m}) & 1 & 2 & 3 & 4 & 5 & 6 & 7 \\\hline \mathrm{y}(\mathrm{m}) & 1 & 3 & 2 & 4 & 2 & 5 & 4 \\\hline\end{array}$$ Rotacione a tela. Vamos ver formas de interpolação polinomiais que ajudarão o engenheiro. Funções de aproximação Basicamente, o objetivo do nosso problema é apresentar como aproximar uma função f(x), sendo dado n+1 pontos, (xi,yi), em que i=0,1,2,...n. Pode haver várias razões pelas quais isso precisa ser feito: Talvez calcular f(x) seja um procedimento complicado, que não pode ser repetido em muitos pontos, por exemplo, funções integrais ou funções diferenciais. Talvez f(x) só possa ser medido experimentalmente, que é semelhante ao nosso problema. Em qualquer caso, o que desejamos obter é o valor de f(x) para algum valor qualquer de x geral, mas só conhecemos alguns valores selecionados. Normalmente, é escolhida uma base de n funções $$$ \varphi_{k}(x) $$$ e combina-se linearmente com um conjunto de $$$ \ n \ $$$ parâmetros indeterminados $$$ c_{k}(k=0,1, \ldots, N-1) $$$ usado para produzir a seguinte forma linear: Comentário Com esses dados, o engenheiro quer saber qual será a altura (y) quando a distância (x) for igual a 3,5 metros. No entanto, o topógrafo não mensurou essa distância, então, uma solução é fazer uma interpolação para obter o desejado. 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 38/72 $$(\mathrm{x_{i}},\mathrm{y_{i}})$$ Rotacione a tela. Em que $$p(x)$$ é denotado por função de aproximação. Existem duas classes de funções de aproximações, que apresentamos a seguir: • Interpolação. • Ajuste de curvas. Neste módulo, veremos a interpolação e no módulo seguinte, o ajuste de curvas. Interpolação A interpolação surge quando temos como entrada uma tabela de pontos de dados, $$$\left(x_{j}, y_{j}\right)$$$ para $$$j=0,1, \cdots, n-1$$$, que assumimos representar exatamente a função f(x). Vamos considerar as funções básicas $$$\varphi_{k}(x)$$$ como dadas e tentar determinar os n parâmetros $$$c_{k}$$$. Temos n incógnitas e n pontos de dados, então, podemos determinar todas as incógnitas, exigindo que nossa função de aproximação $$$p(x)$$$ passe exatamente pelos pontos de dados de entrada, ou seja: $$y_{j}=\sum c_{k} \varphi_{k}\left(x_{j}\right)$$ Rotacione a tela. Em que $$$p\left(x_{j}\right)=y_{j}$$$. Então, podemos reescrever da forma matricial: $$\left[\begin{array}{ccccc}\varphi_{0}\left(x_{0}\right) & \varphi_{1}\left(x_{0}\right) & \varphi_{2}\left(x_{0}\right) & \ldots & \varphi_{n-1}\left(x_{0}\right) \\ \varphi_{0}\left(x_{1}\right) & \varphi_{1}\left(x_{1}\right) & \varphi_{2}\left(x_{1}\right) & \ldots & \varphi_{n-1}\left(x_{1}\right) \\\varphi_{0}\left(x_{2}\right) & \varphi_{1}\left(x_{2}\right) & \varphi_{2}\left(x_{2}\right) & \ldots & \varphi_{n-1}\left(x_{2}\right) \\\vdots & \vdots & \vdots & \ddots & \vdots \\ \varphi_{0}\left(x_{n- 1}\right) & \varphi_{1}\left(x_{n-1}\right) & \varphi_{2}\left(x_{n-1}\right) & \ldots & \varphi_{n-1}\left(x_{n- 1}\right) \end{array}\right]\left[\begin{array}{c}c_{0} \\c_{1} \\c_{2} \\\vdots \\c_{n- 1}\end{array}\right]=\left[\begin{array}{c}y_{0} \\y_{1} \\y_{2} \\\vdots \\y_{n-1}\end{array}\right]$$ Rotacione a tela. 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 39/72 Agora, temos o seguinte problema: a escolha de $$$\varphi_{k}\left(x_{j}\right)$$$. E seguiremos com a escolha da função interpoladora. Base Monomial A primeira opção é escolher como base do subespaço vetorial de funções os monômios: $$\varphi_{k}(x)=x^{k}$$ Rotacione a tela. A seguir, apresentaremos um programa em Python que gera uma figura com um exemplo dessa base de funções de monômios em um domínio dos conjuntos dos Reais entre -1 e 1. Python Cujo resultado é a imagem a seguir: import numpy as np import matplotlib.pyplot as plt x=np.arange(-1.0,1.1,0.1) n=6#grau do monomio n-1 m =len(x) phik=np.zeros((m,n)) tipos=["k-","b-","g-","r-","y-","m-"] legenda=[] for i in range(n): legenda.append('$\phi_{'+str(i)+"}$") plt.style.use("seaborn-poster") fig = plt.figure(figsize = (10,8)) for k in range(n): phik[:,k] = x**k 1 2 3 4 5 6 7 8 9 10 11 12 13 14 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 40/72 Logo, podemos escrever o polinômio interpolador como: $$p(x)=\sum c_{k} \varphi_{k}(x)=c_{0}+c_{1} x+c_{2} x^{2}+c_{3} x^{3}+\cdots+c_{n-1} x^{n-1}$$ Rotacione a tela. Lembre-se de que a entrada para o problema de interpolação são os pontos $$$\left(x_{j}, y_{j}\right)$$$ para $$$j=0,1,2, \cdots, n-1$$$, dessa maneira: $$p\left(x_{j}\right)=y_{j}=c_{0}+c_{1} x_{j}^{2}+c_{3} x_{j}^{3}+\cdots+c_{n-1} x_{j}^{n-1}$$ Rotacione a tela. Assim, o nosso problema se resume em encontrar os coeficientes $$$c_{j}$$$, ou seja, resolvendo o sistema linear: $$\left[\begin{array}{ccccc}1 & x_{0} & x_{0}^{2} & \cdots & x_{0}^{n-1} \\ 1& x_{1} & x_{1}^{2} & \cdots & x_{1}^{n-1} \\1 & x_{2} & x_{2}^{2} & \cdots & x_{2}^{n-1} \\\vdots & \vdots & \vdots & \ddots & \vdots \\1 & x_{n-1} & x_{n-1}^{2} & \cdots & x_{n-1}^{n-1}\end{array}\right]\left[\begin{array}{c}c_{0} \\c_{1} \\c_{2} \\\vdots \\ c_{n-1}\end{array}\right]=\left[\begin{array}{c}y_{0} \\y_{1} \\y_{2} \\\vdots \\ y_{n- 1}\end{array}\right]$$ Rotacione a tela. Comentário 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 41/72 Vejamos como exemplo o problema do nosso engenheiro de obter a elevação quando x=3,5, com as observações do topógrafo: $$\begin{array}{|c|c|c|c|c|c|c|c|}\hline \mathrm{x}(\mathrm{m}) & 1 & 2 & 3 & 4 & 5 & 6 & 7 \\\hline \mathrm{y}(\mathrm{m}) & 1 & 3 & 2 & 4 & 2 & 5 & 4 \\\hline\end{array}$$ Rotacione a tela. Realizando o seguinte programa em Python: Python Ao executar o programa, teremos a seguinte saída: >>coeficientes de p é [-1.15000000e+02 2.65150000e+02 -2.22933333e+02 9.12708333e+01 -1.94791667e+01 2.07916667e+00 -8.75000000e-02] Observe que a matriz do sistema acima é bem conhecida na Matemática, é a matriz de Vandermonde e o determinante dessa matriz sempre é diferente de zero, isto é, o sistema possui uma única solução. import numpy as np import numpy.polynomial.polynomial as poly import matplotlib.pyplot as plt def SubRet(U,c): n=c.size x=np.zeros(n) for i in reversed(range(n)): x[i] = (c[i] -U[i,i+1:]@x[i+1:])/U[i,i] return x def ElimGauss(A, b): U = np.copy(A) c = np.copy(b) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 42/72 >>o valor da elevação para x=3,5 é igual a p(3.5)= 3.405273437500057 E o gráfico do polinômio interpolador é: Vamos destacar algumas linhas do programa. Logo no início, encontramos a linha import numpy.polynomial.polynomial as poly, a qual informa que usaremos os métodos do numpy, que trabalha com polinômios, e vamos “apelidá-lo” de poly. Basicamente, se queremos trabalhar com um polinômio: $$p(x)=c_{0}+c_{1} x+c_{2} x^{2}+c_{3} x^{3}+\cdots+c_{n-1} x^{n-1}$$ Rotacione a tela. Basta obter um array dos coeficientes, $$$\text { coef }=\text { np. } \operatorname{array}\left(\left[c_{0}, c_{1}, \ldots, c_{n-1}\right]\right)$$$ e para trabalhar com o polinômio, escrevemos a seguinte linha de comando p =poly.Polynomial(coef), como foi feito na antepenúltima linha do script anterior. Depois, para determinar o valor de p(x) quando x=3,5, é só escrever p(3.5), como foi colado no comando print na penúltima linha. Outra linha que vamos destacar é a linha: A=np.vander(x, increasing=True). Esse comando cria uma matriz de Vandermonde dado o array x, que é a entrada da função monômio (x,y) criada. Comentário Pronto, poderíamos parar por aqui, pois o problema encontra-se resolvido, mas computacionalmente, a solução encontra um problema: a solução do sistema linear pode apresentar dificuldades, logo, existem outras técnicas nas quais não é necessário resolver um sistema linear. 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 43/72 Método de Lagrange A ideia principal da interpolação é descobrir um polinômio de grau n tal que $$$p\left(x_{m}\right)=y_{m}$$$, em que $$$m=0,1, \ldots n$$$, e essa premissa será respeitada no método de Lagrange. Para fazer distinção do método a ser empregado, vamos definir o polinômio obtido pelo método de Lagrange por $$$l_{n}$$$, em que N é o grau do polinômio. O método de Lagrange consiste em obter o polinômio interpolador sem ser necessário resolver um sistema linear. Seguindo a ideia principal $$$l_{n}\left(x_{m}\right)=y_{m}$$$, então, a fórmula de Lagrange é dada por: $$l_{n}(x)=\sum y_{m} L_{n, m}(x)$$ Rotacione a tela. Em que definiremos $$$ L_{n, m} $$$ como polinômios de Lagrange básicos e eles têm a seguinte propriedade: $$L_{n, m}=\left\{\begin{array}{lll}1 & \text { quando } & x=x_{m} \\0 & \text { quando } & x \neq x_{m}\end{array}\right.$$ Rotacione a tela. Dada por: $$L_{n, m}(x)=\frac{\Pi\left(x-x_{k}\right)}{\Pi\left(x_{m}-x_{k}\right)}$$ Rotacione a tela. Expandindo a fórmula, o polinômio é escrito da seguinte maneira: $$\begin{gathered}l_{n}(x)=y_{0} \frac{\left(x-x_{1}\right)\left(x-x_{2}\right) \cdots\left(x-x_{n}\right)} {\left(x_{0}-x_{1}\right)\left(x_{0}-x_{2}\right) \cdots\left(x_{0}-x_{n}\right)}+y_{1} \frac{\left(x- x_{0}\right)\left(x-x_{2}\right) \cdots\left(x-x_{n}\right)}{\left(x_{1}-x_{0}\right)\left(x_{1}-x_{2}\right) 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 44/72 \cdots\left(x_{1}-x_{n}\right)}+\cdots \\+\cdots+y_{n} \frac{\left(x-x_{0}\right)\left(x-x_{1}\right) \cdots\left(x-x_{n-1}\right)}{\left(x_{n}-x_{0}\right)\left(x_{n}-x_{1}\right) \cdots\left(x_{n}-x_{N- 1}\right)}\end{gathered}$$ Rotacione a tela. Vamos fazer o seguinte exemplo. Dados os pontos (-1,15), (0,8) e (3,-1), calcule o polinômio interpolador pelo método de Lagrange: Primeiramente, observe que possuímos três pontos, logo n=2, assim, o polinômio na forma de Lagrange é dado por: $$l_{2}(x)=\sum y_{k} L_{2, k}(x)$$$$l_{m}(x), m=0,1,2 .$$ Rotacione a tela. Temos os seguintes polinômios básicos: $$ \begin{gathered} L_{2,0}(x)=\frac{\left(x-x_{1}\right)\left(x-x_{2}\right)}{\left(x_{0}- x_{1}\right)\left(x_{0}-x_{2}\right)}=\frac{(x-0)(x-3)}{(-1-0)(-1-3)}=\frac{x^{2}-3 x}{4} \\ L_{2,1} (x)=\frac{\left(x-x_{0}\right)\left(x-x_{2}\right)}{\left(x_{1}-x_{0}\right)\left(x_{1}-x_{2}\right)}=\frac{(x+1) (x-3)}{(0+1)(0-3)}=\frac{x^{2}-2 x-3}{-3} \\ L_{2,2}(x)=\frac{\left(x-x_{0}\right)\left(x-x_{1}\right)} {\left(x_{2}-x_{0}\right)\left(x_{2}-x_{1}\right)}=\frac{(x+1)(x-0)}{(3+1)(3-0)}=\frac{x^{2}+x}{12} \end{gathered} $$ Rotacione a tela. Fazendo $$$ l_{2}(x)=\sum y_{k} L_{2, k}(x) $$$, teremos: $$l_{2}(x)=y_{0} L_{0}+y_{1} L_{1}+y_{2} L_{2}$$$$\cdots=(15) \frac{x^{2}-3 x}{4}+(8) \frac{x^{2}-2 x-3} {-3}+(-1) \frac{x^{2}+x}{12}$$ Rotacione a tela. Desenvolvendo a expressão, chegaremos no seguinte resultado: $$l_{2}(x)=8-6 x+x^{2}$$ Rotacione a tela. 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 45/72 Apresentaremos a seguir um programa em Python, que nos retorna um vetor, l, em que os valores são os coeficientes do polinômio de grau n, $$$l_{n}$$$, e uma matriz, L, em que cada linha possui os valores dos coeficientes dos polinômios básicos de Lagrange $$$L_{n, m}$$$: Python Executando os seguintes comandos, utilizando os dados do exemplo, obtemos os resultados l_2 = [8. -6. 1.], que são os coeficientes do polinômio obtido, $$$ l_{2}(x)=8-6 x+x^{2} $$$. Python Resultando na seguinte saída: Terminal import pandas as pd import numpy as np import numpy.polynomial.polynomial as poly def lagrange_ln(x,y): n=len(x) # grau do polinomio n-1 l=np.zeros(n) L = np.zeros((n,n)) for m in range(n): P=[1] for k in range(n): if k != m: P = poly.polymul(P,[ -x[k],1])/(x[m] -x[k]) L[m,:] = P l += y[m]*P x = [-1, 0, 3] y = [15, 8,-1] l,L=lagrange_ln(x,y) Tabela=pd.DataFrame(L) print('l_2 =',l) l_2 = [ 8. -6. 1.] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 2 3 4 5 6 1 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 46/72 A seguir, apresentaremos o método de Newton para obter o mesmo resultado. Método de Newton Para entender o método de Newton, primeiramente, precisamos de algumas definições: Polinômio nodal. Formade Newton. Polinômios nodais Os polinômios nodais são definidos por $$$ \pi_{i}(x) $$$ e dados pela seguinte expressão: $$\pi_{i}(x)=\prod\left(x-x_{j}\right)$$ Rotacione a tela. Em que é fornecido um conjunto de $$$ n+1 $$$ pontos, que também são chamados de nós, $$$ x_{0}, x_{1}, x_{2}, \ldots, x_{n} $$$. Vamos ver um exemplo. Determine os polinômios nodais do seguinte conjunto de nós: -1.0, 0.5,0.0,0.5,1.0 e, com um programa em Python, construa os respectivos gráficos. Solução: Como podemos ver temos 5 nós, logo, pela definição, teremos os seguintes polinômios nodais: $$\begin{gathered}\pi_{0}=1 \\\pi_{1}=x-x_{0}=x-(-1)=x+1 \\ \pi_{2}=\left(x-x_{0}\right)\left(x-x_{1}\right)= (x+1)(x+0.5) \\ \pi_{3}=\left(x-x_{0}\right)\left(x-x_{1}\right)\left(x-x_{2}\right)=(x+1)(x+0.5)(x-0) \\\pi_{4}=\left(x-x_{0}\right)\left(x-x_{1}\right)\left(x-x_{2}\right)\left(x-x_{3}\right)=(x+1)(x+0.5)(x-0)(x- 0.5) \\\pi_{5}=\left(x-x_{0}\right)\left(x-x_{1}\right)\left(x-x_{2}\right)\left(x-x_{3}\right)\left(x-x_{5}\right) \\=(x+1)(x+0.5)(x-0)(x-0.5)(x-1)\end{gathered}$$ L= 0 1 2 0 -0.0 -0.750000 0.250000 1 1.0 0.666667 -0.333333 2 0 0 0 083333 0 083333 2 3 4 5 6 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 47/72 Rotacione a tela. Para construir os gráficos, teremos o seguinte programa em Python: Python Ao executar o script, teremos o seguinte resultado: Forma de Newton A forma de Newton é basicamente uma forma de rescrever um polinômio: $$p(x)=c_{0}+c_{1} x+c_{2} x^{2}+c_{3} x^{3}+\cdots+c_{n-1} x^{n-1}$$ Rotacione a tela. Ou seja, essa forma é uma combinação linear dos polinômio nodais, em que são conhecidos os nós $$$ import numpy as np import numpy.polynomial.polynomial as poly import matplotlib.pyplot as plt x=np.arange(-1.0,1.01,0.01) x_no=[-1.,-0.5,0,0.5,1] n=len(x_no) #grau do monomio n-1 #======================================================= #configuração dos gráficos #======================================================= tipos=["k-","b-","g-","r-","y-","m-"] legenda=[] for i in range(n+1): legenda.append('$\pi_{'+str(i)+'}$') plt.style.use("seaborn-poster") 1 2 3 4 5 6 7 8 9 10 11 12 13 14 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 48/72 x_{j} $$$. Por questões didáticas, chamaremos esse polinômio escrito na forma de Newton de $$$ n_{N} $$$, portanto, teremos a seguinte expressão: $$n_{N}(x)=\sum a_{i} \pi_{i}(x)$$ Rotacione a tela. Então, o método de Newton para interpolação é: Dado $$$ N+1 $$$ pontos $$$ \left(x_{0}, y_{0}\right),\left(x_{1}, y_{1}\right),\left(x_{N}, y_{N}\right) $$$, encontrar: $$n_{N}(x)=a_{0}+a_{1}\left(x-x_{0}\right)+a_{2}\left(x-x_{0}\right)\left(x-x_{1}\right)+\cdots+a_{N}\left(x- x_{0}\right)\left(x-x_{1}\right) \cdots\left(x-x_{N-1}\right)$$ Rotacione a tela. Sendo que o problema busca determinar os coeficientes $$$ a_{0}, a_{1}, a_{2}, \cdots, a_{N} \mathrm{e} $$$ logicamente, respeitando a condição primordial da interpolação: $$n_{N}\left(x_{j}\right)=y_{j}$$ Rotacione a tela. Vamos seguir os seguintes passos para determinar os coeficientes $$$ a_{i} \text { as } $$$: 1) Para os pontos $$$ \left(x_{0}, y_{0}\right) $$$: $$n_{N}\left(x_{0}\right)=a_{0}=y_{0}$$ Rotacione a tela. 2) Para $$$ \left(x_{1}, y_{1}\right) $$$: $$n_{N}\left(x_{1}\right)=a_{0}+a_{1}\left(x_{1}-x_{0}\right)=y_{1}$$$$a_{1}=\frac{y_{1}-y_{0}}{x_{1}- x_{0}}$$ Rotacione a tela. 3) Para (x_2,y_2): 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 49/72 $$n_{N}\left(x_{2}\right)=a_{0}+a_{1}\left(x_{2}-x_{0}\right)+a_{2}\left(x_{2}-x_{0}\right)\left(x_{2}- x_{1}\right)=y_{2}$$ Rotacione a tela. Desenvolvendo: $$a_{2}=\frac{\frac{y_{2}-y_{1}}{x_{2}-x_{1}}-\frac{y_{1}-y_{0}}{x_{1}-x_{0}}}{x_{2}-x_{0}}$$ Rotacione a tela. 4) Para o terceiro ponto $$$ \left(x_{3}, y_{3}\right) $$$: $$\begin{aligned}&n_{N}\left(x_{2}\right)=a_{0}+a_{1}\left(x_{3}-x_{0}\right)+a_{2}\left(x_{3}- x_{0}\right)\left(x_{3}-x_{1}\right)+a_{3}\left(x_{3}-x_{0}\right)\left(x_{3}-x_{1}\right)\left(x_{3}-x_{2}\right) \\&=y_{3}\end{aligned}$$ Rotacione a tela. Da mesma forma, obtemos: $$a_{3}=\frac{\frac{\frac{y_{3}-y_{2}}{x_{3}-x_{2}}-\frac{y_{2}-y_{1}}{x_{2}-x_{1}}}{x_{3}-x_{1}}- \frac{\frac{y_{2}-y_{1}}{x_{2}-x_{1}}-\frac{y_{1}-y_{0}}{x_{1}-x_{0}}}{x_{2}-x_{0}}}{x_{3}-x_{0}}$$ Rotacione a tela. Generalizando e definindo diferenças divididas: $$f\left[x_{1}, x_{0}\right]=\frac{y_{1}-y_{0}}{x_{1}-x_{0}}$$$$f\left[x_{0}, x_{1}, x_{2}\right]=\frac{\frac{y_{2}-y_{1}}{x_{2}-x_{1}}-\frac{y_{1}-y_{0}}{x_{1}-x_{0}}}{x_{2}- x_{0}}=\frac{f\left[x_{2}, x_{1}\right]-f\left[x_{1}, x_{0}\right]}{x_{2}-x_{0}}$$ Rotacione a tela. Continuando e generalizando: $$f\left[x_{k}, x_{k-1}, \cdots, x_{1}, x_{0}\right]=\frac{f\left[x_{k}, x_{k-1}, \cdots, x_{2}, x_{1}\right]- f\left[x_{k-1}, \cdots, x_{1}, x_{0}\right]}{x_{k}-x_{0}}$$ 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 50/72 Rotacione a tela. Podemos visualizar esses valores em uma tabela das diferenças divididas (DD): $$\begin{array}{cccccc}x_{k} & y_{k} & D^{2} f & D^{3} f & D^{4} f & D^{5} f \\ x_{0} & y_{0} & f\left[x_{1}, x_{0}\right] & f\left[x_{2}, x_{1}, x_{0}\right] & f\left[x_{3}, x_{2}, x_{1}, x_{0}\right] & f\left[x_{4}, x_{3}, x_{2}, x_{1}, x_{0}\right] \\x_{1} & y_{1} & f\left[x_{2}, x_{1}\right] & f\left[x_{3}, x_{2}, x_{1}\right] & f\left[x_{4}, x_{3}, x_{2}, x_{1}\right] & 0 \\ x_{2} & y_{2} & f\left[x_{3}, x_{2}\right] & f\left[x_{4}, x_{3}, x_{2}\right] & 0 & 0 \\x_{3} & y_{3} & f\left[x_{4}, x_{3}\right] & 0 & 0 & 0 \\x_{4} & y_{4} & 0 & 0 & 0 & 0\end{array}$$ Rotacione a tela. Para exemplificar, vamos retornar ao problema do nosso engenheiro para obter a elevação quando x=3,5, com as observações do topógrafo: $$\begin{array}{|c|c|c|c|c|c|c|c|}\hline x(m) & 1 & 2 & 3 & 4 & 5 & 6 & 7 \\\hline y(m) & 1 & 3 & 2 & 4 & 2 & 5 & 4 \\\hline\end{array}$$ Rotacione a tela. Em Python, vamos executar o seguinte algoritmo: Python import numpy as np import numpy.polynomial.polynomial as poly import matplotlib.pyplot as plt import pandas as pd def n_newton(x,y): """ n e DD """ N = len(y) DD = np.zeros([N, N]) # A primeira coluna é y DD[:,0] = y for j in range(1,N): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 51/72 Ao executar o script, obteremos os seguintes resultados: >>coeficientes de n na forma de newton é [ 1. 2. -1.5 1. -0.54166667 0.24166667 -0.0875 ] 1 1.0 2.0 -1.5 1.000000 -0.541667 0.241667 -0.0875 2 3.0 -1.0 1.5 -1.166667 0.666667 -0.283333 0.0000 3 2.0 2.0 -2.0 1.500000 -0.750000 0.000000 0.0000 4 4.0 -2.0 2.5 -1.500000 0.000000 0.000000 0.0000 5 2.0 3.0 -2.0 0.000000 0.000000 0.000000 0.0000 6 5.0 -1.0 0.0 0.000000 0.000000 0.000000 0.0000 7 4.0 0.0 0.0 0.000000 0.000000 0.000000 0.0000 >>o valor da elevação para x=3,5 é igual a n_6(3.5)= 3.4052734374995026 Rotacione a tela. E o seguinte gráfico: Comentário Observe que é o mesmo resultado da primeira solução e ao usarmos o método de Lagrange também obteremos a mesma resposta, a diferença dos métodos está nas particularidades. 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 52/72 Cada método tem um diferencial. Veja quais são eles: Método com base monomial Este método necessita de uma solução de sistemaslineares, o que não é adequado quando a quantidade de pontos é grande. Método de Lagrange Este método não necessita resolver um sistema linear, no entanto, caso queira acrescentar um ponto, devemos repetir todo o cálculo, o que não ocorre com o método de Newton. Método de Newton Este método tem uma vantagem: a de acrescentar um ponto no conjunto dado e, assim, aproveitar o resultado obtido. Interpolação de Lagrange e Newton Acompanhe um exemplo de exercício resolvido, utilizando códigos em Python aplicados às interpolações de Lagrange e Newton. Vamos lá! 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 53/72 Vem que eu te explico! Os vídeos a seguir abordam os assuntos mais relevantes do conteúdo que você acabou de estudar. Módulo 3 - Vem que eu te explico! Método de Lagrange Módulo 3 - Vem que eu te explico! Método de Newton 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 54/72 Vamos praticar alguns conceitos? Falta pouco para atingir seus objetivos. Questão 1 Um conjunto de pontos possui 6 coordenadas (x,y), logo, por interpolação, o grau do polinômio interpolador é A 7. B 6. 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 55/72 C 5. D 4. E 3. Responder Questão 2 Em uma interpolação linear são necessários quantos pontos (coordenadas)? A 5 B 4 C 3 D 2 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 56/72 4 - Ajuste de funções: funções polinomiais e linearizáveis Ao �nal deste módulo, você será capaz de calcular extrapolações com ajuste de curvas. Considerações iniciais Durante uma pandemia de um vírus X, foi observado um número de pessoas contagiadas durante 7 meses, como mostra o gráfico a seguir: E 1 Responder 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 57/72 Ao observar a tabela a seguir com os valores: $$\begin{array}{|c|c|c|c|c|c|c|c|} \hline \mathrm{x}(\mathrm{m}) & 1 & 2 & 3 & 4 & 5 & 6 & 7 \\ \hline \mathrm{y}(\mathrm{m}) & 1 & 3 & 2 & 4 & 2 & 5 & 4 \\ \hline\end{array}$$ Rotacione a tela. Vamos apresentar formas de ajustes de polinômios e de outros tipos de funções que nos ajudarão a resolver esse problema. Dados numéricos tabelados Qualquer observação experimental, seja na engenharia ou em uma pesquisa social, produz uma massa de dados. Existem diversos métodos de processar esses dados, vamos abordar um exemplo simples de dados numéricos tabelados: $$\begin{array}{cc}x & y \\x_{0} & y_{0} \\x_{1} & y_{1} \\x_{2} & y_{2} \\\vdots & \vdots \\x_{m} & y_{m}\end{array}$$ Rotacione a tela. Comentário Deseja-se estimar o número de contágio no oitavo mês e se há tendência de queda. A solução é fazer um ajuste de curvas para obter o desejado. 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 58/72 O primeiro problema de ajuste de curva é determinar a reta que mais se ajusta aos $$$ m+1 $$$ pares ordenados $$$ \left(x_{i}, y_{i}\right) $$$. Um exemplo seria determinar o menor erro total absoluto, ou seja, $$$ \phi(a, b)=\sum\left|a x_{i}+b- y_{i}\right| $$$ . Na prática, é mais comum resolver a seguinte função: $$$ \phi(a, b)=\sum\left(a x_{i}+b-y_{i}\right)^{2} $$$. Esse problema é conhecido como aproximação $$$ l_{2} $$$, ou método dos mínimos quadrados (MMQ), cuja solução é a mais usada, pois encontra-se alinhada com a distribuição normal. As normas $$$ l_{1} $$$ e $$$ l_{2} $$$ são formas específicas de medida de distâncias no espaço vetorial. Uma forma geral é definindo a norma $$$ -p \text { ou } l_{p} $$$, dada por: $$ \|v\|_{p}=\left\{\sum\left|v_{i}^{p}\right|\right\}^{\frac{1}{p}} 1<p<\infty $$ Para o vetor $$$ v=\left[v_{0}, v_{1}, v_{2}, \cdots, v_{n}\right]^{T} $$$. Para determinar o mínimo, basta fazer a condição, vista em cálculo: $$\frac{\partial \phi}{\partial a}=0 \quad \textrm{e} \quad \frac{\partial \phi}{\partial b}=0$$ Rotacione a tela. Outra forma de resolver é a interpretação geométrica do problema, em que, por exemplo, para 7 pontos, teremos 7 equações $$$ y_{i}=a x_{i}+b \text { para } i=1,2,3,4,5,6 e 7 $$$ e poderemos escrever na forma matricial $$$ Ax=b $$$, em que: $$\left[\begin{array}{ll}x_{1} & 1 \\x_{2} & 1 \\x_{3} & 1 \\x_{4} & 1 \\ x_{5} & 1 \\x_{6} & 1 \\x_{7} & 1\end{array}\right]\left[\begin{array}{l}a \\b\end{array}\right]=\left[\begin{array}{l}y_{1} \\y_{2} \\y_{3} Comentário A função $$$ \phi $$$ tem como variáveis $$$ a $$$ e $$$ b $$$, e devemos assumir o menor valor possível. Essa solução é conhecida como aproximação $$$ l_{1} $$$ e pode ser resolvida com técnicas de programação linear. 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 59/72 \\y_{4} \\y_{5} \\y_{6} \\y_{7}\end{array}\right]$$ Rotacione a tela. Solução é dada pela equação normal: $$$ A^{T} A x=A^{T} y $$$, que corresponde à solução de minimizar a norma de $$$ \|y-A x\|_{2}^{2} $$$. Vamos resolver o problema inicial e fazer o ajuste dos dados para uma reta, então, montando a matriz do sistema $$$ Ax=b $$$, teremos: $$ \left[\begin{array}{ll} 1 & 1 \\ 2 & 1 \\ 3 & 1 \\ 4 & 1 \\ 5 & 1 \\ 6 & 1 \\ 7 & 1 \end{array}\right]\left[\begin{array}{l} a \\ b \end{array}\right]=\left[\begin{array}{l} 1 \\ 3 \\ 2 \\ 4 \\ 2 \\ 5 \\ 4 \end{array}\right] $$ Rotacione a tela. Implementando a solução em Python e visualizando o gráfico: Python O gráfico obtido do ajuste é: import numpy as np import matplotlib.pyplot as plt import numpy.polynomial.polynomial as poly #solução do sistema linear pelo método de Eliminação de Gauss def SubRet(U,c): n=c.size x=np.zeros(n) for i in reversed(range(n)): x[i] = (c[i] -U[i,i+1:]@x[i+1:])/U[i,i] return x def ElimGauss(A, b): U = np.copy(A) c = np.copy(b) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 60/72 Observando no gráfico a pandemia do vírus X, há uma tendência de crescimento e para uma estimativa do oitavo mês, basta colocar no scritp o comando np.plolyval(p,8) dessa maneira: print('valor de contaminados no oitavo mês é',round(np.polyval(p,8))), ao executar >>valor de contaminados no oitavo mês é 5. Rotacione a tela. A seguir, vamos apresentar o ajuste polinomiais. Ajustes de funções polinomiais O ajuste surge quando temos como entrada uma tabela de pontos de dados, $$$ \left(x_{j}, y_{j}\right) $$$ para $$$ j=0,1, \cdots, n-1 $$$, que assumimos querer determinar uma função polinomial $$$ f(x) $$$ mais próxima dos dados, considerando uma ordem do polinômio $$$ m<n $$$. Vamos considerar as funções básicas $$$ \varphi_{k}(x) $$$ como dadas e tentar determinar os n parâmetros $$$ C_{k} $$$. Podemos determinar todas as incógnitas parâmetros exigindo que nossa função de aproximação $$$ p(x) Atenção! Observe que temos m incógnitas e n pontos de dados, logo, possuímos um sistema sobre determinação, ou seja, temos mais equações que incógnitas. 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 61/72 $$$ passe exatamente pelos pontos de dados de entrada, isto é: $$y_{j}=\sum c_{k} \varphi_{k}\left(x_{j}\right)$$ Rotacione a tela. Em que $$$ p\left(x_{j}\right) \approx y_{j} $$$. Podemos reescrever da forma matricial: $$\left[\begin{array}{ccccc}\varphi_{0}\left(x_{0}\right)& \varphi_{1}\left(x_{0}\right) & \varphi_{2}\left(x_{0}\right) & \cdots & \varphi_{m}\left(x_{0}\right) \\ \varphi_{0}\left(x_{1}\right) & \varphi_{1}\left(x_{1}\right) & \varphi_{2}\left(x_{1}\right) & \cdots & \varphi_{m}\left(x_{1}\right) \\ \varphi_{0}\left(x_{2}\right) & \varphi_{1}\left(x_{2}\right) & \varphi_{2}\left(x_{2}\right) & \cdots & \varphi_{m}\left(x_{2}\right) \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ \varphi_{0}\left(x_{n-1}\right) & \varphi_{1}\left(x_{n-1}\right) & \varphi_{2}\left(x_{n-1}\right) & \cdots & \varphi_{m}\left(x_{n-1}\right) \end{array}\right]\left[\begin{array}{c}c_{0} \\c_{1} \\c_{2} \\\vdots \\c_{n- 1}\end{array}\right]=\left[\begin{array}{c}y_{0} \\y_{1} \\y_{2} \\\vdots \\y_{n-1}\end{array}\right]$$ Rotacione a tela. Semelhante à interpolação, escolheremos $$$ \varphi_{k}\left(x_{j}\right)=x_{j}^{k} $$$, com uma diferença que a matriz do sistema não será quadrada, pois terá mais equações do que parâmetros. No programa a seguir resolveremos o nosso problema da pandemia, com uma diferença, além de apresentar a função Ajuste_poli(x,y,n), em que x e y são vetores de entrada dos dados observados e n a ordem do polinômio que desejamos ajustar, exibiremos um gráfico com diferentes ordens de polinômios: ordem impares, 1,3,5 e 7 da forma 2k-1. Python import numpy as np import matplotlib.pyplot as plt import numpy.polynomial.polynomial as poly #solução do sistema linear pelo método de Eliminação de Gauss def SubRet(U,c): n=c.size x=np.zeros(n) for i in reversed(range(n)): x[i] = (c[i] -U[i,i+1:]@x[i+1:])/U[i,i] return x 1 2 3 4 5 6 7 8 9 10 11 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 62/72 Observando o resultado a seguir, podemos pontuar algumas análises do gráfico: Para os polinômios de ordem 1, já tínhamos feito, que é o ajuste linear e observamos a tendência do aumento. O polinômio de ordem 3 também demonstra a tendência de crescimento. Para os polinômios de ordem 5 e 7, a pandemia acaba no oitavo mês. Para resolver tal problema, é necessário ir para o campo da estatística, que nos fornecerá a resposta se o modelo matemático adotado possui aderência com as observações. A seguir, vamos exemplificar um modelo matemático que não é polinomial, no entanto, contínua linear. Funções não polinomiais Às vezes, na procura de uma modelagem matemática adequada para descrever algum fenômeno natural, as funções polinomiais não apresentam uma boa resposta. Comentário Esse é um dos problemas do ajuste de funções; como estamos fazendo uma extrapolação, os resultados dependem do modelo matemático que estamos adotando. def ElimGauss(A, b): U = np.copy(A) c = np.copy(b) 12 13 14 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 63/72 Dentro da ciência, é comum os dados terem semelhanças com funções trigonométricas, devido à periodicidade, ou com funções exponenciais e logarítmicas, por causa do crescimento. Vamos supor que um cientista quisesse combinar essas características em um único modelo matemático, por exemplo, $$$ f(x)=m_{1} \log (x)+m_{2} \cos (x)+m_{3} e^{x} $$$. Então, queremos ajustar a função $$$ f(x) $$$ com os dados da pandemia dada no problema inicial: $$\begin{array}{|c|c|c|c|c|c|c|c|} \hline \mathrm{x} \text { (mês) } & 1 & 2 & 3 & 4 & 5 & 6 & 7 \\ \hline \mathrm{y} \text { (contágio) } & 1 & 3 & 2 & 4 & 2 & 5 & 4 \\ \hline\end{array}$$ Rotacione a tela. Pelo MMQ, o problema reside em encontrar o mínimo da função: $$\phi\left(m_{1}, m_{2}, m_{3}\right)=\sum\left(y_{i}-\left(m_{1} \log \left(x_{i}\right)+m_{2} \cos \left(x_{i}\right)+m_{3} e^{x_{i}}\right)\right)^{2}$$ Rotacione a tela. Ou seja, fazendo: $$\frac{\partial \phi}{\partial m_{1}}=0 ; \frac{\partial \phi}{\partial m_{2}}=0 ; \frac{\partial \phi}{\partial m_{3}}=0$$ Rotacione a tela. Resultando na equação normal: $$$ A^{T} A m=A^{T} y $$$, que é um sistema linear. A seguir, apresentaremos uma implementação em Python que resolve esse problema, mas antes vamos ver como é o sistema $$$ Ax=b $$$, para entender como resolver a equação normal. Primeiro, devemos notar que cada linha da matriz A tem esse formato: $$m_{1} \log \left(x_{j}\right)+m_{2} \cos \left(x_{j}\right)+m_{3} e^{x_{j}}=y_{j}$$ Rotacione a tela. 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 64/72 Portanto, o sistema é: $$\left[\begin{array}{lll}\log (1) & \cos (1) & e^{1} \\ \log (2) & \cos (2) & e^{2} \\\log (3) & \cos (3) & e^{3} \\ \log (4) & \cos (4) & e^{4} \\\log (5) & \cos (5) & e^{5} \\ \log (6) & \cos (6) & e^{6} \\\log (7) & \cos (7) & e^{7} \end{array}\right]\left[\begin{array}{l}m_{1} \\m_{2} \\m_{3} \end{array}\right]=\left[\begin{array} {l}1 \\3 \\2 \\4 \\2 \\5 \\ 4\end{array}\right]$$ Rotacione a tela. Em Python: Python Pelo gráfico gerado, observamos uma queda na pandemia: import numpy as np import matplotlib.pyplot as plt import numpy.polynomial.polynomial as poly #solução do sistema linear pelo método de Eliminação de Gauss def SubRet(U,c): n=c.size x=np.zeros(n) for i in reversed(range(n)): x[i] = (c[i] -U[i,i+1:]@x[i+1:])/U[i,i] return x def ElimGauss(A, b): U = np.copy(A) c = np.copy(b) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 65/72 Funções linearizáveis Vamos trabalhar com outros tipos de modelos matemáticos, classificados de não lineares. Essa classificação é obtida quando fazemos as derivadas parciais e montamos o sistema de equações $$$ Ax=b $$$; a matriz A contém os parâmetros ou os coeficientes que queremos determinar, tornando-o um sistema não linear. Vamos ver uma função geral não linear, classificada como ajuste não linear, que normalmente aparece nos modelos matemáticos e mostraremos como linearizá-la. O formato da função é: $$f(x)=m_{0}\left(1+e^{m_{1} x}\right)$$ Rotacione a tela. Em que $$$ m_{0} \text { e } m_{1} $$$ são parâmetros que queremos determinar. Observe que é difícil isolar o parâmetro $$$ m_{1} $$$, pois ele se encontra no expoente da função neperiana. Uma maneira possível de linearizar é usar as propriedades da função logaritmo, em que temos uma função $$$ g(x)=a_{1} c_{1}^{d_{1}} c_{2}^{d_{2}} c_{3}^{d_{3}} \ldots c_{k}^{d_{k}} $$$ e aplicamos $$$ \log _{b} $$$ em ambos os lados: Comentário Um sistema não linear possui técnicas para ser resolvido e parte do princípio de linearizá-lo, mas o que vamos apresentar aqui é um pouco diferente, pois não vamos trabalhar na linearização do sistema, e sim na linearização da função. 06/06/2022 21:26 Sistemas de equações lineares e ajustes de curvas em Python https://stecine.azureedge.net/repositorio/00212ti/02797/index.html# 66/72 $$\log _{b}(g(x))=\log _{b}(a_{1})+d_{1}\log _{b}(c_{1})+d_{2}\log _{b}(c_{2})+d_{3}\log _{b}(c3)+\cdot \cdot \cdot+d_{k}\log _{b}(c_{k})$$ Rotacione a tela. Portanto, aplicando $$$ \log (f(x)) $$$ obteremos: $$\log (f(x))=\log \left(m_{0}\right)+m_{1} x$$ Rotacione a tela. Fazendo $$$ m_{0}^{\prime}=\log \left(m_{0}\right) \text { e } \log (f(x))=y^{\prime} $$$, teremos: $$y^{\prime}=m_{0}{ }^{\prime}+m_{1} x$$ Rotacione a tela. Chegamos em uma função linear. Para exemplificar, vamos apresentar um programa em Python que determina os parâmetros $$$ m_{0} $$$ e $$$ m_{1} $$$ da função não linear $$$ f(x) $$$: Python Atenção! No módulo numpy, a função log é de base e, ou seja, $$$ \log_{e} $$$, embora o número neperiano e seja omitido, a partir de agora, usaremos a função $$$ log $$$, como o numpy trabalha. import numpy as np import matplotlib.pyplot