Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 RESOLUCAO DE EQUACOES DIFERENCIAIS ORDINARIAS POR METODOS NUMERICOS UTILIZANDO A MATEMATICA INTERVALAR Alceu Domingues Alves - UFPE/UPE aaalllceu@yahoo.com.br Romildo Albuquerque Nogueira - DMFA/UFRPE ran.pe@terra.com.br 1. Introdução A Matemática Intervalar visa dar suporte a problemas que lidam com a in- certeza. Os números representados como intervalos servem como controladores da propagação do erro, uma vez que garantem que a resposta correta de deter- minado problema pertence ao intervalo obtido. Desse modo, pode-se afirmar que sua utilização consiste no controle rigoroso da propagação dos erros dos dados e parâmetros iniciais ao longo do processo computacional provocada por sucessivos erros de arredondamentos e/ou truncamentos. Portanto, A finalidade principal da matemática intervalar é o controle do erro nas operações numéricas. Nesse contexto, o objetivo deste trabalho é proceder uma aplicação da matemática intervalar nas soluções de equações diferenciais ordinárias e compará-las com soluções numéricas. Portanto, as soluções numéricas foram obtidas através da implementação computacional na linguagem Phyton, bem como através do sistema Maple, e soluções intervalares desenvolvidas através do ambiente de programação IntPy que prevê a tipagem de variáveis como intervalares. O trabalho está dividido em sete seções. A primeira seção refere-se à apre- sentação do trabalho. A seção seguinte trata da apresentação de erros de aprox- imação, arredondamento e truncamento em máquinas calculadoras e computadores. Na terceira seção, apresentamos algumas definições básicas que envolvem a matemática intervalar, seguida da quarta seção que onde mostramos com brevidade o que são equações diferenciais ordinárias. A seção cinco contém uma breve explanação de alguns métodos de solução das equações diferenciais ordinárias, na seção seis apresentamos os resultados das soluções das equações diferenciais ordinárias pelo métodos de solução apresentados, utilizando meios numéricos e a matemática intervalar, seguida da última parte do trabalho onde faço as conclusões. 2. Erros de Aproximação, arredondamento e trun- camento Dado um problema f́ısico, para obtermos soluções numéricas nem sempre con- seguimos valores próximos do que se esperaria, podendo também chegar a resultados 2 que não têm relação alguma com o problema original. Isto se deve ao fato de que quando utilizamos calculadora ou o computador, estes possuem limitações quanto à representação dos números, principalmente quando necessitamos de números in- finitos. A representação de um número depende da base escolhida ou dispońıvel na máquina em uso, e do número máximo de d́ıgitos usados na sua representação. Sendo assim, torna-se necessário um arredondamento ou um truncamento dessa rep- resentação, o que gera um erro. No computador ou calculadora, de maneira geral, um número é representado internamente por impulsos elétricos que indicam dois estados: 0 ou 1, ou seja, na base 2 ou binária. Tal representação de um número x na base β é dada por: x = ± [ d1 β1 + d2 β2 + · · ·+ dt βt ] βe onde: β - é a base em que a máquina opera; di - são números inteiros contidos no intervalo 0 ≤ di ≤ β − 1; i = 1, 2, · · · , t; e - é o expoente no intervalo [I, S]; I, S - são os limites inferior e superior respectivamente, para a variação do expoente;[ d1 β1 + d2 β2 + · · ·+ dt βt ] - é chamada de mantissa e é a parte do número que representa seus d́ıgitos significativos e t é o número de d́ıgitos significativos do sistema de rep- resentação, comumente chamado de precisão da máquina. Por exemplo, um número é representado em uma máquina que opera no sistema β = 10; t = 3; e = [−2, 2] da seguinte forma: ±0.d1d2d3 × 10e, onde 0≤ dj ≤ (β − 1), d1 6= 0,−2 ≤ e ≤ 2. O zero em ponto flutuante é, em geral, representado com o menor expoente posśıvel na máquina. Isto porque a representação do zero por uma mantissa nula e um expoente qualquer para a base β pode acarretar perda de d́ıgitos significativos no resultado da adição deste zero a outro número. Por exemplo, em uma máquina que opera na base 10 com 4 d́ıgitos na mantissa, para x = 0.0000 × 104 e y = 0.3134 × 10−2 o resultado de x + y seria 0.3100 × 10−2, isto é, são perdidos dois d́ıgitos do valor exato y. Este resultado se deve à forma como é efetuada a adição em ponto flutuante. Portanto, dada a forma de representação de um número na máquina, podem ser necessários arredondamentos ou truncamentos de forma que se perca informações sobre esse número, cometendo-se assim erros. 2.1. Erro Absoluto Definimos como erro absoluto a diferença entre o valor exato de um número x e de seu valor aproximado x′: EAx = x− x′. 3 Apenas o valor de x′ é conhecido, neste caso é imposśıvel obter o valor exato do erro absoluto. O que se faz é obter um limitante superior ou uma estimativa para o módulo do erro absoluto. Por exemplo, sabendo-se que π ∈ (3.14, 3.15) tomaremos para π′ um valor dentro deste intervalo e teremos então |EAπ| = |π − π′| < 0.01. 2.2. Erro Relativo O erro relativo é definido como o erro absoluto dividido pelo valor aproximado: ERx = EAx x′ = x− x′ x′ . Numa comparação entre dois números, como saber se ambos estão representados com a mesma precisão? É preciso comparar a ordem de grandeza de x e y. O número que tiver a maior ordem de grandeza será o mais preciso, porém, dependendo da ordem de grandeza dos números envolvidos, o erro absoluto não é suficiente para descrever a precisão de um cálculo. Por essa razão, o erro relativo é mais amplamente empregado. 2.3. Erros de Arredondamento e Truncamento Na maioria dos sistemas, o resultado exato da operação é normalizado e em seguida arredondado ou truncado para t d́ıgitos, obtendo assim o resultado aproximado, que é armazenado na memória da máquina. Na fórmula geral, quando se usa trunca- mento, o erro relativo da operação será: |ERx| < 10−t+1 E no arredondamento: |ERx| < 1 2 × 10−t+1 Dada uma seqüência de operações, como, por exemplo, u = [(x+ y)− z− t]÷w, é importante a noção de como o erro em uma operação propaga-se ao longo das operações subseqüentes. O erro total em uma operação é composto pelo erro das parcelas ou fatores e pelo erro no resultado da operação. Para exemplificar a idéia de truncamento e arredondamento, considere um sis- tema de ponto flutuante de quatro digitos na base 10. Dados x = 0.957 × 104 e y = 0.1272 × 102, obter x + y. A adição em aritmética de ponto flutuante requer o alinhamento dos pontos decimais dos dois números. Para isto, a mantissa do número de menor exponte dave ser deslocada para a direita. Este deslocamento deve ser de um número de casas decimais igual à diferença entre os dois expoentes. Alinhando os pontos decimais dos valores acima, temos: x = 0.957× 104 e y = 0.001272× 104. Então: x+ y = (0.957 + 0.001272)× 104 = 0.938272× 104. Este é o resultado exato desta operação. Dado que em nosso sistema t é igual a 4, este resultado deve ser arredondado ou truncado. Para se arredondar um número, 4 segue-se a seguinte regra: pega-se o último algarismo da mantissa, se esse algarismo for menor que 5, o algarismo na posição anterior permanece o mesmo. Caso ele seja maior ou igual a 5, o algarismo na posição anterior é incrementado de uma unidade. Repete-se esse procedimento até chegar no número de algarismos permitidos pelos sistema. Para se truncar um número, simplesmente despreze os algarismos que vierem depois da posição de t que é o tamanho da mantissa. Então, o resultado do nosso exemplo, por arredondamento, é 0.9383× 104 e por truncamento é 0.9382× 104. 3. A Matemática intervalar A matemática intervalar surgiu no final da década de 50 visando dar suporte a problemas que lidam com a incerteza. Os números representados como intervalosservem como controladores da propagação do erro, uma vez que garantem que a re- sposta correta de determinado problema pertence ao intervalo obtido. Desse modo, pode-se afirmar que sua utilização consiste no controle rigoroso da propagação dos erros dos dados e parâmetros iniciais ao longo do processo computacional provocada por sucessivos erros de arredondamentos e/ou truncamentos. Portanto, a matemática intervalar busca resolver problemas que se concentram fundamentalmente na criação de um modelo computacional que reflita fidedigna- mente o controle e análise dos erros que ocorrem no processo computacional, e na escolha de técnicas de programação adequadas para desenvolvimento de softwares cient́ıficos buscando minimizar os erros nos resultados. 3.1. Definições Básicas da Matemática Intervalar O conjunto de todos os x ∈ R satisfazendo a condição a1 ≤ x ≤ a2, é chamado um intervalo e é denotado por: [a1; a2] = {x ∈ R|a1 ≤ x ≤ a2} Já o conjunto IR, ou espaço dos intervalos, é definido como sendo o conjunto de todos os intervalos reais, ou seja: IR = {[a1; a2] | a1, a2 ∈ R, a1 ≤ a2} 3.2. Relação de Ordem entre Intervalos Sejam X = [x1;x2], Y = [y1; y2], Z = [z1; z2] e W = [w1;w2]. Os intervalos X e Y são iguais se e só se x1 = y1 e x2 = y2. Entre as várias relações de ordem intervalares descritas na literatura, tem-se a extensão intervalar da relação de ordem real < definida por Moore [4] como segue: X < Y ⇐⇒ x2 < y1 5 Outra relação de ordem é dada por: X ≤ Y, x1 ≤ y1 ∧ x2 ≤ y2 As relações usuais se aplicam, pois os intervalos também são conjuntos. 3.3. Aritmética As operações aritméticas no espaço dos intervalos R são definidas por: (i) X + Y = [x1 + y1;x2 + y2], (ii) X ∗ Y = [min(δ);max(δ)]. Onde δ = {x1y1;x1y2;x2y1;x2y2}. Complementarmente, são definidos os elementos negativo e rećıproco, respectivamente: (iii) −X = [−x2;−x1] = {−x|x ∈ R} , (iv) 1/X = [1/x2; 1/x1] = [1/x|x ∈ X ∧ 0 /∈ X]. Assim: (v) X − Y = X + (−Y ), (vi) X/Y = X ∗ 1/Y. 3.4. Exatidão máxima A primeira questão que se impõe a qualquer tentativa de implementação da ar- itmética intervalar em computadores é o fato de que o espaço de intervalos não é mais definido sobre os reais, mas sim sobre o sistema de ponto flutuante. É necessário, portanto, utilizar-se de método que garanta a inclusão do resultado ver- dadeiro no resultado intervalar. Esse método é a aritmética de exatidão máxima. Aplicada à matemática intervalar, a aritmética de exatidão máxima redefine a ar- itmética intervalar de modo que: (i) X + Y = [(x1 + y1); (x2 + y2)], (ii) X ∗ Y = [min(∇δ);máx(∆δ)]. onde ∇ e ∆ constituem os arredondamentos direcionados do sistema de ponto flu- tuante. 6 3.5. Outras definições O valor absoluto de um intervalo X é definido por: |X| = max {|x1| , |x2|} e seu diâmetro é dado por: w(X) = x2 − x1. Define-se também o ponto médio de X: mid(X) = 1 2 (x1 + x2). Objetivando transformar R em espaço métrico define-se a distância de Hausdorff entre X e Y como: d(X;Y ) = max {|y1 − x1| , |y2 − x2|} . No próximo caṕıtulo, apresentaremos uma breve definição de equações diferen- cias ordinárias de primeira ordem e as respectivas soluções, considerando os métodos de Taylor e Runge-Kutta. 4. Equações Diferenciais Ordinárias - EDO A equação F = (x, y, dy dx , d2y dx2 , d3y dx3 , ..., dny dxn ) = 0 (4.1) é chamada de equação diferencial ordinária de n-ésima ordem [1]. Ela é uma equação ordinária porque há somente uma variável independente, x. É de n-ésima ordem porque a maior derivada presente na equação é de ordem n. Uma função y(x), n vezes diferenciável, é uma solução de (4.1) se satisfaz a equação. De acordo com Boyce [1], uma equação diferencial ordinária tem várias soluções. É necessário que sejam dadas informações adicionais sobre y(x) e sobre suas derivadas em valores espećıficos de x para que tenhamos uma solução única. Para uma equação diferencial de ordem n, normalmente são suficientes n condições adicionais para garantir que a solução y(x) seja única. Se todas as n condições adicionais forem especificadas para um mesmo valor de x, x0 por exemplo, temos o que chamamos de Problema de Valor Inicial. Caso estas n condições adicionais sejam dadas para mais de um valor de x, temos um Problema de Valor de Contorno. Em geral, é dif́ıcil a obtenção de soluções anaĺıticas para equações diferenciais. Na maioria dos casos as soluções devem ser geradas através de métodos numéricos. Iremos tratar apenas de equações diferenciais de 1a ordem, mas os métodos que iremos abordar também podem ser usados para resolver equações diferenciais de ordem superior. 7 4.1. Equações diferenciais ordinárias de primeira ordem Vamos considerar equações diferencias escritas na forma: F = (x, y, dy dx ) = 0. Esta equação pode ser escrita como: dy dx = f(x, y) ou y′ = f(x, y) (4.2) envolvendo uma função incógnita y = y(x) e sua derivada. Onde x é a variável independente e y é a variável dependente. A equação diferencial, juntamente com uma condição inicial, constituem um problema de valor inicial. O qual pode ser apresentado da seguinte forma:{ y′ = f(x, y) y(x0) = y0 (4.3) 5. Soluções numéricas de equações diferenciais ordinárias Há vários métodos de resolução de equações diferenciais, a maioria deles usa técnicas anaĺıticas como integração e expansão em série. Portanto, conforme Franco [3] procura-se sempre encontrar uma solução exata para o problema, infelizmente existem vários problemas importantes nos quais estes métodos ou não se aplicam, ou acabam gerando muitas complicações. Nestes casos é indicada a utilização de métodos numéricos para obter uma aprox- imação da solução do nosso problema. 5.1. O método de Taylor Consideremos o Problema de Valor Inicial. Aplicando a série de Taylor para y(x) no ponto xk, temos y(x) = y(xk)+ y′(xk) 1! (x−xk)+ y′′(xk) 2! (x−xk)2+...+ y(n)(xk) n! (x−xk)n+ y(n+1)(ξ) (n+ 1)! (x−xk)(n+1), calculando no ponto xk+1 e considerando que xk+1 − xk = h temos que y(xk+1) = y(xk) + y′(xk) 1! h+ y′′(xk) 2! h2 + ...+ y(n)(xk) n! hn + y(n+1)(ξ) (n+ 1)! h(n+1) (5.1) 8 Como y0(xk) = f(xk, yk) podemos relacionar as derivadas de ordem superior com as derivadas da função f(x, y). Como exemplo consideremos f ′′(xk) = d dx f(xk, yk) = fx + fyy′ = fx + fyf f ′′′(xk) = fy(fx + fyf) + f2fyy + 2ffxy + fxx. Desta forma podemos obter uma aproximação para o cálculo de 5.1, substituindo as relações do tipo acima na série de Taylor. Dizemos que um método para a solução de um problema de valor inicial é de ordem n se este coincide com a série de Taylor até o n-ésimo termo. O erro local cometido por esta aproximação será da forma E(xk+1) = y(n+1)(ξ) (n+ 1)! h(n+1) ξ ∈ [xk, xk+1] Em geral, podemos determinar a ordem do método de Taylor pela fórmula do erro. Se o erro depende da n-ésima derivada dizemos que o método é de ordem n-1. É importante lembrar que quanto maior a ordem do método mais preciso será o resultado. 5.2. O método de Runge-Kutta A estratégia do método de Runge-Kutta é aproveitar as qualidades do método de Taylor, ou seja, poder escolher a precisão do resultado, sem ter que calcular as derivadas totais de f(x, y). O método de Runge-Kutta utiliza valores de f(x, y) no intervalo [xn, xn + h] para obter uma boa aproximação para yn+1. O método de Runge-Kutta de 1a ordem coincide com o método de Taylor de 1a ordem e é mais conhecido como método de Euler. Apresentaremos apenas com Runge-Kutta de 3a e 4a ordem. • Runge-Kutta de 3a ordem yk+1 = yk + h 6 [f1 + 4f2 + f3] com os coeficientes f dados por f1 = f(xk, yk) f2 = f(xk + h2 , yk + h 2 f1) f3 = f(xk + h, yk + 2hf2 − hf1) • Runge-Kutta de 4a ordem yk+1 = yk + h 6 [f1 + 2f2 + 2f3 + f4] com os coeficientes f dados por 9 f1 = f(xk, yk) f2= f(xk + h2 , yk + h 2 f1) f3 = f(xk + h2 , yk + h 2 f1) f4 = f(xk + h, yk + hf3) 6. Resultados Para gerar os resultados deste trabalho, foram utilizadas tres ferramentas com- putacionais para calcular as soluções das equações diferenciais. As tres foram: Maple,Python e o IntPy. O Maple é uma poderosa ferramenta de computação algébrica que inicialmente foi desenvolvida por um grupo da Universidade de Wa- terloo no Canadá, e que atualmente é comercializado pela empresa MapleSoft. Este software possui várias ferramentas para cálculos simbólicos, cálculos numéricos, pro- gramação e construção de gráficos 2D e 3D. Atualmente, o Maple encontra-se na versão 14, sendo esta a versão utilizada neste trabalho para calcular as soluções das EDOs. O Python é uma linguagem de programação amplamente conhecida na comu- nidade acadêmica que possui várias caracteŕısticas como: alto ńıvel, interpretada, código aberto, imperativa, orientada a objetos, de tipagem dinâmica e forte. O objetivo principal destas caracteŕısticas é concentrar os esforços do pesquisador mais no desenvolvimento do algoritmo do que nos detalhes da implementação es- pećıficos de cada linguagem de programação. Estas peculiaridades do Python têm incentivado vários membros da comunidade acadêmica a desenvolverem programas e frameworks nesta linguagem. Neste trabalho a versão do Python utilizada para resolver as EDOs numericamente através de programação foi a 2.6. O IntPy é uma frameworks para Python desenvolvida e mantida por membros do Centro de Informática da Universidade Federal de Pernambuco que tem como objetivo implementar as Definições e Operações da Matemática Intervalar na lin- guagem Python. Neste ponto, enfatizamos a diferença entre trabalhar apenas com as funções numéricas nativas do Python e as funções que englobam as propriedades da matemática intervalar que o IntPy adiciona ao Python. A versão do IntPy uti- lizada neste trabalho é 0.1.3 para Windows 32 bits. Todas as ferramentas utilizadas neste trabalho foram executas em um computa- dor com processador Intel Core 2 Duo com 3GB de memória RAM, HD de 160GB e sistema operacional Windows XP 32bits. A equação diferencial ordinária utilizada nos testes foi y′ = y − x+ 1 com y(1) = −2. Esta equação possui solução algébrica conhecida que é dada por y = x + ex. Calculando-se f(1) da função obtemos o resultado 3, 7182818284598643 com 16 d́ıgitos significativos. Inicialmente utilizamos o Maple com o comando dsolve. Este comando é utilizado para encontrar soluções algébricas de equações diferenciais, quando estas existem, e também para achar as soluções numéricas aproximadas. O comando dsolve foi utilizado para apresentar a solução algébrica da equação de teste y′ = y − x + 1 com y(1) = −2. O Maple retornou a solução mostrada abaixo: 10 > eq1 := diff(f(x), x) = x− f(x) + 1; eq1 = d dx f(x) = x− f(x) + 1 > dsolve({eq1, f(1) = −2}); f(x) = x+ ex Depois o dsolve foi utilizado no Maple para encontrar as soluções numéricas com dois métodos clássicos de cálculo numérico aplicados a EDOs. O primeiro método numérico aplicado no Maple foi o da série de Taylor através do comando: dsolve (eq1,f(1)=-2,f(x),type=numeric,method=taylorseries). A parte {eq1,f(1)=-2}, está relacionada a equação já definida anteriormente com f(1) = −2. O segundo parâmetro f(x) diz ao Maple qual a variável procurada. Neste caso a função f(x) é a variável procurada na EDO. O parâmetro type=numeric informa ao Maple que a solução fornecida será numérica. O último parâmetro avisa ao Maple qual o método utilizado, neste caso, a série de Taylor. Quando pedimos para calcular f(1) o Maple retorna o seguinte valor: 6.436564336656945. O segundo método utilizado ainda no Maple foi o de Runge-Kutta de quarta ordem através do comando: dsolve (eq1,f(0)=2,f(x),type=numeric,method=classical[rk4]). O comando é semelhante ao já descrito na série de Taylor. A única mudança é em relação ao último parâmetro que informa ao Maple que o método utilizado é Runge-Kutta de quarta ordem. Quando solicitamos ao Maple para calcular f(1) ele retorna o seguinte valor: 6.4365944117336656. Também foi utilizado programação em Python para solucionar numericamente a equação de teste y′ = y − x + 1 com y(1) = −2 através dos dois métodos clássicos de cálculos numéricos já utilizados no Maple. O primeiro método aplicado na solução numérica em Python foi o método da série de Taylor de segunda ordem com 10.000 passos no intervalo de [0, 1]. O código fonte deste programa encontra-se no apêndice A . O resultado obtido foi de 6.43647773806. O segundo método aplicado na solução numérica em Python foi o método da Runge-Kutta de quarta ordem com 10.000 passos no intervalo de [0, 1]. O código fonte deste programa encontra-se no apêndice A. O resultado obtido foi de 6.43656365692. Foi utilizado também o IntPy para solucionar a equação de teste através dos conceitos e operações de matemática intervalar aplicados, conjuntamente aos dois métodos de cálculo numéricos já discutidos anteriormente. Os conceitos e operações de matemática intervalar aplicados juntamente com o método da série de Taylor de segunda ordem com 10.000 passos no intervalo de 11 [0, 1] gerou como resultado o intervalo [6.4365636478524619, 6.4365636478629584]. O código fonte em Python deste programa encontra-se no apêndice A. Os conceitos e operações de matemática intervalar aplicados juntamente com o método Runge-Kutta de quarta ordem com 10.000 passos no intervalo de [0, 1] gerou como resultado o intervalo [6.4365636569127167, 6.4365636569232674]. O código fonte em Python deste programa encontra-se no apêndice A. A Tabela 1 abaixo sintetiza os resultados obtidos para a equação de teste pe- los dois métodos numéricos utilizando as três formas de cálculo: Maple, Python (numericamente) e IntPy (Python com matemática intervalar). Tabela 1: Comparação dos Resultados Método de Taylor Método de Runge-Kutta Maple 6.436564336656945 6.4365944117336656 Python(numericamente) 6.43647773806 6.43656365692 IntPy(matemática intervalar) [6.4365636478524619, [6.4365636478629584, 6.4365636569127167] 6.4365636569232674] Pela análise da Tabela 1 notamos que os resultados dos métodos Runge-Kutta do Maple e do Python encontram-se dentro do intervalo gerado pelo IntPy, indi- cando assim que o IntPy gerou intervalos que encapsulam os resultados encontrados pelos dois outros softwares com um controle de erro, ou seja, a posśıvel resposta encontra-se dentro deste intervalo. Analisando ainda a Tabela 1 observa-se que no método de Taylor o resultado numérico do Python está dentro do intervalo do IntPy, reforçando que este é capaz de encapsular o resultado. O resultado do Maple pelo método de Taylor foi igual até a nona casa decimal aos resultados obtidos pelo Python numericamente, porém o resultado ficou fora do intervalo encontrado pelo IntPy. Uma possibilidade para tal resultado deve-se ao fato de que não se sabe como foi implementado o algoritmo da série de Taylor no Maple e nem quais os argumentos utilizados por ele. Além disso, outra posśıvel conclusão, seria que os erros de precisão, oriundos de processos de aproximação, truncamento e arredonda- mento, obtidos pelo Maple para o Método de Taylor são maiores do que nos outros sistemas testados. Foi realizado também um estudo comparativo do tempo de processamento da equação diferencial de teste em duas ferramentas computacionais (Python numeri- camente e IntPy) e nos dois métodos de cálculos numéricos (Taylor e Runge-Kutta) totalizando quatro resultados. Cada resultado é o tempo médio em segundos de 10 execuções. A Tabela 2 abaixo resume os quatro resultados médios encontrados experimentalmente. Observa-se pela Tabela 2 que o método de Taylor é mais rápido que o de Runge- Kutta. Neste caso em particular, isto se deveao fato que o método de Taylor foi aplicado até a segunda ordem enquanto o de Runge-Kutta foi aplicado até a 12 Tabela 2: Tempo médio em segundos de 10 execuções para cada método e para cada software na resolução da equação de teste Método de Taylor Método de Runge-Kutta Python(numericamente) 0.0160000324249 0.0629999637604 IntPy(matemática intervalar) 2.59399986267 6.96900010109 quarta ordem, logo o de Runge-Kutta realiza mais cálculos sendo assim mais lento. Observa-se também que a solução através do Python numericamente é mais rápida que o IntPy. Isto se deve ao fato de que uma operação envolvendo a matemática intervalar necessita realizar vários cálculos. Para melhor enfatizar o que foi dito tomaremos o exemplo da multiplicação de dois intervalos na matemática intervalar. Para realizar um produto de dois intervalos na matemática intervalar temos que ex- ecutar os produtos de todos os quatro extremos dos intervalos tomados dois a dois e depois pegar o menor e o maior dos quatro valores para serem os novos extremos do intervalo de resultado. Desta forma uma simples multiplicação na matemática intervalar é bem mais lenta que uma multiplicação comum. 7. Considerações Finais A finalidade principal da matemática intervalar é o controle do erro nas operações numéricas. O IntPy é uma framework que implementa as definições e operações da matemática intervalar na linguagem de programação Python. Os resultados apre- sentados neste trabalho mostram que o IntPy é capaz de realizar o cálculo numérico de equações diferenciais ordinárias mantendo o controle do erro dentro de um in- tervalo fechado, onde a solução numérica destas equações encontra-se encapsulada. A análise dos resultados dos tempos de processamento mostrou que o IntPy gasta um tempo maior para encontrar a solução de equações diferenciais em relação ao tempo gasto pelo método comum (sem a utilização dos conceitos de matemática intervalar), limitando assim a utilização do IntPy a aplicações que não exijam alto desempenho com relação ao tempo. 13 A Códigos Fonte PROGRAMA 1 #Metodo de Taylor de 2a ordem #Python Numericamente import intpy import time def f1(x,y): #Primeira func~ao return (y-x+1) def f2(x,y): #Segunda func~ao return (-x+y-1) x0=0 #x inicial y0=2 #f(x) inicial inicio=0 #Inicio do intervalo fim=1 #Fim do intervalo h=0.0001 #Tamanho do passo n=int ((fim-inicio)/h) #Numero de passos tempo1=time.time() #Guarda o tempo do incio do processamento for i in range (1,n+1): x1=x0+h #Calculo do proximo x y1=y0+h*f1(x0,y0)+h**2/2*f2(x0,y0) #Calculo do proximo y x0,y0=x1,y1 tempo2=time.time() #Guarda o tempo do fim do processamento print "x= ",x1," y= ",y1 print "Tempo de processamento em segundos: ",tempo2-tempo1 RESULTADO x= 1.0 y= 6.43647773806 Tempo de processamento em segundos: 0.0160000324249 PROGRAMA 2 #Metodo de Taylor de 2a ordem #IntPy (Matematica Intervalar) import intpy import time I=intpy.IReal #Substituic~ao do comando intpy.IReal por apenas I def f1(x,y): #Primeira func~ao return (y-x+1) def f2(x,y): #Segunda func~ao return (-x+y-1) x0=I(0,0) #x inicial no formato intervalar y0=I(2,2) #f(x) inicial no formato intervalar inicio=I(0,0) #Inicio do intervalo no formato intervalar fim=I(1,1) #Fim do intervalo no formato intervalar 14 hh=0.0001 #Tamanho do passo no formato numerico h=I(hh,hh) #Tamanho do passo no formato intervalar n=int ((1-0)/hh) #Numero de passos tempo1=time.time() #Guarda o tempo do incio do processamento for i in range (1,n+1): x1=x0+h #Calculo do proximo x y1=y0+h*f1(x0+h/2,y0+h/2*f1(x0,y0)) #Calculo do proximo y x0,y0=x1,y1 tempo2=time.time() #Guarda o tempo do fim do processamento print "x= ",x1," y= ",y1 print "Tempo de processamento em segundos: ",tempo2-tempo1 RESULTADO 2 x= 1.0 y= 6.43656365692 Tempo de processamento em segundos: 0.0629999637604 PROGRAMA 3 #Metodo de RK de 4a ordem #Python Numericamente import intpy import time def f1(x,y): return (y-x+1) #Define a func~ao x0=0 #x inicial y0=2 #f(x) inicial inicio=0 #Inicio do intervalo fim=1 #Fim do intervalo h=0.0001 #Tamanho do passo n=int ((fim-inicio)/h) #Numero de passos tempo1=time.time() #Guarda o tempo do incio do processamento for i in range (1,n+1): k1=f1(x0,y0) #Calculo de k1 k2=f1(x0+h/2.,y0+h/2.*k1) #Calculo de k2 k3=f1(x0+h/2.,y0+h/2.*k2) #Calculo de k3 k4=f1(x0+h,y0+h*k3) #Calculo de k4 x1=x0+h #Calculo do proximo x y1=y0+h/6.*(k1+2*k2+2*k3+k4) #Calculo do proximo y x0,y0=x1,y1 tempo2=time.time() #Guarda o tempo do fim do processamento print "x= ",x1," y= ",y1 print "Tempo de processamento em segundos: ",tempo2-tempo1 RESULTADO 3 x= [0.99999999999989531, 1.0000000000006355] y= [6.4365636478524619, 6.4365636478629584] Tempo de processamento em segundos: 2.59399986267 PROGRAMA 4 #Metodo de RK de 4a ordem 15 #IntPy (Matematica Intervalar) import intpy import time I=intpy.IReal #Substituicç~ao do comando intpy.IReal por apenas I def f1(x,y): return (y-x+1) #Define a funcç~ao x0=I(0,0) #x inicial no formato intervalar y0=I(2,2) #f(x) inicial no formato intervalar inicio=I(0,0) #Inicio do intervalo no formato intervalar fim=I(1,1) #Fim do intervalo no formato intervalar hh=0.0001 #Tamanho do passo no formato numerico h=I(hh,hh) #Tamanho do passo no formato intervalar n=int ((1-0)/hh) #Numero de passos tempo1=time.time() #Guarda o tempo do incio do processamento for i in range (1,n+1): k1=f1(x0,y0) #Calculo do K1 k2=f1(x0+h/2.,y0+h/2.*k1) #Calculo do K2 k3=f1(x0+h/2.,y0+h/2.*k2) #Calculo do K3 k4=f1(x0+h,y0+h*k3) #Calculo do K4 x1=x0+h #Calculo do proximo x y1=y0+h/6.0*(k1+k2*2+k3*2+k4) #Calculo do proximo y x0,y0=x1,y1 tempo2=time.time() #Guarda o tempo do fim do processamento print "x= ",x1," y= ",y1 print "Tempo de processamento em segundos: ",tempo2-tempo1 RESULTADO 4 x= [0.99999999999989531, 1.0000000000006355] y= [6.4365636569127167, 6.4365636569232674] Tempo de processamento em segundos: 6.96900010109 16 Referências [1] W.E. Boyce, R.C. DiPrima, Equações diferenciais elementares e problemas de valores de contorno, LTC, Rio de Janeiro, 2006. [2] D.G. Figueiredo, A.F. Neves, Equações difereciais aplicadas, IMPA, Rio de Janeiro, 2001. [3] N.B. Franco, Cálculo numérico, Pearson Prentice Hall, São Paulo, 2006. [4] R. E. Moore, ”Interval Analysis”, N. J., Prentice Hall Inc., Englewood Cliffs, 1966.
Compartilhar