Diferenciação Numérica - Departamento de Física

Propaganda
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Diferenciação Numérica
Alexandre Rosas
Departamento de Física
Universidade Federal da Paraíba
19 de Março de 2009
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
O problema
Como calcular?
df (x)
f (x + h) − f (x)
= lim
dx
h
h→0
Expansão em série de Taylor
h2 f 00 (x)
...
2
Logo, podemos estimar a derivada como
f (x + h) = f (x) + hf 0 (x) +
fc0 (x) ≈
f (x + h) − f (x)
hf 00 (x)
≈ f 0 (x) +
...
h
2
Erro é de ordem h!
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
O problema
Como calcular?
df (x)
f (x + h) − f (x)
= lim
dx
h
h→0
Expansão em série de Taylor
h2 f 00 (x)
...
2
Logo, podemos estimar a derivada como
f (x + h) = f (x) + hf 0 (x) +
fc0 (x) ≈
f (x + h) − f (x)
hf 00 (x)
≈ f 0 (x) +
...
h
2
Erro é de ordem h!
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
O problema
Como calcular?
df (x)
f (x + h) − f (x)
= lim
dx
h
h→0
Expansão em série de Taylor
h2 f 00 (x)
...
2
Logo, podemos estimar a derivada como
f (x + h) = f (x) + hf 0 (x) +
fc0 (x) ≈
f (x + h) − f (x)
hf 00 (x)
≈ f 0 (x) +
...
h
2
Erro é de ordem h!
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
O problema
Como calcular?
df (x)
f (x + h) − f (x)
= lim
dx
h
h→0
Expansão em série de Taylor
h2 f 00 (x)
...
2
Logo, podemos estimar a derivada como
f (x + h) = f (x) + hf 0 (x) +
fc0 (x) ≈
f (x + h) − f (x)
hf 00 (x)
≈ f 0 (x) +
...
h
2
Erro é de ordem h!
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Derivada numérica – primeira tentativa
f(x-h)
f(x)
f(x+h)
x-2h
x-h
Alexandre Rosas
x
x+h
Diferenciação Numérica
x+2h
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Análise do método
Usando dois pontos, podemos calcular a derivada de duas
formas
f (x + h) − f (x)
f20 (x) =
h
f20 (x) =
f (x) − f (x − h)
h
Em ambos os casos, o erro é de ordem h
Para f (x) = a + bx 2 ,
f20 (x) = 2bx+h
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Análise do método
Usando dois pontos, podemos calcular a derivada de duas
formas
f (x + h) − f (x)
f20 (x) =
h
f20 (x) =
f (x) − f (x − h)
h
Em ambos os casos, o erro é de ordem h
Para f (x) = a + bx 2 ,
f20 (x) = 2bx+h
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Simetrizando
Expandindo em série de Taylor
f±h = f (x ± h) = f (x) ± hf 0 +
h2 f 00 h3 f 000
±
+ O(h4 )
2
6
Subtraindo as expressões
f30 =
fh − f−h h2 f 000
−
2h
6
Erro de ordem h2
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Simetrizando
Expandindo em série de Taylor
f±h = f (x ± h) = f (x) ± hf 0 +
h2 f 00 h3 f 000
±
+ O(h4 )
2
6
Subtraindo as expressões
f30 =
fh − f−h h2 f 000
−
2h
6
Erro de ordem h2
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Simetrizando
Expandindo em série de Taylor
f±h = f (x ± h) = f (x) ± hf 0 +
h2 f 00 h3 f 000
±
+ O(h4 )
2
6
Subtraindo as expressões
f30 =
fh − f−h h2 f 000
−
2h
6
Erro de ordem h2
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Segunda derivada
Definição
f (x + h) − 2f (x) + f (x − h)
d2 f (x)
= lim
2
h→0
dx
h2
Expansão em série de Taylor
f±h = f (x ± h) = f (x) ± hf 0 +
fc00 (x) =
h2 f 00 h3 f 000 h4 f ( 4)
±
+
+ O(h5 )
2
6
24
⇓
f (x + h) − 2f (x) + f (x − h)
+ O(h2 )
h2
Erro é de ordem h2 !
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Segunda derivada
Definição
f (x + h) − 2f (x) + f (x − h)
d2 f (x)
= lim
2
h→0
dx
h2
Expansão em série de Taylor
f±h = f (x ± h) = f (x) ± hf 0 +
fc00 (x) =
h2 f 00 h3 f 000 h4 f ( 4)
±
+
+ O(h5 )
2
6
24
⇓
f (x + h) − 2f (x) + f (x − h)
+ O(h2 )
h2
Erro é de ordem h2 !
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Segunda derivada
Definição
f (x + h) − 2f (x) + f (x − h)
d2 f (x)
= lim
2
h→0
dx
h2
Expansão em série de Taylor
f±h = f (x ± h) = f (x) ± hf 0 +
fc00 (x) =
h2 f 00 h3 f 000 h4 f ( 4)
±
+
+ O(h5 )
2
6
24
⇓
f (x + h) − 2f (x) + f (x − h)
+ O(h2 )
h2
Erro é de ordem h2 !
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Segunda derivada
Definição
f (x + h) − 2f (x) + f (x − h)
d2 f (x)
= lim
2
h→0
dx
h2
Expansão em série de Taylor
f±h = f (x ± h) = f (x) ± hf 0 +
fc00 (x) =
h2 f 00 h3 f 000 h4 f ( 4)
±
+
+ O(h5 )
2
6
24
⇓
f (x + h) − 2f (x) + f (x − h)
+ O(h2 )
h2
Erro é de ordem h2 !
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Cabeçalho
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
bibliotecas
void initialize (double *, double *, int *);
void second_derivative (int, double,
double, double *, double *);
void output (double *, double *, double, int);
double funcao(double);
protótipo das funções
main()
{
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Cabeçalho
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
bibliotecas
void initialize (double *, double *, int *);
void second_derivative (int, double,
double, double *, double *);
void output (double *, double *, double, int);
double funcao(double);
protótipo das funções
main()
{
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
main()
main()
inicialização
{
int number_of_steps;
double x, initial_step;
double *h_step, *computed_derivative;
def. variáveis
initialize(&initial_step, &x, &number_of_steps);
h_step=malloc(number_of_steps*sizeof(double));
computed_derivative=malloc(number_of_steps*sizeof(double));
second_derivative(number_of_steps, x, initial_step,
h_step, computed_derivative);
output(h_step, computed_derivative, x, number_of_steps);
free(h_step);
free(computed_derivative);
exit(0);
alocação de memória
Alexandre Rosas
liberação de memória
d2 ex
dx 2
saída de dados
cálculo de
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
main()
main()
inicialização
{
int number_of_steps;
double x, initial_step;
double *h_step, *computed_derivative;
def. variáveis
initialize(&initial_step, &x, &number_of_steps);
h_step=malloc(number_of_steps*sizeof(double));
computed_derivative=malloc(number_of_steps*sizeof(double));
second_derivative(number_of_steps, x, initial_step,
h_step, computed_derivative);
output(h_step, computed_derivative, x, number_of_steps);
free(h_step);
free(computed_derivative);
exit(0);
alocação de memória
Alexandre Rosas
liberação de memória
d2 ex
dx 2
saída de dados
cálculo de
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
main()
main()
inicialização
{
int number_of_steps;
double x, initial_step;
double *h_step, *computed_derivative;
def. variáveis
initialize(&initial_step, &x, &number_of_steps);
h_step=malloc(number_of_steps*sizeof(double));
computed_derivative=malloc(number_of_steps*sizeof(double));
second_derivative(number_of_steps, x, initial_step,
h_step, computed_derivative);
output(h_step, computed_derivative, x, number_of_steps);
free(h_step);
free(computed_derivative);
exit(0);
alocação de memória
Alexandre Rosas
liberação de memória
d2 ex
dx 2
saída de dados
cálculo de
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
main()
main()
inicialização
{
int number_of_steps;
double x, initial_step;
double *h_step, *computed_derivative;
def. variáveis
initialize(&initial_step, &x, &number_of_steps);
h_step=malloc(number_of_steps*sizeof(double));
computed_derivative=malloc(number_of_steps*sizeof(double));
second_derivative(number_of_steps, x, initial_step,
h_step, computed_derivative);
output(h_step, computed_derivative, x, number_of_steps);
free(h_step);
free(computed_derivative);
exit(0);
alocação de memória
Alexandre Rosas
liberação de memória
d2 ex
dx 2
saída de dados
cálculo de
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
main()
main()
inicialização
{
int number_of_steps;
double x, initial_step;
double *h_step, *computed_derivative;
def. variáveis
initialize(&initial_step, &x, &number_of_steps);
h_step=malloc(number_of_steps*sizeof(double));
computed_derivative=malloc(number_of_steps*sizeof(double));
second_derivative(number_of_steps, x, initial_step,
h_step, computed_derivative);
output(h_step, computed_derivative, x, number_of_steps);
free(h_step);
free(computed_derivative);
exit(0);
alocação de memória
Alexandre Rosas
liberação de memória
d2 ex
dx 2
saída de dados
cálculo de
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
main()
main()
inicialização
{
int number_of_steps;
double x, initial_step;
double *h_step, *computed_derivative;
def. variáveis
initialize(&initial_step, &x, &number_of_steps);
h_step=malloc(number_of_steps*sizeof(double));
computed_derivative=malloc(number_of_steps*sizeof(double));
second_derivative(number_of_steps, x, initial_step,
h_step, computed_derivative);
output(h_step, computed_derivative, x, number_of_steps);
free(h_step);
free(computed_derivative);
exit(0);
alocação de memória
Alexandre Rosas
liberação de memória
d2 ex
dx 2
saída de dados
cálculo de
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Inicialização
void initialize(double *initial_step, double *x,
int *number_of_steps)
{
printf("Valor de x: ");
scanf("%lf", x);
printf("Valor inicial de h: ");
scanf("%lf", initial_step);
printf("Número de passos: ");
scanf("%d", number_of_steps);
}
ponteiros endereço de armazenamento
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Cálculo da segunda derivada
void second_derivative(int number_of_steps, double x,
double initial_step, double *h_step, double *computed_derivative)
{
laço dos passos
int counter;
double y, derivative, h;
h = initial_step;
h inicial
for(counter = 0; counter < number_of_steps; counter++)
{
h_step[counter] = h;
armazena h
computed_derivative[counter] = (funcao(x+h)-2.0*funcao(x)
+funcao(x-h))/(h*h);
h *= 0.1;
obtém novo h
}
calcula derivada
}
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Cálculo da segunda derivada
void second_derivative(int number_of_steps, double x,
double initial_step, double *h_step, double *computed_derivative)
{
laço dos passos
int counter;
double y, derivative, h;
h = initial_step;
h inicial
for(counter = 0; counter < number_of_steps; counter++)
{
h_step[counter] = h;
armazena h
computed_derivative[counter] = (funcao(x+h)-2.0*funcao(x)
+funcao(x-h))/(h*h);
h *= 0.1;
obtém novo h
}
calcula derivada
}
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Cálculo da segunda derivada
void second_derivative(int number_of_steps, double x,
double initial_step, double *h_step, double *computed_derivative)
{
laço dos passos
int counter;
double y, derivative, h;
h = initial_step;
h inicial
for(counter = 0; counter < number_of_steps; counter++)
{
h_step[counter] = h;
armazena h
computed_derivative[counter] = (funcao(x+h)-2.0*funcao(x)
+funcao(x-h))/(h*h);
h *= 0.1;
obtém novo h
}
calcula derivada
}
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Cálculo da segunda derivada
void second_derivative(int number_of_steps, double x,
double initial_step, double *h_step, double *computed_derivative)
{
laço dos passos
int counter;
double y, derivative, h;
h = initial_step;
h inicial
for(counter = 0; counter < number_of_steps; counter++)
{
h_step[counter] = h;
armazena h
computed_derivative[counter] = (funcao(x+h)-2.0*funcao(x)
+funcao(x-h))/(h*h);
h *= 0.1;
obtém novo h
}
calcula derivada
}
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Cálculo da segunda derivada
void second_derivative(int number_of_steps, double x,
double initial_step, double *h_step, double *computed_derivative)
{
laço dos passos
int counter;
double y, derivative, h;
h = initial_step;
h inicial
for(counter = 0; counter < number_of_steps; counter++)
{
h_step[counter] = h;
armazena h
computed_derivative[counter] = (funcao(x+h)-2.0*funcao(x)
+funcao(x-h))/(h*h);
h *= 0.1;
obtém novo h
}
calcula derivada
}
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Saída de dados
void output(double *h_step, double *computed_derivative,
double x, int number_of_steps)
{
Escrevendo resultado
int counter;
FILE *output;
output=fopen("saida.dat", "a")
Abrindo arquivo
for(counter = 0; counter < number_of_steps; counter++)
{
fprintf(output, "%f %f\n", h_step[counter],
computed_derivative[counter]);
}
fclose(output);
Fechando arquivo
}
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Saída de dados
void output(double *h_step, double *computed_derivative,
double x, int number_of_steps)
{
Escrevendo resultado
int counter;
FILE *output;
output=fopen("saida.dat", "a")
Abrindo arquivo
for(counter = 0; counter < number_of_steps; counter++)
{
fprintf(output, "%f %f\n", h_step[counter],
computed_derivative[counter]);
}
fclose(output);
Fechando arquivo
}
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Saída de dados
void output(double *h_step, double *computed_derivative,
double x, int number_of_steps)
{
Escrevendo resultado
int counter;
FILE *output;
output=fopen("saida.dat", "a")
Abrindo arquivo
for(counter = 0; counter < number_of_steps; counter++)
{
fprintf(output, "%f %f\n", h_step[counter],
computed_derivative[counter]);
}
fclose(output);
Fechando arquivo
}
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Função
double funcao(double x)
{
return exp(x);
}
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Erro da aproximação e erro numérico
Matematicamente, diminuir h ⇒ diminuir erro
Computacionalmente, diminuir h ⇒ aumentar erro de
arredondamento
fc00 (x) =
Pois o cálculo de
próximos!
M
f (x + h) − 2f (x) + f (x − h)
≤ 2
2
h
h
d2 f
dx 2
envolve diferença de números
Erro (definição)
00
00
fcomp − fexact
= log10 00
fexact
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Erro da aproximação e erro numérico
Matematicamente, diminuir h ⇒ diminuir erro
Computacionalmente, diminuir h ⇒ aumentar erro de
arredondamento
fc00 (x) =
Pois o cálculo de
próximos!
M
f (x + h) − 2f (x) + f (x − h)
≤ 2
2
h
h
d2 f
dx 2
envolve diferença de números
Erro (definição)
00
00
fcomp − fexact
= log10 00
fexact
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Erro da aproximação e erro numérico
Matematicamente, diminuir h ⇒ diminuir erro
Computacionalmente, diminuir h ⇒ aumentar erro de
arredondamento
fc00 (x) =
Pois o cálculo de
próximos!
M
f (x + h) − 2f (x) + f (x − h)
≤ 2
2
h
h
d2 f
dx 2
envolve diferença de números
Erro (definição)
00
00
fcomp − fexact
= log10 00
fexact
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Erro da aproximação e erro numérico
Matematicamente, diminuir h ⇒ diminuir erro
Computacionalmente, diminuir h ⇒ aumentar erro de
arredondamento
fc00 (x) =
Pois o cálculo de
próximos!
M
f (x + h) − 2f (x) + f (x − h)
≤ 2
2
h
h
d2 f
dx 2
envolve diferença de números
Erro (definição)
00
00
fcomp − fexact
= log10 00
fexact
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Erro da aproximação e erro numérico
-1
x=0
x=1
x=2
x=3
x=4
x=5
-2
-3
ε
-4
-5
-6
arredond
-7
aprox ∼ h2
-8
-9
-7
-6
-5
-4
log10(h)
Alexandre Rosas
-3
-2
Diferenciação Numérica
-1
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Erro da aproximação e erro numérico
-1
x=0
x=1
x=2
x=3
x=4
x=5
-2
-3
ε
-4
-5
-6
arredond
-7
aprox ∼ h2
-8
-9
-7
-6
-5
-4
log10(h)
Alexandre Rosas
-3
-2
Diferenciação Numérica
-1
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Método
Objetivo: melhorar a precisão
Idéia básica: combinar o cálculo da derivada para
diferentes valores de h e extrapolar para h = 0
Exemplo
Sendo D1 (h) → 1a ou 2a derivada , temos que:
D1 (h) = D0 + a1 h2 + O(h4 )
Analogamente
D1 (2h) = D0 + 4a1 h2 + O(h4 )
Portanto,
D2 (h) =
4D1 (h) − D1 (2h)
= D0 + O(h4 )
3
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Método
Objetivo: melhorar a precisão
Idéia básica: combinar o cálculo da derivada para
diferentes valores de h e extrapolar para h = 0
Exemplo
Sendo D1 (h) → 1a ou 2a derivada , temos que:
D1 (h) = D0 + a1 h2 + O(h4 )
Analogamente
D1 (2h) = D0 + 4a1 h2 + O(h4 )
Portanto,
D2 (h) =
4D1 (h) − D1 (2h)
= D0 + O(h4 )
3
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Método
Objetivo: melhorar a precisão
Idéia básica: combinar o cálculo da derivada para
diferentes valores de h e extrapolar para h = 0
Exemplo
Sendo D1 (h) → 1a ou 2a derivada calculada usando os
pontos x − h, x, x + h , temos que:
D1 (h) = D0 + a1 h2 + O(h4 )
Analogamente
D1 (2h) = D0 + 4a1 h2 + O(h4 )
Portanto,
D2 (h) =
4D1 (h) − D1 (2h)
= D0 + O(h4 )
3
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Método
Objetivo: melhorar a precisão
Idéia básica: combinar o cálculo da derivada para
diferentes valores de h e extrapolar para h = 0
Exemplo
Sendo D1 (h) → 1a ou 2a derivada , temos que:
D1 (h) = D0 + a1 h2 + O(h4 )
onde D0 é o resultado exato. Analogamente
D1 (2h) = D0 + 4a1 h2 + O(h4 )
Portanto,
D2 (h) =
4D1 (h) − D1 (2h)
= D0 + O(h4 )
3
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Método
Objetivo: melhorar a precisão
Idéia básica: combinar o cálculo da derivada para
diferentes valores de h e extrapolar para h = 0
Exemplo
Sendo D1 (h) → 1a ou 2a derivada , temos que:
D1 (h) = D0 + a1 h2 + O(h4 )
Analogamente
D1 (2h) = D0 + 4a1 h2 + O(h4 )
Portanto,
D2 (h) =
4D1 (h) − D1 (2h)
= D0 + O(h4 )
3
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Método
Objetivo: melhorar a precisão
Idéia básica: combinar o cálculo da derivada para
diferentes valores de h e extrapolar para h = 0
Exemplo
Sendo D1 (h) → 1a ou 2a derivada , temos que:
D1 (h) = D0 + a1 h2 + O(h4 )
Analogamente
D1 (2h) = D0 + 4a1 h2 + O(h4 )
Portanto,
D2 (h) =
4D1 (h) − D1 (2h)
= D0 + O(h4 )
3
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Método
Recursivamente
Escrevendo,
D2 (h) = D(0) + a2 h4 + O(h6 )
D2 (2h) = D(0) + 24 a2 h4 + O(h6 )
Temos
D3 (h) =
24 D2 (h) − D2 (2h)
= D0 + O(h6 )
4
2 −1
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Método
Recursivamente
Escrevendo,
Dn (h) = D(0) + an h2n + O(h2(n+1) )
Dn (2h) = D(0) + 22n an h2n + O(h2(n+1) )
Temos
Dn+1 (h) =
22n Dn (h) − Dn (2h)
= D0 + O(h2(n+1) )
22n − 1
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Implementação
O que precisamos calcular?
Dn−2 (8h)
Dn−1 (4h)
Dn−2 (4h)
Dn (2h)
Dn−1 (2h)
Dn+1 (h)
Dn−2 (2h)
Dn (h)
Dn−1 (h)
Dn−2 (h)
D1 (h), D1 (2h), D1 (22 h), . . . , D1 (2n h)
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Implementação
O que precisamos calcular?
Dn−2 (8h)
Dn−1 (4h)
Dn−2 (4h)
Dn (2h)
Dn−1 (2h)
Dn+1 (h)
Dn−2 (2h)
Dn (h)
Dn−1 (h)
Dn−2 (h)
D1 (h), D1 (2h), D1 (22 h), . . . , D1 (2n h)
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Implementação
Alocando memória para D
D[n][k] ≡ Dn (2k h)
double **D;
D=(double **)malloc(number_of_steps*sizeof(double));
for(k=0; k<number_of_steps; k++)
D[k]=(double *)malloc((number_of_steps-k)*sizeof(double))
for(k=0; k<number_of_steps; k++)
{
h=(1«k)*initial_step;
D[0][k] = (f(x+h)+f(x-h)-2.0*f(x))/(h*h);
}
f (x+h)−2∗f (x)+f (x−h)
Dn (2k h) =
h2
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Implementação
Alocando memória para D
D[n][k] ≡ Dn (2k h)
double **D;
D=(double **)malloc(number_of_steps*sizeof(double));
for(k=0; k<number_of_steps; k++)
D[k]=(double *)malloc((number_of_steps-k)*sizeof(double))
for(k=0; k<number_of_steps; k++)
Inicializando Dn (2k h)
{
h=(1«k)*initial_step;
D[0][k] = (f(x+h)+f(x-h)-2.0*f(x))/(h*h);
}
f (x+h)−2∗f (x)+f (x−h)
Dn (2k h) =
h2
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Implementação
Alocando memória para D
D[n][k] ≡ Dn (2k h)
double **D;
D=(double **)malloc(number_of_steps*sizeof(double));
for(k=0; k<number_of_steps; k++)
D[k]=(double *)malloc((number_of_steps-k)*sizeof(double))
for(k=0; k<number_of_steps; k++)
Inicializando Dn (2k h)
{
h=(1«k)*initial_step;
h ← 2k h
D[0][k] = (f(x+h)+f(x-h)-2.0*f(x))/(h*h);
}
f (x+h)−2∗f (x)+f (x−h)
Dn (2k h) =
h2
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Implementação
Alocando memória para D
D[n][k] ≡ Dn (2k h)
double **D;
D=(double **)malloc(number_of_steps*sizeof(double));
for(k=0; k<number_of_steps; k++)
D[k]=(double *)malloc((number_of_steps-k)*sizeof(double))
for(k=0; k<number_of_steps; k++)
Inicializando Dn (2k h)
{
h=(1«k)*initial_step;
D[0][k] = (f(x+h)+f(x-h)-2.0*f(x))/(h*h);
}
f (x+h)−2∗f (x)+f (x−h)
Dn (2k h) =
h2
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Resultado
x
n=1
n=2
n=3
˛ 00
˛
˛ f −f 00 ˛
log10 ˛˛ compf 00 exact ˛˛
0.000000
1.000000
2.000000
3.000000
4.000000
5.000000
1.00005208
2.71842341
7.38944095
20.08658307
54.60099375
148.42088912
1.00000000
2.71828182
7.38905607
20.08553684
54.59814980
148.41315846
1.00000000
2.71828183
7.38905610
20.08553692
54.59815003
148.41315910
-11.92715861
-11.91519296
-12.16780976
-11.99190075
-11.66292327
-12.17189689
exact
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Resultado
x
n=1
n=2
n=3
˛ 00
˛
˛ f −f 00 ˛
log10 ˛˛ compf 00 exact ˛˛
0.000000
1.000000
2.000000
3.000000
4.000000
5.000000
1.00005208
2.71842341
7.38944095
20.08658307
54.60099375
148.42088912
1.00000000
2.71828182
7.38905607
20.08553684
54.59814980
148.41315846
1.00000000
2.71828183
7.38905610
20.08553692
54.59815003
148.41315910
-11.92715861
-11.91519296
-12.16780976
-11.99190075
-11.66292327
-12.17189689
exact
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Alocação dinâmica de memória
Processo de solicitar e utilizar memória durante execução
de um programa
Útil quando não se sabe tamanho de um vetor na hora de
compilação
Função para alocação de memória:
void malloc (tamanho da memória em bytes)
ponteiro_int = (int *) malloc (N * sizeof(int))
Função para liberar memória: void free(ponteiro)
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Alocação dinâmica de memória
Processo de solicitar e utilizar memória durante execução
de um programa
Útil quando não se sabe tamanho de um vetor na hora de
compilação
Função para alocação de memória:
void malloc (tamanho da memória em bytes)
ponteiro_int = (int *) malloc (N * sizeof(int))
Função para liberar memória: void free(ponteiro)
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Alocação dinâmica de memória
Processo de solicitar e utilizar memória durante execução
de um programa
Útil quando não se sabe tamanho de um vetor na hora de
compilação
Função para alocação de memória:
void malloc (tamanho da memória em bytes)
ponteiro_int = (int *) malloc (N * sizeof(int))
Função para liberar memória: void free(ponteiro)
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Alocação dinâmica de memória
Processo de solicitar e utilizar memória durante execução
de um programa
Útil quando não se sabe tamanho de um vetor na hora de
compilação
Função para alocação de memória:
void malloc (tamanho da memória em bytes)
ponteiro_int = (int *) malloc (N * sizeof(int))
casting
Função para liberar memória: void free(ponteiro)
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Alocação dinâmica de memória
Processo de solicitar e utilizar memória durante execução
de um programa
Útil quando não se sabe tamanho de um vetor na hora de
compilação
Função para alocação de memória:
void malloc (tamanho da memória em bytes)
ponteiro_int = (int *) malloc (N * sizeof(int))
operador tamanho de variável ou tipo
Função para liberar memória: void free(ponteiro)
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Alocação dinâmica de memória
Processo de solicitar e utilizar memória durante execução
de um programa
Útil quando não se sabe tamanho de um vetor na hora de
compilação
Função para alocação de memória:
void malloc (tamanho da memória em bytes)
ponteiro_int = (int *) malloc (N * sizeof(int))
tamanho da memória alocada
Função para liberar memória: void free(ponteiro)
Alexandre Rosas
Diferenciação Numérica
Definição
Método direto
Programa segunda derivada
Análise do erro
Extrapolação de Richardson
Alocação dinâmica de memória
Processo de solicitar e utilizar memória durante execução
de um programa
Útil quando não se sabe tamanho de um vetor na hora de
compilação
Função para alocação de memória:
void malloc (tamanho da memória em bytes)
ponteiro_int = (int *) malloc (N * sizeof(int))
Função para liberar memória: void free(ponteiro)
De volta ao programa
Alexandre Rosas
Diferenciação Numérica
Download