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