Você está na página 1de 8

Métodos Numéricos para Engenharia II

Trabalho 1

Rafael Terrin Gaitan N° USP 6812330


Objetivos
Este trabalho tem como objetivo elaborar um programa para calcular a
diferença dividida de uma função ʄ sobre um conjunto de dados, ou seja,
implementar a fórmula:
k
f ( xi )
f [ x 0 , x 1 , … , x k ] =∑
i=0 ( x i−x 0 ) ( x i−x 1 ) … ( xi −xi −1 ) ( x i−x i+1 ) …(x i−x k )
E a partir dela obter o polinômio interpolador de Newton, com todos os
coeficientes.
Neste programa, o usuário informa o número de pontos (n) e em seguida
informa os pontos (xi , f(xi) ). Então o programa imprime os pontos digitados e
calcula a diferença dividida da função e informa os coeficientes do polinômio.
Programação escolhida
O tipo de programação escolhida foi C, por ser muito popular e amplamente
utilizada na elaboração de programas no mundo inteiro. Permite total controle e
eficácia. Além disso, é a primeira linguagem de programação ensinada na
maioria dos cursos de graduação da USP São Carlos. O compilador escolhido
foi o DEV-C, pois é gratuito e de simples manuseamento.
Procedimentos
Os valores de xi i=0,1,...,k, serão armazenados no vetor float “x[50]”, assim
como os valores de f(x i) i=0,1,...,k serão armazenados no vetor float “fx[50]”. O
total de pontos será armazenado na variável inteira “n”.
Primeiramente, pedimos ao usuário para informar “n”:
Printf(“Digite n:”);
Scanf(“%d”,&n);
O total de pontos foi armazenado na variável n.
Agora o programa pede que o usuário informe x i e f(xi) i=0,1,...,n :
for(i=0;i<=n;i++){
printf("\nDigite X%d:",i);
scanf("%f",&x[i]);
printf("\nDigite Fx%d:",i);
scanf("%f",&fx[i]);
Modo como o usuário vê na tela: Digite x0:

Digite Fx0:

Digite x1:
Digite Fx1: ...

os valores de xi foram armazenados no vetor x[50] e os valores de f(x i) foram


armazenados no vetor fx[50].

Agora o programa imprime os valores escolhidos pelo usuário na tela:

printf("O valor de n escolhido foi:%d\nOs valores escolhidos foram:\n",n);

for(i=0;i<=n;i++){

printf("\nX%d: %.3f --- Fx%d: %.3f",i,x[i],i,fx[i]);

Modo como o usuário vê na tela:

O valor de n escolhido foi:

X0= --- Fx0=

X1= --- Fx1=

X2= --- Fx2= ...

É preciso neste momento implementar a fórmula das diferenças divididas.


Foram usados 2 contadores e as variáveis “somatório”, que armazena o valor
total de cada soma, e “denominador”, que calcula o valor do denominador da
fórmula.

somatorio=0;

for(j=0;j<=n;j++){

denominador = 1;

for(z=0;z<=n;z++){ (essa parte calcula o denominador da


formula)

if(z!=j){

denominador = denominador * (x[j]-x[z]);

somatorio = somatorio + fx[j]/denominador; (essa parte calcula somatória)

}
Porém, essa parte calcula o valor total de cada somatória, e como precisamos
dos valores intermediários, que são os coeficientes do polinômio, foi necessário
adaptar a função. Agora, a função calcula a somatória entre f[x 0,x1], depois
entre f[x0,x2]. Depois f[x0,x3] e assim por diante, e cada valor desse nos dá um
coeficiente.

Exemplo: P2(x) = f [x0] + (x − x0) f [x0, x1] + (x − x0) (x − x1) f [x0, x1, x2]
Eis a função:

for(y=0;y<=n;y++){

somatorio=0;

for(j=0;j<=y;j++){

denominador = 1;

for(z=0;z<=y;z++){

if(z!=j){

denominador = denominador * (x[j]-x[z]);

somatorio = somatorio + fx[j]/denominador;

coef[y]=somatorio;

Para calcular como queríamos, foi colocado um for sobre a função das
diferenças divididas, e cada coeficiente é armazenado no vetor coef[25].

Então o polinômio é dado por :

Pn(x) = f (x0) + (x − x0) f [x0, x1] + (x − x0) (x − x1) f [x0, x1, x2] + . . . + (x −
x0) (x − x1) . . . (x − xn−1) f [x0, x1, . . . , xn]

Por fim, é necessário imprimir o polinômio ao usuário. O programa emite o


polinômio como na fórmula dada acima.
Função de impressão:

printf("Polinomio: %.2f",coef[0]);

for(y=0;y<n;y++){

printf(" +(%.2f)",coef[y+1]);

for(i=0;i<=y;i++) {

printf("(x-(%.2f))",x[i]);

Programa completo:

#include <stdio.h>

#include <stdlib.h>

int main()

int n, i, j, z ,y;

float x[10], fx[10], somatorio, denominador, coef[10];

printf("Digite n:");

scanf("%d",&n);

for(i=0;i<=n;i++){

printf("\nDigite X%d:",i);

scanf("%f",&x[i]);

printf("\nDigite Fx%d:",i);

scanf("%f",&fx[i]);

}
printf("O valor de n escolhido foi:%d\nOs valores escolhidos
foram:\n",n);

for(i=0;i<=n;i++){

printf("\nX%d: %.3f --- Fx%d: %.3f",i,x[i],i,fx[i]);

for(y=0;y<=n;y++){

somatorio=0;

for(j=0;j<=y;j++){

denominador = 1;

for(z=0;z<=y;z++){

if(z!=j){

denominador = denominador * (x[j]-x[z]);

somatorio = somatorio + fx[j]/denominador;

coef[y]=somatorio;

printf("\n\n");

printf("Polinomio: %.2f",coef[0]);

for(y=0;y<n;y++){
printf(" +(%.2f)",coef[y+1]);

for(i=0;i<=y;i++)

printf("(x-(%.2f))",x[i]);

system("pause");

return(0);

Exemplo de uso:

xi -2 -1 0 1 2

F(xi) -2 29 30 31 62
portanto o polinômio gerado é:
P ( x ) =−2+ ( 31 ) ( x−(−2 ) ) + (−15 ) ( x−(−2 ) ) ( x−(−1 ) ) + ( 5 ) ( x−(−2 )) ( x− (−1 ) )( x− ( 0 ) ) +(0) ( x−(−2 ) ) ( x−(−1 )) ( x

que por sinal é igual a P ( x ) =5 x 3 −30 x 2 +86 x−94

Conclusão

O método das diferenças divididas permite calcular de maneira rápida os


coeficientes do polinômio interpolador de Newton. No caso do exemplo só
havia 5 pares de pontos, mas quando é necessário um número muito maior, o
programa resolveria infinitamente mais rápido que os métodos manuais. Vê-se
então a importância de métodos numéricos, que proporcionam ao ser humano
ferramentas de cálculo rápidas, eficientes e precisas.

Bibliografia:

Neide M. B. Franco - Calculo Numérico

Você também pode gostar