terça-feira, 1 de março de 2016

Lista 1B - Exercícios, resoluções e discussões.

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+...+dtt*β^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+...+dtt*β é 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);
f2.png

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.