Baixe o app para aproveitar ainda mais
Prévia do material em texto
> Modelagem Matemática Aula 3: Solução de Equações de uma Variável – Cálculo de zeros de uma função Apresentação: Nas duas primeiras aulas, nós vimos fundamentos importantes para que você tenha um excelente aproveitamento nesta disciplina. Começamos com o estudo da linguagem Python e, em seguida, estudamos os principais conceitos associados à aritmética computacional e a erros em aproximações matemáticas. A partir desta aula, começaremos a tratar da resolução de problemas clássicos em Engenharia. Dentre estes, destaca-se a resolução de equações de uma variável, também conhecida como o cálculo dos zeros de uma função. Por exemplo, é fácil saber que, dado f(x) = x – 2, o zero da função é x = 2, pois trata-se do único valor que faz com que a função f(x) seja igual a 0. No entanto, nem sempre é tão fácil; por exemplo, você consegue determinar ao menos um valor de x que torne f(x) = x – 3x + 4x - 2x + 13 igual a 0? Assim, o objetivo da aula de hoje é que você aprenda as principais técnicas de identi�cação de raízes ou zeros de funções de uma variável. Deste modo, você conhecerá os critérios de existência e unicidade de soluções, bem como os principais métodos de resolução (intervalos, aproximação e secantes). Por �m, você será capaz de aplicar os métodos estudados, por meio da implementação computacional de programas em Python. 7 5 4 2 Objetivos: Descrever os critérios de existência e unicidade de soluções; Identi�car os principais métodos de cálculo de zeros de uma função (intervalos, aproximação e secantes); Empregar os métodos estudados com suporte da linguagem de programação Python; Descrição geral dos processos. Critérios de existência e unicidade Cálculos (Fonte: Freepik). Veremos alguns métodos na aula de hoje, cada um com sua metodologia e, naturalmente, com as vantagens e desvantagens associadas. Mesmo assim, apesar das diferenças existentes entre os métodos que serão estudados na aula de hoje, é importante que você saiba desde já que eles possuem certos processos em comum. Em outras palavras, em cada um deles, você perceberá que os seguintes passos são executados: Determinação de uma estimativa inicial; Cálculo da raiz aproximada, através de um processo iterativo até a precisão desejada, ou seja, emprega-se a repetição de procedimentos, a �m de se obter um resultado cada vez mais preciso. Dentre as características comuns aos processos iterativos, nós podemos identi�car os seguintes: Clique nos botões para ver as informações. É preciso que você, ao iniciar o uso da técnica, estabeleça um conjunto inicial de valores, escolhidos como uma primeira tentativa para obtenção do resultado do problema – neste caso, o zero ou raiz de uma função f(x) qualquer. Existem diferentes formas de se conseguir esta estimativa, de acordo com o método de solução escolhido. Estimativa inicial É preciso que o método convirja para o resultado real e apresente a solução do problema – ou seja, o valor da função deve se tornar cada vez mais próximo de zero a cada iteração. No entanto, é importante que você saiba que este atributo, embora importante, nem sempre é garantido, pois nem sempre a convergência é garantida em um processo numérico. Convergência Veja este conceito na Figura 1 apresentada a seguir: Utilizar um certo critério para interromper as repetições e assim indicar o atingimento da solução desejada. A escolha deste critério depende do problema a ser resolvido e da precisão que precisamos obter na solução. Os principais critérios utilizados são a diferença entre os valores inicial (a ) e �nal (b ) utilizados como estimativa ou o valor da própria função f(x) no ponto x , escolhido a partir da estimativa. Caso tais valores sejam menores do que o erro previamente estipulado (e), atingiu-se o citado critério de parada. Algebricamente, o conceito de critério de parada pode ser representado como |a - b | ≤ e OU |f(x )| ≤ e: Critério de Parada k k k k k k Uma pergunta pode ter vindo a sua mente: se eu desejo obter o zero de uma função, por que ter que estipular um valor de erro diferente de zero? Não seria melhor sempre escolher o valor 0 e, com isso, encontrar o valor exato? Faz sentido este pensamento. No entanto, nem sempre é possível determinar a raiz exata de uma função. Por exemplo, as raízes da função f(x) = x – 3 são ± 1.7320508075688… , ou seja, não existe uma solução exata. Deste modo, é importante que você perceba desde já que a escolha correta da precisão do cálculo é uma decisão de grande importância a ser tomada no projeto. Para escolher uma aproximação adequada para o erro, utilize os princípios aprendidos na aula anterior. 2 Atenção Outra pergunta importante é saber se realmente existe um zero ou raiz da função. A forma mais adequada para se determinar tal existência é a partir do emprego do Teorema de Bolzano-Weierstrass. Apesar do nome complicado, o princípio é bem simples:conforme indicado em Moura (2017), considere uma função f(x) contínua em um intervalo [a,b], e α uma raiz de f(x) isolada neste intervalo. Assim, como estimativa inicial, escolhem-se dois pontos (a e b) tais que atendam ao Teorema de Bolzano, a saber: Seja uma função f(x) contínua em um intervalo [a, b], tal que f(a). f(b)< 0. Então, a função f(x) possui pelo menos uma raiz no intervalo [a, b]. Agora que você já sabe os princípios comuns de funcionamento dos métodos de cálculo dos zeros de uma função, podemos passar para os métodos propriamente ditos. Vamos juntos para a próxima seção? Figura 1 – Ilustração do Teorema de Bolzano(MOURA, 2017).. Métodos de cálculo de zeros de uma função O primeiro dos métodos a serem estudados nesta aula é o método da bisseção. Trata-se da forma mais intuitiva de se obter a raiz de uma função. Considere-se uma função f(x) contínua em um intervalo [a, b], e α uma raiz de f(x) isolada neste intervalo. Assim, como estimativa inicial, escolhem-se dois pontos (a e b) tais que atendam ao Teorema de Bolzano que vimos na seção anterior. Determinados os valores da estimativa inicial (a e b), subdivide-se este intervalo em duas metades - e para determinar um novo intervalo de busca pela raiz da função. Agora, você deve testar se a raiz está contida na primeira ou na segunda metade do intervalo inicial, usando o teorema de Bolzano. Como fazer isto? Simples: se a função f(x) mudar de sinal entre a e (a + b)/2, a raiz está nesta primeira metade do intervalo [a, b]; caso contrário, a raiz está na segunda metade do intervalo original. [a, ]a+b 2 [ , b]a+b 2 Agora é só repetir o procedimento: divide-se o novo intervalo ao meio para constatar em qual metade está a raiz. A estimativa da raiz α em cada etapa será o ponto médio do intervalo em estudo onde sabe-se e existe uma raiz. Como em todo processo numérico, é importante a estimativa do erro nesse resultado obtido. No caso do método da bisseção, o erro na estimativa será dado pela metade do comprimento do intervalo em estudo. Além disto, você deve tomar outros cuidados: 1 Escolher os pontos iniciais a e b convenientes; 2 Escolher cuidadosamente os erros de arredondamento, pois pode se conduzir a intervalos que não contêm uma raiz. 3 Determinar previamente um número máximo de iterações, a �m de que não se faça uma busca sem �m pela raiz de uma função, pois existem casos nos quais não existe solução válida. O algoritmo do método da bisseção é dado a seguir: nome_do_arquivo.html /* Dados de Entrada: estimativa inicial – a, b; função f(x); valor de convergência – ε; */ /* número máximo de iterações - L */ Início f0 ← f(a) f1 ← f(b) i ← 1 Enquanto (f0 > ε e f1 > ε e i <= L) faça Se |a - b| < ε Então raiz ← (a+b)/2 Fim-Se média ← (a+b)/2 f2 ← f(média) Se f0*f2 < 0 Então b ← média f1 ← f(média) Senão a ← média f0 ← f(média) Fim-Se i ← i+1 Fim-Enquanto. Se i > L Então Imprima (“Não houve convergência!”) Se |f0| <= ε Então raiz ← f0 Senão raiz ← f1 Fim-Se Fim-Algoritmo Como exemplo de cálculo da raiz de uma função, a partir do emprego do Métododa Bisseção, vamos utilizar o exemplo contido em Moura (2017), considerando a função equação x – 3e + 3,5 = 0. O objetivo é encontrar o valor da raiz para a equação apresentada, apresentando a sequência de aproximações de x. 3 x Veja este conceito na Figura 1 apresentada a seguir: Considere os pontos x0 e x1 como os pontos iniciais, os quais devem ser escolhidos de modo a atender ao Teorema de Bolzano. Neste exemplo, sejam x0 = -1,8 e x1 = -1,2, pois f (x0) = -2,83 (ou seja, menor do que zero) e f(x1) = 0,87 (ou seja, maior do que zero). Assim, o valor de x2 a ser pesquisado é x2 = = -1,5, para o qual se tem que f(-1,5) = -0,54. Com isto, tem-se que o novo intervalo de busca será entre -1,5 e -1,2, visto que f(-1,5) e f(-1,2) têm sinais opostos. Procedendo sucessivamente deste modo até identi�car uma aproximação da raiz α, tem-se o preenchimento da Tabela 1 apresentada a seguir, a qual indica a sequência para uma tolerância de erro igual a 0,01 – por isso, o valor de α é -1,4015, pois |f(α)| = |0,008| < 0,01. Já o método de Newton-Raphson emprega uma técnica clássica de obtenção da raiz de uma função. Exatamente como �zemos no método da Bisseção, vamos considerar uma função f(x) contínua em R e α uma raiz de f(x) isolada neste intervalo. Assim, nosso primeiro passo é escolher uma estimativa inicial. O ponto escolhido (x ) deve ser tal que exista a derivada da função f(x) no ponto x . Feita esta escolha, determinamos o valor da nova estimativa da raiz da função – agora, x . Como fazer isto? A escolha do ponto x se dá a partir de uma reta tangente à função f(x) e que passe pelo ponto (x1, f(x1)). O valor de x é obtido pela interseção dessa reta tangente com o eixo x do plano cartesiano. Veja a Figura 2 para identi�car gra�camente a forma de obtenção da nova estimativa x : xo+x1 2 Tabela 1 – Sequência de aproximações – Cálculo de raiz de função – Método da Bisseção. Iteração x0 F(x0) x1 F(x1) x2 F(x2) 1 -1,8 -2,83 -1,2 0,87 -1,5 -0,54 2 -1,5 -0,54 -1,2 0,87 -1,35 0,26 3 -1,5 -0,54 -1,35 0,26 -1,425 0,12 4 -1,425 -0,12 -1,35 0,26 -1,3875 0,08 5 -1,425 -0,12 -1,3875 0,08 -1,4062 -0,2 6 -1,4062 -0,02 -1,3875 0,08 -1,3968 0,03 7 -1,4062 -0,02 -1,3968 0,03 -1,4015 0,008 1 1 2 2 2 2 Agora que você já sabe os princípios comuns de funcionamento dos métodos de cálculo dos zeros de uma função, podemos passar para os métodos propriamente ditos. Vamos juntos para a próxima seção? Figura 2 – Método de Newton-Raphson – Determinação de aproximações sucessivas da raiz da função (MOURA, 2017). Veja que a mesma estratégia foi empregada para determinar o valor de x a partir de x .3 2 Como determinar o valor de x ? Esta nova estimativa x é dada pela expressão x =x - . Assim, para se determinar uma nova estimativa, basta repetir o processo. Por exemplo, dada uma estimativa x , a nova aproximação para a raiz α será x , que podemos calcular a partir da expressão apresentada a seguir: x = x Lembra que nós precisamos estimar corretamente o erro no resultado obtido? No caso do método de Newton-Raphson, há um detalhe adicional: existem problemas de convergência em caso de raízes com multiplicidade > 2, com escolhas inadequadas de x (por exemplo, quando o valor de f'(x ) é muito menor do que o de f(x )) ou quando se obtém um valor x que seja um extremo local (ponto de máximo ou de mínimo em uma vizinhança – neste último caso, porque a derivada da função f(xi) �ca igual a 0, o que torna impossível a divisão proposta para cálculo das estimativas. Isto reforça o cuidado em se estipular, logo de início, um número máximo de iterações, a �m de que não se faça uma busca infrutífera pela raiz de uma função em casos nos quais não há convergência para uma solução válida. Vamos ver o algoritmo que implementa o método de Newton-Raphson? Veja só: 2 2 2 1 f( )x1 ( )f ′ x1 i i+1 i+1 i f( )x1 ( )f ′ x1 0 0 0 i /* Dados de Entrada: estimativa inicial – x0; função f(x); derivada f'(x); valor de convergência – ε; número máximo de iterações - L */ x1 ← x0 - f(x0)/f'(x0) i ← 1 Enquanto (|f(x1)|> ε e i <= L) faça x0 ← x1 ← x0 – f(x0)/f'(x0) i ← i+1 Fim-Enquanto. Se i > L Então Imprima (“Não houve convergência!”) Fim-Se Se |f(x1)|<= ε Então raiz ← x1 Fim-Se Fim-Algoritmo Como exemplo de cálculo da raiz de uma função, a partir do emprego do Método de Newton-Raphson, vamos considerar, mais uma vez, a função equação x – 3e + 3,5 = 0. O objetivo é encontrar o valor da raiz para a equação apresentada, apresentando a sequência de aproximações de x, só que utilizando este novo método que nós acabamos de aprender. Vamos escolher o ponto inicial x , tomando o cuidado de não ter uma derivada igual a zero. Neste exemplo, seja x0 = -1,5. Assim, o valor da nova estimativa (x ) é dado por x = x - . Substituindo pelos valores dados, temos: x = -1,5 - = -1,41, sendo que o valor da função neste novo ponto é f(-1,41) = -0,03. Fazendo esta operação até identi�car uma aproximação da raiz α, tem-se o preenchimento da Tabela 2 apresentada a seguir, a qual indica a sequência para uma tolerância de erro igual a 0,01 – por isso, o valor de α é -1,4032, pois |f(α)| = |-0,0002| < 0,01. Repare que, neste caso, nós precisamos somente de duas iterações, enquanto empregamos 7 iterações no caso anterior. Este pequeno exemplo ilustra o fato de que o método de Newton-Raphson apresenta, geralmente, convergência mais rápida do que no da Bisseção. Por outro lado, o que fazer nos casos em que houver di�culdade no emprego das derivadas? Nestes casos, recomenda-se a utilização de secantes à função f(x) para a qual se deseja calcular a raiz da função – ou seja, propõe-se o emprego do Método das Secantes, terceiro e último método que veremos na aula de hoje. 3 x 0 1 1 0 f( )x0 ( )f ′ x0 1 −0,54 6,08 Tabela 2 – Sequência de aproximações – Cálculo de raiz de função – Método de Newton-Raphson. Iteração x0 F(x0) F'(x0) x1 F(x1) F'(x1) 1 -1,5 -0,54 6,08 -1,4105 -0,03 5,23 2 -1,4105 -0,03 5,23 -1,4032 -0,0002 5,1694 Conhecendo o Método das secantes Como funciona o Método das Secantes? Simples. Considere-se uma função f(x) contínua em R e α uma raiz de f(x) isolada neste intervalo. Assim, como estimativa inicial, escolhem-se dois pontos (x e x ) quaisquer. Em seguida, você deve determinar os valores das funções nos dois pontos escolhidos: ou seja, f(x )e f(x ). 0 1 0 1 Da mesma forma que �zemos nos métodos anteriores, o processo é repetido tantas vezes quantas necessárias, até encontrar uma aproximação para a raiz da função ou até chegar ao número máximo de iterações. Por exemplo, se nós tivermos duas estimativas xi e x , a nova aproximação para a raiz α será x , obtida a partir da expressão Como em todo processo numérico, é importante a estimativa do erro nesse resultado obtido. No caso do método das Secantes, há relatos de menos problemas de convergência do que no Método de Newton-Raphson, embora requeira um número maior de iterações do que este último para apresentar a estimativa da raiz α para a função f(x). Veja a seguir o algoritmo que implementa o método das Secantes: Com estas informações, você pode determinar o valor de x , a nova estimativa da raiz da função. A expressão matemática que calcula esta nova estimativa é: Gra�camente, este novo ponto é calculado a partir da interseção da reta secante que passa pelos pontos (x , f(x )) e(x , f(x )) com o eixo x. Veja a Figura 3: 2 = −x2 x1 ( − ).f( )x1 x0 x1 f( )−f( )x1 x0 0 0 1 1 Figura 3 – Método das Secantes – Determinação de aproximações sucessivas da raiz da função(MOURA, 2017). i-1 i+1 = −xi+1 xi ( − ).f( )xi xi−1 xi f( )−f( )xi xi−1 Logo, deve ser também estipulado inicialmente um número máximo de iterações, a �m de que não se faça uma busca inde�nida pela raiz de uma função. /* Dados de Entrada: estimativa inicial – x0 e x1; função f(x); valor de convergência – ε; número máximo de iterações - L */ x2 ← x1 - (x1 – x0)*f(x1)/(f(x1) - f(x0)) i ← 1 Enquanto (|f(x2)|> ε e i <= L) faça x0 ← x1x1 ← x2 x2 ← x1 - (x1 – x0)*f(x1)/(f(x1) - f(x0)) i ← i+1 Fim-Enquanto. Se i > L Então Imprima (“Não houve convergência!”) Fim-Se Se |f(x2)|<= ε Então raiz ← x2 Fim-Se Como exemplo de cálculo da raiz de uma função, a partir do emprego do Método das Secantes, vamos considerar mais uma vez a função dada por x – 3e + 3,5 = 0. O objetivo também é o mesmo: encontrar o valor da raiz para a equação apresentada, apresentando a sequência de aproximações de x. Vamos considerar os pontos x e x como os pontos iniciais, os quais devem ser escolhidos de modo que f(x0) ≠ f(x1). Neste exemplo, vamos escolher x = -1,8 e x = -1,2. Assim, temos f (x0) = -2,83 e f(x1) = 0,87. Com base nos valores escolhidos, substituímos nas fórmulas dadas e obtemos x como: = 1,2 - = -1,3410.Substituindo na fórmula, temos que f(-1,3410) = 0,30. A Tabela 3 mostra a sequência de valores obtidos, indicando o valor �nal de α para uma tolerância de 0,01 como -1,4024, pois |f(α)| = |f(-1,4024)| = |0,004| < 0,01. Puxa, quanta informação importante! Como fazer isto tudo em Python? Para terminar esta aula, vamos ver como resolver o problema de determinação de zeros de uma função utilizando a linguagem Python? Vamos em frente. 3 x 0 1 0 1 2 = −x2 x1 ( − ).f( )x1 x0 x1 f( )−f( )x1 x0 (1,2+1,8).(0,87) 0,87+2,83 Tabela 3 – Sequência de aproximações – Cálculo de raiz de função – Método das Secantes. Iteração x0 F(x0) x1 F(x1) x2 F(x2) 1 -1,8 -2,83 -1,2 0,87 -1,3410 0,30 2 -1,2 -0,87 -1,3410 -0,30 -1,4168 -0,07 3 -1,3410 -0,30 -1,4168 0,07 1,4024 0,004 Aplicação da linguagem Python Vamos ver os códigos em Python destes três métodos? Com isto, creio que você estará em condições de aplicar os conhecimentos aprendidos em implementações computacionais que o ajudem a solucionar problemas em Engenharia. Conforme exposto em UFRGS (2019), segue o código do método da Bisseção: As variáveis de entrada são: a Extremo esquerdo do intervalo de inspeção [a,b] b Extremo direito do intervalo de inspeção [a, b] TOL Tolerância (critério de parada). N Número máximo de iterações. A variável de saída é: • p - aproximação da raiz de f, isto é, f(p)≈0. Por exemplo, considere a função f(x) = x – 9x + 3. Deste modo, de�nimos esta função em Python da seguinte forma: deffuncao(x0): return x0**3 – 9*x0 + 3 Escrevendo agora o código em Python, temos: 3 from __future__ import division def biss(a, b, TOL, N): f0 = funcao(a) f1 = funcao(b) i = 1 while ((abs(funcao(a)) > TOL) and (abs(funcao(b)) > TOL) and (i<= N)): if (abs (a-b) < TOL): raiz = (a + b)/2 media = (a + b)/2 f2 = funcao(media) if (f0*f2 < 0): b = media f1 = funcao(media) else: a = media f0 = funcao(media) i = i + 1 if (i > N): print ('Nao houve convergencia') if (abs(funcao(a)) < TOL): raiz = a else: raiz = b Já para o método de Newton-Raphson, você precisa de�nir antes sua função, além da derivada correspondente. Por exemplo, considere a função f(x) = x – 9x + 3. A função derivada correspondente é f’(x) = 3x – 9. Deste modo, de�nimos3 2 estas funções em Python da seguinte forma: deffuncao(x0): return x0**3 – 9*x0 + 3 def derivada(x0): return 3*x0**2 – 9 Assim, estamos prontos para elaborar um código em Python que execute este método. Veja só: from __future__ import division def nr(x0, TOL, N): x1 = x0 - funcao(x0)/derivada(x0) i = 1 while ((abs(funcao(x1)) > TOL) and (i<= N)): x0 = x1 x1 = x0 - funcao(x0)/derivada(x0) i = i+1 if (i > N): print ('Nao houve convergencia!'); if (abs(funcao(x1)) < TOL): return x1 return raiz Por �m, temos uma implementação para o método das Secantes, correspondente ao algoritmo que você estudou na aula de hoje. Veja a seguir: from __future__ import division def nr(x0, TOL, N): x2 = x1 - (x1 - x0)*funcao(x1)/(funcao(x1) - funcao(x0)) i = 1 while ((abs(funcao(x2)) > TOL) and (i<= N)): x0 = x1 x1 = x2 x2 = x1 - (x1 - x0)*funcao(x1)/(funcao(x1) - funcao(x0)) i = i+1 if (i > N): print ('Nao houve convergencia!'); if (abs(funcao(x2)) < TOL): return x2 Atividades 1. Determine a raiz da função x – 3x + 3, utilizando o método das Secantes em Python, com pontos de partida -1,8 e -1,2.4 3 a) 1,19 b) 1,29 c) 1,24 d) 1,14 e) mensagem de erro 2. Determine a raiz da função x – 3x + 3, utilizando o método de Newton Raphson em Python, com ponto de partida -1.4 3 a) 1,19 b) 1,29 c) 1,24 d) 1,14 e) mensagem de erro 3. Determine a raiz da função x – 3x + 3, utilizando o método das Secantes em Python, com pontos de partida 49 e 52.4 3 a) 1,19 b) 2,87 c) 2,44 d) 1,78 e) mensagem de erro 4. Determine a raiz da função x – 3x + 3, utilizando o método de Newton Raphson em Python, com ponto de partida 50.4 3 a) 1,19 b) 1,29 c) 1,24 d) 1,14 e) mensagem de erroL 5. Determine a raiz da função x – 3x + 3 utilizando o método da Bisseção em Python, com pontos de partida 0 e 2.4 3 a) 1,18 b) 1,28 c) 1,23 d) 1,13 e) mensagem de erro Referências MOURA, D. F. C, Cálculo Numérico. Rio de Janeiro: SESES, 2017. 144 p. UFRGS (colaborativo). Cálculo Numérico: Um Livro Colaborativo Versão Python. Porto Alegre: UFRGS, 2019. Próxima aula Aprofundar nos conceitos de sistemas de equações lineares, com foco nos métodos diretos; O método de Gauss-Jordan; O método de decomposição LU; Aplicar os novos conhecimentos, implementando-os com suporte da linguagem de programação Python. Explore mais Pesquise na internet, sites, vídeos e artigos relacionados ao conteúdo visto. Em caso de dúvidas, converse com seu professor online por meio dos recursos disponíveis no ambiente de aprendizagem.
Compartilhar