Problema em programa para calculo de Erro verdadeiro e aproximado - Calculo numerico

1. Problema em programa para calculo de Erro verdadeiro e aproximado - Calculo numerico

Felipe Roque de Albuquerque Neto
FelipeRoque

(usa Ubuntu)

Enviado em 21/02/2018 - 22:48h

Boa noite pessoal, estou tentando contruir um programa que calcule erro verdadeiro e erro aproximado, a partir de uma serie:
e^-x = 1-x + x^2/2- x^3/3! +....

Só que ta dando um bug que o valor aproximado está vindo com error, segue o codigo, se possivel queria um help:

#include<stdlib.h>
#include<stdio.h>
#include<math.h>

int fatorial(int f)
{
int x;
float fatorial = 1;

for(f=x; x>=1;x--)
{
fatorial = fatorial * x;
}

return fatorial;
};


int main() {

float valor_verdadeiro = 0.006737947;
int truncamento, iteracoes, x;
float aux_de_x;
float aux;
int i = 0;
float valor_de_e;
float Erro_Verdadeiro, Erro_Aproximado;
//int f;


printf("\t\t\tO valor verdadeiro eh --> %.9f", valor_verdadeiro); // Mostra o valor verdadeiro

printf("\n\n\n");

printf("\tQuantidade Truncamento ---> "); // Pergunta quantidade de truncamentoa ser realizada
scanf("%i", &truncamento); //Ler
fflush(stdin);// Limpa
printf("\tQuantidade de iteracoes ---> "); // pergunta quantidade de iteracoes que devem ser realizadas
scanf("%i", &iteracoes); // Ler
fflush(stdin);//Limpa
printf("\tValor de X --->"); // Pede o valor de X, no caso X é a exponencial do "e"
scanf("%i", &x);// Ler
fflush(stdin);// Limpa

aux_de_x = 1 - x;

for (i = 2; i <= truncamento; i++){

if (i % 2 == 0)
{
valor_de_e = valor_de_e + (pow(iteracoes, i)) / fatorial(i); // Valores +
} else

valor_de_e = valor_de_e - (pow(iteracoes, i)) / fatorial(i); // Alternancia entre - e +

if (i == truncamento - 1)
{
aux = valor_de_e;
}

Erro_Verdadeiro = valor_verdadeiro - valor_de_e;
Erro_Verdadeiro = Erro_Verdadeiro / valor_verdadeiro;
Erro_Verdadeiro = Erro_Verdadeiro * 100;

Erro_Aproximado = valor_verdadeiro - valor_de_e;
Erro_Aproximado = Erro_Aproximado / valor_de_e;
Erro_Aproximado = Erro_Aproximado * 100;

printf("\n\n\n");

printf("\t O valor do Erro Verdadeiro/Relativo --> %f.10", Erro_Verdadeiro);

printf("\n\n");

printf("\t O valor do Erro Aproximado --> %f.10", Erro_Aproximado);

return 0;
}
}






  


2. OBS

Felipe Roque de Albuquerque Neto
FelipeRoque

(usa Ubuntu)

Enviado em 21/02/2018 - 22:52h

Mais outra coisa, quando eu coloco para 1 ou 2 iterações o Erro verdadeiro da ok, mais o aproximado da errado. Se fosse para 1 iteração não existe Erro aproximado, mais mesmo assim ele ta imprimindo... Para 2 iterações (e adiante) já existe valor aproximado. Agora quando coloco para 3 ele buga tanto o Erro verdadeiro como Erro aproximado


3. Erros

lucas
1lucas1

(usa Linux Mint)

Enviado em 22/02/2018 - 01:31h

Na função fatorial x recebe f e nao f recebe x


int fatorial(int f)
{
int x;
float fatorial = 1;

for(x=f; x>=1;x--)
{
fatorial = fatorial * x;
}

return fatorial;
};


e em

if (i % 2 == 0){
valor_de_e = valor_de_e + (pow(iteracoes, i)) / fatorial(i); // Valores +
}else
valor_de_e = valor_de_e - (pow(iteracoes, i)) / fatorial(i); // Alternancia entre - e +
valor_de_e está vindo com lixo de memoria tente inicia-lo com zero



4. Re: Problema em programa para calculo de Erro verdadeiro e aproximado - Calculo numerico

Paulo
paulo1205

(usa Ubuntu)

Enviado em 22/02/2018 - 03:19h

Eu duvido seriamente que você queira usar int como tipo de retorno da função fatorial(). Um argumento de 8 estoura um inteiro de 16 bits, e 13 já estoura um de 32 bits.

Aliás, eu duvido que você queira realmente calcular a fatorial por meio de uma função. Melhor seria você ter, dentro do laço de repetição que está dentro de main(), uma variável de um tipo de ponto flutuante com o valor da fatorial que será simplesmente multiplicada pelo número de iteração corrente (ou esse número menos 1).

Aliás, por que você fez o contador de iterações começando é 2, e por que você o compara com truncamento, em lugar de o comparar com iteracoes? E por que está calculando pow(iteracoes, i) e lugar de pow(x, i)? Que sentido tem isso? E a variável truncamento significa o quê?
float fatorial_de_i=1.0;
float e_a_menos_x=1.0;
//float x_a_i=x;
float sinal=-1.0;
for(int i=1; i<=iteracoes; i++){
e_a_menos_x+=sinal*pow(x, i)/fatorial_de_i;
// Alternativamente, para não usar pow() (mas podendo afetar o erro acumulado):
//e_a_menos_x+=sinal*x_a_i/fatorial_de_i;
//x_a_i*=x;
fatorial_de_i*=i;
sinal=-sinal;
}



5. Resolvido

Felipe Roque de Albuquerque Neto
FelipeRoque

(usa Ubuntu)

Enviado em 22/02/2018 - 15:20h

Tinha realmente alguns erros. O objetivo de calcular o fatorial fora da main, seria de ficar um pouco mais limpo o código. O Truncamento seria a quantidade de elementos da serie que eu iria calcular, por exemplo,


s= 1+x+x^2+x^3+x^4+x^5 , nesse caso o truncamento só seria calcular até x^4, mais se quiser pode colocar com 6 truncamentos.








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts