Ferramentas Matemáticas para Computação Científica: mudanças entre as edições
imported>Fargoud |
imported>Fargoud |
||
| Linha 138: | Linha 138: | ||
Retorne("O algoritmo falhou.") # núm. máximo de iterações excedido | Retorne("O algoritmo falhou.") # núm. máximo de iterações excedido | ||
Em Matlab | Em '''''Scilab''''' (~''Matlab'') ''script'': | ||
function f=f(x) | function f=f(x) | ||
| Linha 146: | Linha 146: | ||
clear all | clear all | ||
clc | clc | ||
// ---------Parametros | |||
epsilon = 0.01; | epsilon = 0.01; //tolerancia | ||
a=0.5; | a=0.5; //limite superior do intervalo inicial | ||
b=1; | b=1; //limite inferior do intervalo inicial | ||
k=0; | k=0; //contador de iteracoes | ||
kf=floor((log(b-a)-log(epsilon))/log(2))+1; | kf=floor((log(b-a)-log(epsilon))/log(2))+1; //n° max iteracoes | ||
x=(a+b)/2; | x=(a+b)/2; //x0 | ||
//-----------Iteracoes | |||
tic | tic | ||
for i=1:kf | 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 | if abs(f(x))>=epsilon | abs(b-a)>=epsilon //criterio de parada | ||
if (f(a)*f(x))<0 | if (f(a)*f(x))<0 //teste | ||
b=x; | b=x; //novo intervalo se o teste se verifica | ||
else | else | ||
a=x; | a=x; //novo intervalo se o teste nao se verifica | ||
end | end | ||
else | else | ||
break | break //o algoritmo pára se tivermos os criterios < epsilon | ||
end | end | ||
x=(a+b)/2; | x=(a+b)/2; //novo x: xk | ||
k=k+1; | k=k+1; //conta as iteracoes | ||
end | end | ||
toc | toc //tempo de execucao | ||
//---------- Resultados | |||
sprintf('x = %f',x) | mode(0) | ||
sprintf('f(x) = %f',f(x)) | sprintf('x = %f',x) //mostre x | ||
sprintf('|b-a| = %f',abs(b-a)) | sprintf('f(x) = %f',f(x)) //mostre y | ||
sprintf('Número de iteracoes ate atingir o resultado: %d',k) | sprintf('|b-a| = %f',abs(b-a)) //mostre o intervalo | ||
sprintf('Número de iteracoes ate atingir o resultado: %d',k) //mostre iteracoes | |||
Edição das 16h12min 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:
Um cálculo como o da integral, por exemplo, seria impossível, porque nenhum computador teria memória suficiente para armazenar infinitos valores.
A solução, então, é discreta e numérica.
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á:
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 compreender "limites" tendendo a zero, ou a infinito. Provavelmente, teria que ser criado um banco de dados de casos mais frequentes.
Ainda, 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,01.
O cálculo matemático total seria:
E teríamos a resposta com um erro relativo percentual de:
Erro % = (aprox - correto)/correto x 100
Erro % = (2,01 - 2)/2 x 100
Erro % = 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:
- 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)
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.
é 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 Scilab (~Matlab) 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
mode(0)
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








