Diferenciação Numérica - Departamento de Físicaarosas/FisicaComputacional/aula02...Definição Método direto Programa segunda derivada Análise do erro Extrapolação de Richardson

Post on 04-Jul-2020

0 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

top related