Matemática Computacional
Resumo da matéria [Versão 3.1]
|
[Capítulo 1]
[Capítulo 2]
[Capítulo 3]
[Capítulo 4]
[Capítulo 5]
|
Capítulo I
Representação numérica. Teoria de erros. |
A introdução da notação posicional por influência da obra
de Al-Kharizmi (séc. IX) na Idade Média, permitiu um desenvolvimento
considerável do cálculo na Europa Ocidental. A introdução na noção hindu
de zero, abriu um conceito de representação, omisso nos milénios anteriores.
A facilidade do cálculo nesta nova representação teve como consequência
que a notação cumulativa greco-romana fosse progressivamente
abandonada... ainda que a um ritmo medieval.
A escolha de uma base levantava ainda assim alguns problemas
para a escolástica axiomática medieval.
Por exemplo, a representação de 1/3 = 0.3333… nunca poderia ser exacta
na notação decimal.
E se as fracções (números racionais) têm dízimas periódicas,
números reais como
apresentavam uma sucessão imprevisível de dígitos. A sua
representação decimal estaria sempre limitada a um número finito
de dígitos, e a um consequente erro.
Foi apenas no final do séc. XIX, com G. Cantor , que os números
reais foram definidos como (classes de equivalência de)
sucessões de Cauchy de racionais, em que a sucessão:
x0=1, x1=1.4, x2=1.41,
x3=1.414, x4=1.4142, ... |
é apenas um representante de todas as sucessões de racionais que
convergem para o número real √ 2.
Esta interpretação de Cantor representou um grande avanço conceptual,
permitindo ainda distinguir o infinito numerável do infinito contínuo.
É claro que a escolha da base decimal para a representação numérica é apenas
uma das várias possibilidades.
Já no séc. XVII, Leibniz advogava vantagens
na representação binária − que é correntemente adoptada nos computadores.
De um modo geral podemos utilizar qualquer base natural β > 1, para escrever
um número real.
Por exemplo, em Notação Científica (normalmente β=10),
x = ± (0. a1 a2 ... an ...)β × βt |
os dígitos ak variam entre 0 e β-1, e para haver unicidade de
representação no expoente, a1 não deve ser nulo, sendo o zero
representado à parte. Evitam-se assim várias possibilidades de representação
0.1 × β1 = 0.01 × β2 = 0.001 × β3 = 1 |
escolhendo apenas a primeira.
Note-se ainda que, por convenção em base decimal,
0.999… é identificado com a representação
superior 1.000… (ambas as sucessões convergem para 1).
|
Representação em Ponto Flutuante |
A menos que estivessemos na posse de uma máquina com memória infinita
(... uma teórica máquina de Turing ),
a representação de um número tem que ser
ser finita, pelo que, consequentemente somos obrigados a considerar um número
finito de dígitos na mantissa e uma limitação nos valores dos expoentes admitidos.
|
Definição: Sistema de Ponto Flutuante (também designado Vírgula Flutuante)
O sistema FP(β, n, t-, t+) é o conjunto dos números racionais
FP(β, n, t-, t+) =
{0} ∪
{ ± 0. a1 a2 ... an × βt
: ak∈ {0,..., β-1}, a1≠ 0, t∈ {t-, ..., t+ } } |
|
Observações:
(i) Notar que como a1 ≠ 0, o zero tem que ser
representado à parte (pode ser considerado um bit, normalmente denominado
zero flag, e de forma semelhante há um bit que determina o sinal,
o sign flag).
(ii) Habitualmente usamos β=10, e nos computadores é usada a base β=2
(nesse caso os dígitos ai podem ser apenas 0 ou 1).
Detalhes sobre a implementação nos computadores, podem ser encontrados
no artigo sobre a
Norma IEEE 754-1985 .
(iii) Definição do sistema FP na declaração de variáveis.
Nalgumas linguagens (C, Fortran, Matlab,...) a definição do sistema FP
a utilizar é feita na altura da definição das variáveis. Assim, quando
trabalhamos em precisão simples em C, declaramos as variáveis como
float, o que significa que guardamos 4 bytes para esse número, dos
quais 23 bits são para a mantissa (o que corresponde a 23 dígitos binários,
e aproximadamente a 8 dígitos decimais).
Quando trabalhamos em precisão dupla, declaramos as variáveis como
double, o que significa que guardamos 8 bytes para esse número, dos
quais 53 bits são para a mantissa (o que corresponde a 53 dígitos binários
e aproximadamente a 16 dígitos decimais). Actualmente, como os problemas
de armazenamento em memória foram substancialmente reduzidos, é habitual
considerar a precisão dupla. Mesmo assim, devemos ter em atenção que uma
matriz de dimensão 30 000 ocupará aprox. 7 Gb de memória em precisão dupla
e metade em precisão simples.
Na passagem de números reais para o conjunto FP de números racionais,
fl: R → FP(β, n, t-, t+) ⊂ Q |
ocorrem dois tipos de limitações, que levam a erros:
- Limitações finitas no expoente (erros em que a execução é parada):
- Overflow: Acontece se o valor do expoente t é superior a t+.
- Underflow: Acontece se o valor do expoente t é inferior a t-.
- Limitações finitas na mantissa (erros que iremos estudar):
- Arredondamentos: por truncatura ou arredondamento simétrico.
|
Arredondamento |
Dado um número, representado em notação científica
x = ± 0. a1 a2 ... an an+1 .... × βt |
ao armazená-lo num sistema FP(β,n) somos obrigados a suprimir dígitos da mantissa.
Para efectuar essa conversão podemos considerar dois tipos de arredondamento:
- Arredondamento por Corte (ou Truncatura)
flc(x) = ± 0. a1 a2 ... an × βt |
- Arredondamento Simétrico (base β > 2, β par)
fls(x) = ± 0. a1' a2' ... an' × βt' |
Os dígitos ak' coincidem com ak
e o expoente t' coincide com t, se an+1 < β/2.
Se an+1 > β/2 então os dígitos ai' e o expoente t'
resultam da representação da soma
0. a1 a2 ... an × βt
+ βt − n. |
Observações:
(i) Podemos ainda considerar
fls(x) = flc(x + 1/2 βt − n) |
(ii) Há variações no arredondamento que é normalmente
designado simétrico, já que há razões estatísticas que procuram
distribuir de forma igual os arredondamentos. Para evitar que
todos os casos 5 sejam decididos para cima, opta-se por
decidir nesses casos que a mantissa fique par. Ou seja, nesse
método também designado round-to-even, os valores
11.5 e 12.5 arredondariam ambos para o inteiro 12 por ser par.
Não iremos adoptar essa variante estatística.
|
Definição:
Consideremos x um valor exacto e x~
um valor aproximado de x, definimos:
- Erro : ex( x~ ) = x − x~
- Erro Absoluto : |ex( x~ )| = |x − x~|
- Erro Relativo (se x ≠ 0): é |δx( x~ )| com
- Não havendo ambiguidade sobre qual é a aproximação de x,
escreveremos apenas ex para designar ex( x~ ), e
da mesma forma abreviamos δx para o termo do erro relativo.
- Pode ainda usar-se δx~ se for mais importante
colocar em evidência qual é a aproximação.
|
Como num sistema FP os arredondamentos são inerentes, convém estabelecer
um majorante para o erro relativo de arredondamento |δarr(x)|, em que
δarr(x) = δx(fl(x)) = | x − fl(x) x | |
|
Teorema:
Para qualquer x: fl(x)∈ FP(β, n),
verificam-se as seguintes majorações de erro:
- No caso de arredondamento por corte :
|δarr(x) | < uc = β1-n
No caso de arredondamento simétrico :
|δarr(x) | < us = 1/2 β1-n
Os majorantes u são designados unidades de arredondamento.
|
|
dem:
Apresentamos a demonstração para o caso de
arredondamento por corte.
Consideramos um real x qualquer
x = ± 0.a1 ... an an+1 ... × βt |
Como a1≠ 0 então a1≥ 1 e temos
Por outro lado
|earr| = |x − flc(x)|
= |0.a1 ... an an+1... − 0.a1 ... an| × βt
|
= 0.0 ... 0 an+1... × βt
≤ 0.0 ... 1 0 ... × βt = βt − n |
implica
|δarr| =
|earr|/|x| ≤ βt − n / βt − 1 = β1 − n |
O caso de arredondamento simétrico é semelhante.
Nota: estas estimativas podem ser um pouco melhoradas, mas sem ganho relevante...
|
Observação
É importante notar que num sistema FP nunca há valores arredondados a zero.
Nalgumas máquinas de calcular, ou em sistemas FP mal implementados, é frequente
haver um aviso de overflow, mas não de underflow, podendo arredondar
valores demasiado pequenos a zero.
Isso conduz a resultados caricatos, como exponenciais que se anulam... por exemplo,
exp(-exp(8)) = 0.243… × 10-1294 |
pode dar zero na sua máquina de calcular, sem aviso de "erro de underflow".
- Como apresentar o resultado, usando uma máquina convencional?
Nestes casos é preciso separar o cálculo − o que será necessário efectuar pela
máquina do cálculo que não é representável. Assim, podemos reduzir a potências
de 10, usando logaritmos, e apresentando depois o resultado:
e-exp(8) = 10-exp(8)/log(10) = 10-1294.6136 |
notamos que a operação -exp(8)/log(10) realiza-se sem problemas,
e separando a parte decimal do expoente 10-0.6136=0.2434…
obtemos a mantissa.
Este tipo de erros, pode ainda ser agravado com a continuação
dos cálculos... basta pensar que se o resultado fosse 0 não
poderíamos efectuar o logaritmo que deveria devolver -exp(8).
|
Propagação de Erros em Funções |
Consideramos agora um estudo da propagação de erros por aplicação de
uma função ou de uma operação. De forma genérica, pretende-se saber
se uma função f não altera significativamente a proximidade dos valores
em termos do erro relativo. Aplicando o Teorema de Lagrange,
ef(x) = f(x) − f(x~ ) = f '(ξ) (x-x~) = f '(ξ)ex |
com ξ∈ [ x; x~ ], admitindo que f∈ C1 (nesse intervalo).
Daqui resulta (para x≠ 0, f(x)≠ 0)
δf(x) = ef(x)/f(x) =
| f '(ξ) f(x) | ex = | x f '(ξ) f(x) | δx |
e podemos obter a estimativa para o erro relativo:
|δf(x) | ≤
| |x| maxξ∈ [x,x~] |f '(ξ)| |f(x)| | |δx| . |
Esta estimativa é pouco manejável, e é mais simples considerar uma aproximação com
ξ≈ x, que é uma aproximação de 1ª ordem (ou linear), em termos da
expansão de Taylor.
De facto, ao desprezar o termo o(ex) em
f(x~ ) = f(x) + f '(x)ex + o(ex) |
obtemos ef(x)≈ f '(x)ex, e dividindo por f(x),
reencontramos a aproximação
que nos permite avaliar a propagação do erro por aplicação de uma função.
|
Definição: O valor Pf(x) = x f '(x)/f(x)
é designado número de condição de f em x, tendo-se
|
Se |Pf(x)| for elevado isso significa que há um grande
incremento do erro relativo por aplicação da função, mas se
for reduzido significa que podemos ter uma boa aproximação
relativa de f(x) mesmo com erros consideráveis em x.
|
Exemplos:
- Se f(x)=xp, obtemos Pf(x)=p, e portanto
δx^p ≈ p δx.
Concluímos que para potências grandes, haverá
um incremento significativo do erro relativo inicial.
- Se f(x)=ex, obtemos Pf(x)=x, e portanto
δexp(x) ≈ x δx.
Concluímos que para |x| elevado, haverá um
incremento significativo do erro relativo inicial.
- Se f(x)=x-a, (a ≠ 0, constante) obtemos Pf(x)=x/(x-a),
e portanto δx-a = x/(x-a) δx.
Concluímos que para x ≈ a, haverá um incremento
muito significativo do erro relativo inicial.
Este exemplo mostra que a soma/subtracção pode levar a perturbações significativas no cálculo, devido ao Cancelamento Subtractivo.
- Se f(x)=ax, (a ≠ 0, constante) obtemos Pf(x)=1, e portanto
δax = δx.
Concluímos que neste caso o erro relativo inicial é mantido.
Como contraponto a estes exemplos, vistos agora pelo lado positivo, poderá
haver vantagens... quando avaliamos xp e se p ≈ 0
(extracção de raízes), o erro relativo diminui, o mesmo se passando
para ex ou x-a quando x≈ 0.
Nestes casos, uma aproximação razoável de x poderá dar logo um bom resultado
em f(x).
|
|
Definição: Dizemos que uma função f é mal condicionada
em valores próximos de um ponto z se no limite
|Pf(z)| = ∞.
|
Operações (funções de duas variáveis)
No caso de operações, funções com duas (ou mais) variáveis, temos que considerar
erros nessas novas variáveis. Considerando agora a expansão de Taylor com duas variáveis (∂m representa a derivada parcial
na m-ésima variável):
f(x~, y~) = f(x, y) +
∂1f(x, y)ex + ∂2f(x, y)ey + o(ex, ey) |
obtemos
ef(x, y)≈ ∂1f(x, y)ex + ∂2f(x, y)ey
que é uma aproximação linear desprezando o termo o(ex, ey),
e daqui resulta
δf(x,y)
≈ | x ∂1f(x,y) f(x,y) | δx +
| y ∂2f(x,y) f(x,y) | δy |
De forma semelhante, aparecem números de condição
Pfx(x,y) e Pfy(x,y)
enquanto coeficientes dos termos
δx e δy (respectivamente), tendo-se
δf(x,y)≈ Pfx(x,y)δx + Pfy(x,y)δy |
-
Quando um deste números de condição tender para infinito num valor (x,y)
então diremos que há mau condicionamento de f próximo de (x,y),
tal como designado com uma única variável.
-
De forma semelhante, estas noções são facilmente estendidas para mais variáveis.
Um caso que nos interessa considerar é o caso de operações elementares,
como a soma ou a multiplicação, que podem ser vistas como funções de duas variáveis.
- Para a soma e subtracção obtemos
δx+y = | x x+y | δx + | y x+y | δy ;
δx − y = | x x − y | δx − | y x − y | δy |
notando que se trata de uma igualdade e não apenas de uma aproximação!
Esta fórmula indica imediatamente que haverá problemas na
subtracção de quantidades semelhantes, ou seja, quando x ≈ y,
que é o caso de cancelamento subtractivo, podendo ser responsável
por uma significativa propagação de erros de arredondamento.
- No caso da multiplicação e divisão, a aplicação directa da fórmula dá-nos
δxy ≈ δx + δy
;
δx/y ≈ δx − δy |
Note-se que aqui há apenas uma aproximação, já que a
igualdade levaria a uma expressão não linear
fazendo sentido desprezar o produto δxδy
quando os erros relativos são de pequena dimensão.
|
Propagação de Erros em Algoritmos |
O estudo do condicionamento não depende da maneira como
o cálculo é efectuado, depende apenas da função.
No entanto, ao calcularmos a expressão não é possível fazê-lo num
único cálculo − somos levados a cálculos intermédios,
e à noção de algoritmo.
Algoritmo: Pretendendo calcular o valor de uma função z=f(x), definimos
de forma equivalente um algoritmo como uma composição finita de
cálculos por funções elementares Fk:
z1=F1(x); z2=F2(x, z1);
... zn=Fn(x,...,zn-1);
|
tal que z=zn . |
(genericamente, as variáveis ou as funções podem ser multidimensionais).
Por exemplo, para calcular z=sin(x2)+x2,
podemos considerar o algoritmo
z1=x2; z2 = sin(z1); z3 = z2+z1. |
em que em cada passo é apenas efectuado um cálculo,
e aproveitamos resultados anteriores.
Importa agora definir quais são as funções elementares que iremos considerar.
|
Definição: Num sistema FP(β,n)
dizemos que F é uma função computacional elementar
associada a uma função f, se
F(y) = fl(f(y)), ∀ y∈ D ⊆ FP(β,n) |
onde D é um subconjunto onde a função está definida.
|
Por exemplo, a função computacional F=LOG está associada à função f(x)=log(x),
que está definida para x > 0, devendo considerar-se
D = { x∈ FP(β,n) : x > 0 }. |
A função computacional LOG será considerada elementar se o resultado obtido
para os números admitidos no sistema FP for exacto, a menos de arredondamentos
[é isso que significa F(y) = fl(f(y))].
- Nas linguagens de programação habituais (C, Fortran, etc.) estão definidas as
funções e operações mais simples, verificando a propriedade de serem elementares
para o sistema FP com base β=2, o que em
precisão dupla, normalmente garante um valor exacto, a menos de arredondamento
na 15ª casa decimal. Por exemplo, iremos considerar como elementares:
- as funções: exp, log, sin, cos,
- as operações: + , − , * , / , ^ (soma, subtracção, multiplicação, divisão, potenciação);
- Deve ainda notar-se que o conjunto admíssivel D
deve ainda sofrer uma restrição para evitar erros de Overflow ou Underflow.
Por exemplo, se x=10q então num sistema FP(10,n,-t,t) quando efectuamos a operação elementar x^p haverá um erro quando
xp = 0.1 × 101+qp
tiver um expoente superior ao admitido pelo sistema, por exemplo, para q > 0:
- quando p > (t-1)/q : deverá ocorrer uma mensagem de erro de Overflow,
- quando p < -(t+1)/q : deverá ocorrer uma mensagem de erro de Underflow.
|
Números de condição num algoritmo |
- Números de condição sem erro de arredondamento
A aproximação linear permite estabelecer uma sequência entre os resultados parciais
e o resultado final para o número de condição.
Podemos estabelecer essa relação decompondo o cálculo de uma
função em composições sucessivas, bastando mostrar para uma composição para
concluir o resultado para uma sequência de composições.
Seja z=f(g(x)) que decompomos em z1 = g(x); z2 = f(z1).
Aplicando a fórmula do número de condição em cada passo,
δz2 ≈ | z1 f '(z1) f(z1) | δz1
= | g(x) f '(g(x)) f(g(x)) | δz1
≈ | g(x) f '(g(x)) f(g(x)) | | x g'(x) g(x) | δx |
= | x g'(x)f '(g(x)) f(g(x)) | δx
= Pf ◦ g(x) δx |
e portanto o resultado final é exactamente o número de condição da composição,
o que resumimos na seguinte proposição:
|
Proposição:
Na aproximação linear, sem erros de arredondamento,
a composição dos números de condição em cada passo, é igual ao
número de condição da composição.
|
- Números de condição com erro de arredondamento
Ainda que a função elementar esteja bem implementada, deverá
considerar-se sempre um erro de arredondamento.
Por isso, para efeitos do cálculo do erro relativo num algoritmo,
devemos adicionar uma parte de erro de arredondamento, em cada passo.
Por exemplo, no primeiro passo:
e de forma semelhante nos passos seguintes, usando os cálculos dos números de condição
para as funções elementares, e adicionando um termo
δarrk em cada passo k do algoritmo.
|
Exemplo:
Consideramos a função seno-hiperbólico,
definida a partir da função elementar exp , pelo algoritmo
- z1 = exp (x);
- z2 = 1/z1;
- z3 = z2 − z1;
- z4 = z3/2;
Para o estudo da propagação do erro relativo neste algoritmo, temos em cada passo:
- δz1 ≈ x δx + δarr1;
- δz2 ≈ − δz1 +δarr2;
-
δz3 ≈ z1/(z1-z2)δz1 − z2/(z1-z2)
δz2 +δarr3;
- δz4 ≈ δz3 +δarr4;
as expressões podem ser substituídas, obtendo-se sucessivamente
- δz2 ≈ − (x δx + δarr1) + δarr2;
-
δz3 ≈
ex/(ex-e-x)δz1 − e-x/(ex-e-x)δz2 + δarr3
|
≈ ex/(ex-e-x)(x δx + δarr1)
− e-x/(ex-e-x) (- x δx -δarr1 + δarr2)
+ δarr3
|
= x(ex+e-x)/(ex-e-x)δx+(ex+e-x)/(ex-e-x)
δarr1 − e-x/(ex-e-x)δarr2 + δarr3; |
-
δz4 ≈
x(ex+e-x)/(ex-e-x)δx
+(ex+e-x)/(ex-e-x)δarr1 − e-x/(ex-e-x)δarr2
+δarr3+δarr4; |
A última expressão pode ser escrita na forma genérica
δz4 ≈
Pf(x) δx
+ Q1(x)δarr1
+ Q2(x)δarr2
+ Q3(x)δarr3
+ Q4(x)δarr4 |
reparando que o coeficiente para δx é exactamente
o número de condição Pf(x), enquanto que os restantes coeficientes
Qm, que afectam os termos de erro de arredondamento δarrm
dependem do algoritmo escolhido.
Observação: De facto, podemos simplificar a crescente sequência de cálculos
para obter δz4 considerando desde o início δx=0.
Assim, iremos obter apenas os termos Qk(x) e o termo Pf(x) será
obtido por aplicação directa da fórmula dada.
É um exercício repetir os passos anteriores e verificar que se obtém o mesmo
resultado, de forma mais simples:
δz1 ≈ x δx + δarr1 = δarr1;
δz2 ≈ -δz1 +δarr2 = -δarr1 +δarr2;
δz3 ≈ ( (ex + e-x)δarr1 − e-xδarr2 ) /(ex-e-x) + δarr3;
δz4 ≈ δz3 +δarr4;
e os coeficientes são exactamente os mesmos!
- Note-se que sinh não é considerada mal condicionada
em nenhum ponto x ∈ R, já que mesmo no caso x ≈ 0 obtemos
[Nota: será mal condicionada para valores grandes, |x| ≈ ∞, porque
lim|x|→ ∞ |Pf(x)| = ∞ .]
- Apesar da função ser bem condicionada para x ≈ 0, podemos ver que
limx→ 0 Q1(x) = + ∞;
limx→ 0 Q2(x) = − ∞ |
concluindo-se que os erros de arredondamento afectam o resultado de
forma significativa próximo de zero.
Portanto, para além da questão do mau condicionamento, num algoritmo devemos
considerar uma outra noção − a noção de instabilidade numérica.
|
Definição:
Consideremos um algoritmo que usa m funções elementares
para o cálculo do valor da função z=f(x), num sistema FP(β,n).
A expressão do erro relativo é aproximada linearmente por
δzm ≈ Pf(x) δx
+ Q1(x)δarr1 + ... + Qm(x)δarrm |
Se para um certo w tivermos
limx→ w |Pf(x)| = ∞
ou
limx→ w |Qk(x)|
= ∞
(para algum k) |
dizemos que o algoritmo é numericamente instável para valores
x ≈ w.
-
Apresentamos a definição explicitando o resultado para uma variável,
mas é clara a extensão para algoritmos que dependam de mais variáveis.
No caso de funções de duas variáveis aparecem os dois números de
condição Pf x(x,y) e Pf y(x,y).
|
Observação:
É consequência imediata da definição que mau condicionamento
implica instabilidade numérica.
Assim, se é impossível resolver os problemas de mau condicionamento,
sem mudar o número n no sistema FP(β,n)
(o que pode ser feito em linguagens mais sofisticadas, como o Mathematica),
devemos procurar evitar os problemas de instabilidade numérica, no cálculo de funções
bem condicionadas. Isso pode ser feito procurando algoritmos estáveis, ou pelo menos
evitando introduzir instabilidades numéricas no algoritmo.
|
Exemplos:
- Consideramos um algoritmo para calcular f(x)=(x-1)2+1:
z1 = x-1; z2 = x+1;
z3 = z1z2;
z4 = z3+1; |
onde, feitas as simplificações, resume-se ao cálculo de
f(x)=x2. Esta é claramente uma função bem condicionada, com
No entanto, como no algoritmo não a expressão não foi simplificada,
o estudo de propagação de erros revela
δf(x) ≈ 2δx + (1 − x-2)
(δarr1 + δarr2 + δarr3) + δarr4 |
Quando x → 0 obtemos Q1,2,3(x) = − ∞, assinalando
o problema de instabilidade numérica para x ≈ 0.
De facto podemos verificar que em qualquer sistema FP(10,n)
com arredondamento simétrico,
se x=10-n-1 obtemos z1 = -1; z2 = 1;
e portanto z4 = 0, o que nos dá um erro relativo de 100%, ou seja
|δz4|=1, ainda que o valor de x seja exacto e
δx=0. Como para esse sistema FP sabemos,
por outro lado, que a unidade de arredondamento verifica
|δarr| < u = 0.5 × 101-n, |
temos |δz4| = 1 ≈ (2 × 10n-1) 0.5×101-n .
- Recuperando o exemplo do seno hiperbólico, notamos que
a função não tem problemas de mau condicionamento (se x ∈ R),
mas quando x ≈ 0 o algoritmo apresenta instabilidade numéricas, que se
manifestam nos limites de Q1 e Q2, que tendem para infinito.
Com base na expansão de Taylor, podemos apresentar uma aproximação que contorna
esse problema próximo de zero. Assim,
sinh(x)=(ex − e-x)/2 = (1+x+x2/2+O(x3) − (1 − x+x2/2+O(x3)))/2
= x+O(x3) |
e podemos usar sinh(x) ≈ x, com um erro da ordem O(x3).
Esse erro é desprezável para |x| < 10t
num sistema FP(10,n) quando t < -n/3.
Podemos assim estabelecer o algoritmo para o cálculo de z=sinh(x):
- se t < -n/3 então z=x;
- se t ≥ -n/3 então z=z4 (usando o algoritmo de sinh para z4);
|
Algumas conclusões:
Apesar destes cálculos de propagação não serem realizados frequentemente,
é importante ter presente que:
- (i) a representação numérica, sendo finita, está sujeita a
significativos erros que podem ser propagados nos diversos passos
dos algoritmos programados;
- (ii) estes erros podem levar a resultados distorcidos, mesmo
em casos muito simples, com poucas operações.
|
[Capítulo 1]
[Capítulo 2]
[Capítulo 3]
[Capítulo 4]
[Capítulo 5]
|
C J S Alves (2008, 2009)
|