diferenciação numérica - departamento de físicaarosas/fisicacomputacional/aula02...definição...
TRANSCRIPT
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Diferenciação Numérica
Alexandre Rosas
Departamento de FísicaUniversidade Federal da Paraíba
19 de Março de 2009
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
O problema
Como calcular?
df (x)
dx= lim
h→0
f (x + h)− f (x)
h
Expansão em série de Taylor
f (x + h) = f (x) + hf ′(x) +h2f ′′(x)
2. . .
Logo, podemos estimar a derivada como
f ′c(x) ≈ f (x + h)− f (x)
h≈ f ′(x) +
hf ′′(x)
2. . .
Erro é de ordem h!
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
O problema
Como calcular?
df (x)
dx= lim
h→0
f (x + h)− f (x)
h
Expansão em série de Taylor
f (x + h) = f (x) + hf ′(x) +h2f ′′(x)
2. . .
Logo, podemos estimar a derivada como
f ′c(x) ≈ f (x + h)− f (x)
h≈ f ′(x) +
hf ′′(x)
2. . .
Erro é de ordem h!
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
O problema
Como calcular?
df (x)
dx= lim
h→0
f (x + h)− f (x)
h
Expansão em série de Taylor
f (x + h) = f (x) + hf ′(x) +h2f ′′(x)
2. . .
Logo, podemos estimar a derivada como
f ′c(x) ≈ f (x + h)− f (x)
h≈ f ′(x) +
hf ′′(x)
2. . .
Erro é de ordem h!
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
O problema
Como calcular?
df (x)
dx= lim
h→0
f (x + h)− f (x)
h
Expansão em série de Taylor
f (x + h) = f (x) + hf ′(x) +h2f ′′(x)
2. . .
Logo, podemos estimar a derivada como
f ′c(x) ≈ f (x + h)− f (x)
h≈ f ′(x) +
hf ′′(x)
2. . .
Erro é de ordem h!
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Derivada numérica – primeira tentativa
x-2h x-h x x+h x+2h
f(x-h)
f(x)
f(x+h)
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Análise do método
Usando dois pontos, podemos calcular a derivada de duasformas
f ′2(x) =f (x + h)− f (x)
h
f ′2(x) =f (x)− f (x − h)
h
Em ambos os casos, o erro é de ordem hPara f (x) = a + bx2, f ′2(x) = 2bx+h
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Análise do método
Usando dois pontos, podemos calcular a derivada de duasformas
f ′2(x) =f (x + h)− f (x)
h
f ′2(x) =f (x)− f (x − h)
h
Em ambos os casos, o erro é de ordem hPara f (x) = a + bx2, f ′2(x) = 2bx+h
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Simetrizando
Expandindo em série de Taylor
f±h = f (x ± h) = f (x)± hf ′ +h2f ′′
2± h3f ′′′
6+O(h4)
Subtraindo as expressões
f ′3 =fh − f−h
2h− h2f ′′′
6
Erro de ordem h2
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Simetrizando
Expandindo em série de Taylor
f±h = f (x ± h) = f (x)± hf ′ +h2f ′′
2± h3f ′′′
6+O(h4)
Subtraindo as expressões
f ′3 =fh − f−h
2h− h2f ′′′
6
Erro de ordem h2
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Simetrizando
Expandindo em série de Taylor
f±h = f (x ± h) = f (x)± hf ′ +h2f ′′
2± h3f ′′′
6+O(h4)
Subtraindo as expressões
f ′3 =fh − f−h
2h− h2f ′′′
6
Erro de ordem h2
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Segunda derivada
Definição
d2f (x)
dx2 = limh→0
f (x + h)− 2f (x) + f (x − h)
h2
Expansão em série de Taylor
f±h = f (x ± h) = f (x)± hf ′ +h2f ′′
2± h3f ′′′
6+
h4f (4)
24+O(h5)
⇓
f ′′c (x) =f (x + h)− 2f (x) + f (x − h)
h2 +O(h2)
Erro é de ordem h2!
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Segunda derivada
Definição
d2f (x)
dx2 = limh→0
f (x + h)− 2f (x) + f (x − h)
h2
Expansão em série de Taylor
f±h = f (x ± h) = f (x)± hf ′ +h2f ′′
2± h3f ′′′
6+
h4f (4)
24+O(h5)
⇓
f ′′c (x) =f (x + h)− 2f (x) + f (x − h)
h2 +O(h2)
Erro é de ordem h2!
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Segunda derivada
Definição
d2f (x)
dx2 = limh→0
f (x + h)− 2f (x) + f (x − h)
h2
Expansão em série de Taylor
f±h = f (x ± h) = f (x)± hf ′ +h2f ′′
2± h3f ′′′
6+
h4f (4)
24+O(h5)
⇓
f ′′c (x) =f (x + h)− 2f (x) + f (x − h)
h2 +O(h2)
Erro é de ordem h2!
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Segunda derivada
Definição
d2f (x)
dx2 = limh→0
f (x + h)− 2f (x) + f (x − h)
h2
Expansão em série de Taylor
f±h = f (x ± h) = f (x)± hf ′ +h2f ′′
2± h3f ′′′
6+
h4f (4)
24+O(h5)
⇓
f ′′c (x) =f (x + h)− 2f (x) + f (x − h)
h2 +O(h2)
Erro é de ordem h2!
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Cabeçalho
#include <stdio.h>#include <stdlib.h>#include <math.h>
void initialize (double *, double *, int *);void second_derivative (int, double,double, double *, double *);
void output (double *, double *, double, int);double funcao(double);
main(){
bibliotecas
protótipo das funções
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Cabeçalho
#include <stdio.h>#include <stdlib.h>#include <math.h>
void initialize (double *, double *, int *);void second_derivative (int, double,double, double *, double *);
void output (double *, double *, double, int);double funcao(double);
main(){
bibliotecas
protótipo das funções
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
main()
main(){int number_of_steps;double x, initial_step;double *h_step, *computed_derivative;
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);
def. variáveis
inicialização
alocação de memória
cálculo de d2ex
dx2
saída de dados
liberação de memória
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
main()
main(){int number_of_steps;double x, initial_step;double *h_step, *computed_derivative;
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);
def. variáveis
inicialização
alocação de memória
cálculo de d2ex
dx2
saída de dados
liberação de memória
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
main()
main(){int number_of_steps;double x, initial_step;double *h_step, *computed_derivative;
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);
def. variáveis
inicialização
alocação de memória
cálculo de d2ex
dx2
saída de dados
liberação de memória
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
main()
main(){int number_of_steps;double x, initial_step;double *h_step, *computed_derivative;
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);
def. variáveis
inicialização
alocação de memória
cálculo de d2ex
dx2
saída de dados
liberação de memória
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
main()
main(){int number_of_steps;double x, initial_step;double *h_step, *computed_derivative;
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);
def. variáveis
inicialização
alocação de memória
cálculo de d2ex
dx2
saída de dados
liberação de memória
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
main()
main(){int number_of_steps;double x, initial_step;double *h_step, *computed_derivative;
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);
def. variáveis
inicialização
alocação de memória
cálculo de d2ex
dx2
saída de dados
liberação de memória
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAná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çãoMétodo direto
Programa segunda derivadaAná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)
{int counter;double y, derivative, h;h = initial_step;for(counter = 0; counter < number_of_steps; counter++){
h_step[counter] = h;computed_derivative[counter] = (funcao(x+h)-2.0*funcao(x)
+funcao(x-h))/(h*h);h *= 0.1;
}}
h inicial
laço dos passos
armazena h
calcula derivadaobtém novo h
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAná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)
{int counter;double y, derivative, h;h = initial_step;for(counter = 0; counter < number_of_steps; counter++){
h_step[counter] = h;computed_derivative[counter] = (funcao(x+h)-2.0*funcao(x)
+funcao(x-h))/(h*h);h *= 0.1;
}}
h inicial
laço dos passos
armazena h
calcula derivadaobtém novo h
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAná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)
{int counter;double y, derivative, h;h = initial_step;for(counter = 0; counter < number_of_steps; counter++){
h_step[counter] = h;computed_derivative[counter] = (funcao(x+h)-2.0*funcao(x)
+funcao(x-h))/(h*h);h *= 0.1;
}}
h inicial
laço dos passos
armazena h
calcula derivadaobtém novo h
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAná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)
{int counter;double y, derivative, h;h = initial_step;for(counter = 0; counter < number_of_steps; counter++){
h_step[counter] = h;computed_derivative[counter] = (funcao(x+h)-2.0*funcao(x)
+funcao(x-h))/(h*h);h *= 0.1;
}}
h inicial
laço dos passos
armazena h
calcula derivadaobtém novo h
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAná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)
{int counter;double y, derivative, h;h = initial_step;for(counter = 0; counter < number_of_steps; counter++){
h_step[counter] = h;computed_derivative[counter] = (funcao(x+h)-2.0*funcao(x)
+funcao(x-h))/(h*h);h *= 0.1;
}}
h inicial
laço dos passos
armazena h
calcula derivadaobtém novo h
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAná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)
{int counter;FILE *output;
output=fopen("saida.dat", "a")for(counter = 0; counter < number_of_steps; counter++){
fprintf(output, "%f %f\n", h_step[counter],computed_derivative[counter]);
}fclose(output);
}
Abrindo arquivo
Escrevendo resultado
Fechando arquivo
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAná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)
{int counter;FILE *output;
output=fopen("saida.dat", "a")for(counter = 0; counter < number_of_steps; counter++){
fprintf(output, "%f %f\n", h_step[counter],computed_derivative[counter]);
}fclose(output);
}
Abrindo arquivo
Escrevendo resultado
Fechando arquivo
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAná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)
{int counter;FILE *output;
output=fopen("saida.dat", "a")for(counter = 0; counter < number_of_steps; counter++){
fprintf(output, "%f %f\n", h_step[counter],computed_derivative[counter]);
}fclose(output);
}
Abrindo arquivo
Escrevendo resultado
Fechando arquivo
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Função
double funcao(double x){return exp(x);
}
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Erro da aproximação e erro numérico
Matematicamente, diminuir h ⇒ diminuir erroComputacionalmente, diminuir h ⇒ aumentar erro dearredondamento
f ′′c (x) =f (x + h)− 2f (x) + f (x − h)
h2 ≤ εMh2
Pois o cálculo de d2fdx2 envolve diferença de números
próximos!
Erro (definição)
ε = log10
∣∣∣∣ f ′′comp − f ′′exact
f ′′exact
∣∣∣∣Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Erro da aproximação e erro numérico
Matematicamente, diminuir h ⇒ diminuir erroComputacionalmente, diminuir h ⇒ aumentar erro dearredondamento
f ′′c (x) =f (x + h)− 2f (x) + f (x − h)
h2 ≤ εMh2
Pois o cálculo de d2fdx2 envolve diferença de números
próximos!
Erro (definição)
ε = log10
∣∣∣∣ f ′′comp − f ′′exact
f ′′exact
∣∣∣∣Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Erro da aproximação e erro numérico
Matematicamente, diminuir h ⇒ diminuir erroComputacionalmente, diminuir h ⇒ aumentar erro dearredondamento
f ′′c (x) =f (x + h)− 2f (x) + f (x − h)
h2 ≤ εMh2
Pois o cálculo de d2fdx2 envolve diferença de números
próximos!
Erro (definição)
ε = log10
∣∣∣∣ f ′′comp − f ′′exact
f ′′exact
∣∣∣∣Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Erro da aproximação e erro numérico
Matematicamente, diminuir h ⇒ diminuir erroComputacionalmente, diminuir h ⇒ aumentar erro dearredondamento
f ′′c (x) =f (x + h)− 2f (x) + f (x − h)
h2 ≤ εMh2
Pois o cálculo de d2fdx2 envolve diferença de números
próximos!
Erro (definição)
ε = log10
∣∣∣∣ f ′′comp − f ′′exact
f ′′exact
∣∣∣∣Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Erro da aproximação e erro numérico
-9
-8
-7
-6
-5
-4
-3
-2
-1
-7 -6 -5 -4 -3 -2 -1
ε
log10(h)
x = 0x = 1x = 2x = 3x = 4x = 5
εaprox ∼ h2εarredond
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Erro da aproximação e erro numérico
-9
-8
-7
-6
-5
-4
-3
-2
-1
-7 -6 -5 -4 -3 -2 -1
ε
log10(h)
x = 0x = 1x = 2x = 3x = 4x = 5
εaprox ∼ h2εarredond
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Método
Objetivo: melhorar a precisãoIdéia básica: combinar o cálculo da derivada paradiferentes valores de h e extrapolar para h = 0
Exemplo
Sendo D1(h) → 1a ou 2a derivada , temos que:
D1(h) = D0 + a1h2 +O(h4)
AnalogamenteD1(2h) = D0 + 4a1h2 +O(h4)
Portanto,D2(h) =
4D1(h)− D1(2h)
3= D0 +O(h4)
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Método
Objetivo: melhorar a precisãoIdéia básica: combinar o cálculo da derivada paradiferentes valores de h e extrapolar para h = 0
Exemplo
Sendo D1(h) → 1a ou 2a derivada , temos que:
D1(h) = D0 + a1h2 +O(h4)
AnalogamenteD1(2h) = D0 + 4a1h2 +O(h4)
Portanto,D2(h) =
4D1(h)− D1(2h)
3= D0 +O(h4)
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Método
Objetivo: melhorar a precisãoIdéia básica: combinar o cálculo da derivada paradiferentes valores de h e extrapolar para h = 0
Exemplo
Sendo D1(h) → 1a ou 2a derivada calculada usando ospontos x − h, x , x + h , temos que:
D1(h) = D0 + a1h2 +O(h4)
AnalogamenteD1(2h) = D0 + 4a1h2 +O(h4)
Portanto,D2(h) =
4D1(h)− D1(2h)
3= D0 +O(h4)
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Método
Objetivo: melhorar a precisãoIdéia básica: combinar o cálculo da derivada paradiferentes valores de h e extrapolar para h = 0
Exemplo
Sendo D1(h) → 1a ou 2a derivada , temos que:
D1(h) = D0 + a1h2 +O(h4)
onde D0 é o resultado exato. AnalogamenteD1(2h) = D0 + 4a1h2 +O(h4)
Portanto,D2(h) =
4D1(h)− D1(2h)
3= D0 +O(h4)
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Método
Objetivo: melhorar a precisãoIdéia básica: combinar o cálculo da derivada paradiferentes valores de h e extrapolar para h = 0
Exemplo
Sendo D1(h) → 1a ou 2a derivada , temos que:
D1(h) = D0 + a1h2 +O(h4)
AnalogamenteD1(2h) = D0 + 4a1h2 +O(h4)
Portanto,D2(h) =
4D1(h)− D1(2h)
3= D0 +O(h4)
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Método
Objetivo: melhorar a precisãoIdéia básica: combinar o cálculo da derivada paradiferentes valores de h e extrapolar para h = 0
Exemplo
Sendo D1(h) → 1a ou 2a derivada , temos que:
D1(h) = D0 + a1h2 +O(h4)
AnalogamenteD1(2h) = D0 + 4a1h2 +O(h4)
Portanto,D2(h) =
4D1(h)− D1(2h)
3= D0 +O(h4)
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Método
RecursivamenteEscrevendo,
D2(h) = D(0) + a2h4 +O(h6)
D2(2h) = D(0) + 24a2h4 +O(h6)
Temos
D3(h) =24D2(h)− D2(2h)
24 − 1= D0 +O(h6)
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Método
RecursivamenteEscrevendo,
Dn(h) = D(0) + anh2n +O(h2(n+1))
Dn(2h) = D(0) + 22nanh2n +O(h2(n+1))
Temos
Dn+1(h) =22nDn(h)− Dn(2h)
22n − 1= D0 +O(h2(n+1))
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Implementação
O que precisamos calcular?
Dn+1(h)
Dn(h)
Dn−1(h)
Dn−2(h)
Dn−2(2h)
Dn−1(2h)
Dn(2h)
Dn−1(2h)
Dn−2(2h)
Dn−2(4h)
Dn−1(4h)
Dn−2(4h)
Dn−2(8h)
D1(h), D1(2h), D1(22h), . . . , D1(2nh)Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Implementação
O que precisamos calcular?
Dn+1(h)
Dn(h)
Dn−1(h)
Dn−2(h)
Dn−2(2h)
Dn−1(2h)
Dn(2h)
Dn−1(2h)
Dn−2(2h)
Dn−2(4h)
Dn−1(4h)
Dn−2(4h)
Dn−2(8h)
D1(h), D1(2h), D1(22h), . . . , D1(2nh)Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Implementação
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);
}
Alocando memória para DD[n][k] ≡ Dn(2k h)
Dn(2k h) = f (x+h)−2∗f (x)+f (x−h)
h2
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Implementação
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);
}
Alocando memória para DD[n][k] ≡ Dn(2k h)
Inicializando Dn(2k h)
Dn(2k h) = f (x+h)−2∗f (x)+f (x−h)
h2
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Implementação
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);
}
Alocando memória para DD[n][k] ≡ Dn(2k h)
Inicializando Dn(2k h)
h← 2k h
Dn(2k h) = f (x+h)−2∗f (x)+f (x−h)
h2
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Implementação
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);
}
Alocando memória para DD[n][k] ≡ Dn(2k h)
Inicializando Dn(2k h)
Dn(2k h) = f (x+h)−2∗f (x)+f (x−h)
h2
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Resultado
x n = 1 n = 2 n = 3 log10
˛̨̨̨f ′′comp−f ′′exact
f ′′exact
˛̨̨̨0.000000 1.00005208 1.00000000 1.00000000 -11.927158611.000000 2.71842341 2.71828182 2.71828183 -11.915192962.000000 7.38944095 7.38905607 7.38905610 -12.167809763.000000 20.08658307 20.08553684 20.08553692 -11.991900754.000000 54.60099375 54.59814980 54.59815003 -11.662923275.000000 148.42088912 148.41315846 148.41315910 -12.17189689
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Resultado
x n = 1 n = 2 n = 3 log10
˛̨̨̨f ′′comp−f ′′exact
f ′′exact
˛̨̨̨0.000000 1.00005208 1.00000000 1.00000000 -11.927158611.000000 2.71842341 2.71828182 2.71828183 -11.915192962.000000 7.38944095 7.38905607 7.38905610 -12.167809763.000000 20.08658307 20.08553684 20.08553692 -11.991900754.000000 54.60099375 54.59814980 54.59815003 -11.662923275.000000 148.42088912 148.41315846 148.41315910 -12.17189689
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Alocação dinâmica de memória
Processo de solicitar e utilizar memória durante execuçãode um programaÚtil quando não se sabe tamanho de um vetor na hora decompilaçãoFunçã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çãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Alocação dinâmica de memória
Processo de solicitar e utilizar memória durante execuçãode um programaÚtil quando não se sabe tamanho de um vetor na hora decompilaçãoFunçã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çãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Alocação dinâmica de memória
Processo de solicitar e utilizar memória durante execuçãode um programaÚtil quando não se sabe tamanho de um vetor na hora decompilaçãoFunçã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çãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Alocação dinâmica de memória
Processo de solicitar e utilizar memória durante execuçãode um programaÚtil quando não se sabe tamanho de um vetor na hora decompilaçãoFunção para alocação de memória:void malloc (tamanho da memória em bytes)
ponteiro_int = (int *) malloc (N * sizeof(int))
castingFunção para liberar memória: void free(ponteiro)
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Alocação dinâmica de memória
Processo de solicitar e utilizar memória durante execuçãode um programaÚtil quando não se sabe tamanho de um vetor na hora decompilaçãoFunçã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 tipoFunção para liberar memória: void free(ponteiro)
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Alocação dinâmica de memória
Processo de solicitar e utilizar memória durante execuçãode um programaÚtil quando não se sabe tamanho de um vetor na hora decompilaçãoFunçã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 alocadaFunção para liberar memória: void free(ponteiro)
Alexandre Rosas Diferenciação Numérica
DefiniçãoMétodo direto
Programa segunda derivadaAnálise do erro
Extrapolação de Richardson
Alocação dinâmica de memória
Processo de solicitar e utilizar memória durante execuçãode um programaÚtil quando não se sabe tamanho de um vetor na hora decompilaçãoFunçã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