Ferramentas Matemáticas para Computação Científica: mudanças entre as edições

De IFSC
Ir para navegação Ir para pesquisar
imported>Fargoud
imported>Fargoud
Linha 68: Linha 68:
O cálculo matemático total seria:
O cálculo matemático total seria:


[[image: FMCderiv2.png|center]]
[[image: FMCderiv3.png|center]]


E teríamos a resposta com um erro relativo percentual de:
E teríamos a resposta com um erro relativo percentual de:

Edição das 16h02min de 13 de março de 2019

Palestra apresentada durante a 
Semana Científica do Curso de Engenharia Elétrica
Campus Itajaí - março de 2019

Profa. Fernanda Argoud da Silva, M.Sc., Dr. Eng.


Introdução

O computador é uma ferramenta indispensável para o avanço da Ciência.

Apesar de ter que ser programado, é capaz de executar cálculos complexos e/ou repetitivos, em uma velocidade muito maior que qualquer ser humano e sem desgaste ou cansaço.

Porém, tem uma limitação muito severa:

⇒ MEMÓRIA
FMCmemoria.png

Um cálculo como o da integral, por exemplo, seria impossível, porque nenhum computador teria memória suficiente para armazenar infinitos valores.

FMCintegr.png


A solução, então, é discreta e numérica.

FMCintegralnumerica.png

Obviamente, a solução sempre será aproximada, jamais exata.

É importante, então, estabelecer uma tolerância, ou erro máximo admitido.

Cálculo "humano" x Cálculo numérico

Os algoritmos para cálculos científicos e matemáticos normalmente são específicos.

NÃO são procedimentos de resolução analítica, ou "humana", adaptados à uma linguagem de programação.

São procedimentos numéricos (iterativos) específicos, desenvolvidos com o objetivo de facilitar a resolução pelo computador e no menor tempo possível.

Cálculo de derivada de função

Solução analítica

A determinação analítica de uma derivada de função pode ser bastante complexa.

Tomemos como exemplo a resolução da derivada da função f(x) = x², no ponto x = 1.

Por definição, a derivada é o diferencial entre um ponto da função, e outro, localizado a uma distância h infinitesimal (tendendo a zero). Portanto, será:

FMCderiv2.png


Para uma função muito simples, como f(x) = x², são necessários vários cálculos literais, indefinidos e de limite.

Em computador, muitíssimo complicado ensinar a máquina a calcular "limites" tendendo a zero, ou a infinito.

Depois de se obter a correspondente função derivada, ainda é necessário calcular-se o valor desta, no ponto específico x = 1.

Solução numérica

Uma solução numérica, ainda que inexata, pode ser tremendamente mais simples.

Pode-se reduzir a substituir o valor de x = 1 na equação de cálculo da derivada, adotando como h um valor suficientemente pequeno (conceito do δ da derivada), tal como h = 0,001.

O cálculo matemático total seria:

FMCderiv3.png

E teríamos a resposta com um erro relativo percentual de:

Erro % = (2,01 - 2)/2 x 100 = 0,5%

Cálculo de raízes de equação

Raízes de uma equação y = f(x) → Quais são os valores de x que levam à equação y ao valor ZERO??

Em outras palavras: em que pontos de x a função atravessa o eixo y = 0?


Métodos "humanos" ou analíticos

  • Bhaskara ⇒ Baseado no uso dos coeficientes da equação:
FMCbhask.png


  • Para equações de terceiro grau:

Seja a equação da forma a.x³ + b.x² + c.x + d = a.(x - r1).(x - r2).(x - r3)

FMCraiz3.png

Mais informações: Relações de Girardi...

  • Para equações de quarto grau:

...

Método numérico - Bissecção

O método da bissecção é um método de busca de raízes que divide repetidamente um intervalo da função e então seleciona um subintervalo contendo a raiz para processamento adicional. Escolhe-se dois pontos extremos, a e b, de preferência para os quais haja um inversão de polaridade da curva.

FMCbissec.png


FMCbissecanim.gif

é usado frequentemente para obter uma primeira aproximação de uma solução, a qual é então utilizada como ponto inicial para métodos que convergem mais rapidamente.

Trata-se de um método simples e robusto, relativamente lento quando comparado a métodos como o método de Newton ou o método das secantes.

PSEUDOCÓDIGO:

ENTRADA: Função f, 
         extremos do intervalo a, b, 
         tolerância TOL, 
         número máximo de iterações NMAX
CONDIÇÕES: a < b, ou f(a) < 0 e f(b) > 0 ou f(a) > 0 e f(b) < 0
SAÍDA: valor que difere de uma raiz de f(x)=0 por menos do que TOL
N ← 1
Enquanto N ≤ NMAX # limita o número de iterações para prevenir um loop infinito
  c ← (a + b)/2 # novo ponto médio
  Se f(c) = 0 or (b – a)/2 < TOL então # solução encontrada
    Retorne(c)
    Pare
  Fim
  N ← N + 1 # incrementa o contador de iterações
  Se sinal(f(c)) = sinal(f(a)) então a ← c senão b ← c # novo intervalo
Fim
Retorne("O algoritmo falhou.") # núm. máximo de iterações excedido

Em Matlab/Scilab script:

function f=f(x)
f= x*x + log(x);
end

clear all
clc
% ---------Parametros
epsilon = 0.01; %tolerancia
a=0.5; %limite superior do intervalo inicial
b=1; %limite inferior do intervalo inicial
k=0; %contador de iteracoes
kf=floor((log(b-a)-log(epsilon))/log(2))+1; %n° max iteracoes
x=(a+b)/2; %x0
%-----------Iteracoes
tic
for i=1:kf %kf tb e criterio de parada
   %while (abs(f(x))>=epsilon | abs(b-a)>=epsilon)
   if abs(f(x))>=epsilon | abs(b-a)>=epsilon %criterio de parada
       if (f(a)*f(x))<0 %teste
           b=x; %novo intervalo se o teste se verifica
       else
           a=x;  %novo intervalo se o teste nao se verifica
       end
   else
       break %o algoritmo pára se tivermos os criterios < epsilon
   end
   x=(a+b)/2; %novo x: xk
   k=k+1; %conta as iteracoes
end
toc %tempo de execucao
%---------- Resultados
sprintf('x = %f',x) %mostre x
sprintf('f(x) = %f',f(x)) %mostre y
sprintf('|b-a| = %f',abs(b-a)) %mostre o intervalo
sprintf('Número de iteracoes ate atingir o resultado: %d',k) %mostre iteracoes