Conceitos:
“Arredondamento e aritmética de ponto flutuante:
Um número é representado, internamente, num computador ou máquina de calcular através de uma sequência de impulsos elétricos que indicam dois estados: 0 ou 1, ou seja, os números são representados na base binária.
De uma maneira geral, um número x é representado na base β por:
x = d1/β1+d2/β2+d3/β3+...+dt/βt*β^e
onde:
di - são números inteiros contidos no intervalo d i t i 0 ≤ ≤ β −1; =1,2,.., ;
e - representa o expoente de β e assume valores entre I ≤ e ≤ S onde
I, S - são, respectivamente, limite inferior e superior para a variação do expoente;
d1/β1+d2/β2+d3/β3+...+dt/βt*β é a chamada 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 representação, comumente chamado de precisão da máquina.
Um número real x no sistema de aritmética de ponto flutuante pode ser escrito também na forma:
x = 0, d1 d2 d3...dtβ^e
com d1 ≠ 0 , pois é o primeiro algarismo significativo de x.”
[...]
Erro de arredondamento e truncamento
Dar a representação dos números a seguir num sistema de aritmética de ponto flutuante de três dígitos para β = 10, I=-4 e S=4
Quando se utiliza o arredondamento os erros cometidos são menores que no truncamento, no entanto o arredondamento requer um maior tempo de execução e por esta razão o truncamento é mais utilizado.”
QUESTÃO 1.Escrever um programa para calcular a seguinte sucessão:
I0 = (1 / e)*(e - 1),
In+1 = 1 - (n + 1)*In; para n = 0, 1, 2, …
Comparar com o limite exato In --> 0 quando n --> .
Linguagem: Octave.
Código:
>>format long
>>I0 = (1/ exp(1))*(exp(1) - 1)
>>n=0
>>while n<50; In = ( 1 - (n+1) * I0
n=n+1
I0=In
end
Obtivemos os seguintes resultados:
I0
|
0.632120558828558
|
I1
|
0.367879441171442
|
I2
|
0.264241117657115
|
I3
|
0.207276647028654
|
I4
|
0.170893411885384
|
I5
|
0.145532940573080
|
I6
|
0.126802356561520
|
I7
|
0.112383504069363
|
I8
|
0.100931967445092
|
I9
|
0.0916122929941707
|
I10
|
0.0838770700582927
|
I11
|
0.0773522293587803
|
I12
|
0.0717732476946367
|
I13
|
0.0669477799697233
|
I14
|
0.0627310804238732
|
I15
|
0.0590337936419019
|
I16
|
0.0554593017295701
|
I17
|
0.0571918705973076
|
I18
|
-0.0294536707515363
|
I19
|
1.55961974427919
|
I20
|
-30.1923948855838
|
I21
|
635.040292597259
|
I22
|
-13969.8864371397
|
I23
|
321308.388054213
|
I24
|
-7711400.31330112
|
I25
|
192785008.832528
|
I26
|
-5012410228.64573
|
I27
|
135335076174435
|
I28
|
-3789382132883.17
|
I29
|
1.09892081853613e+014
|
I30
|
-3.29676245560839e+015
|
I31
|
1,0219963612386E+017
|
I32
|
-3,27038835596352E+018
|
I33
|
1.07922815746796e+020
|
I34
|
-3.66937573539107e+021
|
I35
|
1.28428150738687e+023
|
I36
|
-4.62341342659275e+024
|
I37
|
1.71066296783932e+026
|
I38
|
-6.50051927778940e+027
|
I39
|
2.53520251833787e+029
|
I40
|
-1.01408100733515e+031
|
I41
|
4.15773213007410e+032
|
I42
|
-1.74624749463112e+034
|
I43
|
7.50886422691383e+035
|
I44
|
-3.30390025984208e+037
|
I45
|
1.48675511692894e+039
|
I46
|
-6.83907353787311e+040
|
I47
|
3.21436456280036e+042
|
I48
|
-1.54289499014417e+044
|
I49
|
7.56018545170645e+045
|
I50
|
-3.78009272585323e+047
|
Discussão:
O comportamento esperado dessa função é a tendencia a zero quando n tende ao infinito, entretanto, à partir do ponto em que n=16, nota-se uma mudança em seu comportamento e a presença de oscilações entre valores positivos e negativos. Acredita-se que essa mudança seja decorrente da propagação de erros desde o primeiro passo, acentuada através das seguidas multiplicações do problema.
QUESTÃO 2. Considerar o seguinte algoritmo para calcular . Gerar n pares (xk; yk) de números aleatórios no intervalo [0; 1] e calcular em seguida o numero m dos pontos que se encontrar no primeiro quadrante do círculo unitário. Naturalmente, e o limite da sucessão n = 4m / n. Escrever um programa para calcular esta sucessão e observar a evolução do erro para valores crescentes de n. Faca o gráfico desta evolução.
Liguagem: Octave
>>function mypi = montecarlo(n)
>>x = rand (n, 1);
>>y = rand (n, 1);
>>z = x.^2 + y.^2;
>>v = (z <= 1);
m = sum(v);
>>mypi = 4 * m / n;
Gráfico: Scilab
x = [1 1e+1 1e+2 1e+3 1e+4 1e+5 1e+6 1e+7 1e+8];
y = [0.2732395 0.1459156 -0.0196056 0.0313240 0.0016575 0.0021923 -0.0002778 -0.0000604 0.0000326 ];
plot(x,y);
Gráfico: Excel
n
|
m
|
1
|
0,2732395
|
1*exp(1)
|
0,1459156
|
1*exp(2)
|
-0,0196056
|
1*exp(3)
|
0,031324
|
1*exp(4)
|
0,0016575
|
1*exp(5)
|
0,0021923
|
1*exp(6)
|
-0,0002778
|
1*exp(7)
|
-0,0000604
|
1*exp(8)
|
0,0000326
|
Discussão:
“O comando rand gera uma sucessão de números pseudo aleatórios. A instrução v = (z <=1) é uma versão abreviada do seguinte procedimento: verifica-se o z(k) <= 1 para cada componente do vetor z; se a desigualdade for satisfeita para a k-ésima componente de z, (isto é se o ponto (x(k), y(k)) pertence ao interios o círculo unitário) dá se o valor 1 a v(k), caso contrario dá se o valor 0. O comando sum(v) calcula a soma de todos os componentes de v, quer dizer, o número d pontos que se encontram no interior do círculo unitário.
Executa-se programa mypi = pimontecarlo(n) para diferentes valores de n. Quanto maior for n, tanto melhor será a aproximação mypi de .”
Fonte: QUARTERONI, A. , Saleri, F. Calculo Cientifico com MATLAB e Octave.
Percebe-se que houve significativo aumento de tempo para a execução do algorítimo, dadas as limitações de processamento da máquina, quando o usuário da entrada com valores grande no programa.
QUESTÃO 3. Sendo a soma da série
=m = 016^-m (4 / (8m+1) - 2 / (8m + 4) + 1 / (8m + 5) + 1 / (8m + 6))
podemos calcular uma aproximação de somando os n primeiros termos, para n suficientemente grande. Escreva um código para uma função para calcular as somas parciais desta serie. Para que valores de n e que se obtêm uma aproximação de com a mesma precisão da variável ?
Liguagem: Java
package javaapplication1;
import java.util.Scanner;
public class JavaApplication1 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double pi = Math.PI;
System.out.println ("Valor de pi = " + pi + ".");
System.out.println("Insira um valor de n:");
int n = sc.nextInt();
double x = 0;
double m;
for ( m= 0; m <= n; m++)
{
x = x + ((Math.pow(16, -m))*((4/(8*m+1))-(2/(8*m+4))-(1/(8*m+5))-
(1/(8*m+6))));
}
System.out.println("O valor de pi utilizando n é: "+x+".\n");
double Erro;
Erro = pi - x;
System.out.println("A diferença entre pi e pi calculado é:"+Erro);
}
}
Para n = 0
Pi calculado = 3.1333333333333333.
Diferença entre pi e pi calculado é: 0.008259320256459812
Para n = 1
Pi calculado = 3.1414224664224664.
Diferença entre pi e pi calculado é: 1.7018716732675188E-4
Para n = 5
Pi calculado = 3.141592653228088.
Diferença entre pi e pi calculado é: 3.617053323523578E-10
Para n = 10
Pi calculado = 3.141592653589793.
Diferença entre pi e pi calculado é: 0.0
m
|
Diferença pi e pi calculado
|
0
|
0.008259320256459812
|
1
|
1,70E-05
|
2
|
5,26E-06
|
3
|
1,96E-07
|
4
|
8,13E-09
|
5
|
3,62E-10
|
6
|
1,69E-11
|
7
|
8,20E-13
|
8
|
4,09E-14
|
9
|
1,78E-15
|
10
|
0.0
|
Tabela com valores de “m” e dos Erros.
Discussão:
Para calcular o valor de pi sem apresentar uma grande diferença do valor de pi real da máquina, utilizando a série apresentada, foi necessário que o valor de “m” fosse igual a 10. Qualquer valor acima deste a diferença é desprezível, visto que o limite de dígitos ultrapassa a quantidade suportada pela máquina.
______________________
Resolução elaborada pelo Grupo 4, composto pelos alunos Caio Rodrigues da Silva, Carolina Braga do Espirito Santo, Erick Oshiro, Felipe Massao Yamada, Felipe de Milano Friedmann e Ronaldo Gonçalves Dias, devidamente matrículados na disciplina de Cálculo Numérico, turma B, matutino/Santo André, ministrada pela Prof. Dra. Juliana Militão da Silva Berbert.