Olá, preciso de ajuda com uma atividade de linguagem c. O programa precisa ler o valor de certo bem, o número de prestações no qual foi pago, e o valor das prestações. A partir destes valores precisa calcular a taxa de juros pela raiz da função f(j)=somatório-(valor do bem/valor da prestação). Somatório é 1-(1/(1+j))^n/1-(1/(1+j)) quando j>0, sendo j a taxa de juros e n numero de prestações. Para achar a raiz da função é necessário usa o método de muller. Porém, o juros da astronômico, e já mexi em tudo e não sai. Se alguém poder ajudar a achar o erro.
O código é:
(ignorem as outras funções potencia, valor absoluto, erro relativo e raiz quadrada, é que não pode usar o math.h. O importante esta em negrito)
#include <stdio.h>
#include <stdlib.h>
#define TOL 0.000000001
double potencia(double x, int n)
{
int k;
double pot=1;
while (vbem>0)
{
printf("Digite valor do bem,numero de prestacoes e valor das prestacoes=");
scanf("%lf %lf %lf", &vbem, &nprest, &prest);
printf("juros= %lf\n", juros(vbem,nprest,prest));
}
Pergunta
JuliaAlvesGuirado
Olá, preciso de ajuda com uma atividade de linguagem c. O programa precisa ler o valor de certo bem, o número de prestações no qual foi pago, e o valor das prestações. A partir destes valores precisa calcular a taxa de juros pela raiz da função f(j)=somatório-(valor do bem/valor da prestação). Somatório é 1-(1/(1+j))^n/1-(1/(1+j)) quando j>0, sendo j a taxa de juros e n numero de prestações. Para achar a raiz da função é necessário usa o método de muller. Porém, o juros da astronômico, e já mexi em tudo e não sai. Se alguém poder ajudar a achar o erro.
O código é:
(ignorem as outras funções potencia, valor absoluto, erro relativo e raiz quadrada, é que não pode usar o math.h. O importante esta em negrito)
#include <stdio.h>
#include <stdlib.h>
#define TOL 0.000000001
double potencia(double x, int n)
{
int k;
double pot=1;
for(k = 1; k <= n; k++)
{
pot = pot*x;
}
return pot;
}
double valor_absoluto(double x)
{
if(x<0)
{
x=-1*x;
}
return x;
}
double erro_relativo(double x, double y)
{
double erro=1, valor;
if (y!=0)
{
valor=(x-y)/y;
erro=valor_absoluto (valor);
}
else
{
erro=1;
}
return erro;
}
double raiz_quadrada(double x)
{
double esp=1, x0, x1;
x0=x;
while(esp>=TOL)
{
x1=x0-(((x0*x0)-x)/(2*x0));
esp=valor_absoluto(((x1-x0)/x1));
x0=x1;
}
return x1;
}
double f(double j,double vbem, int nprest, double prest)
{
double somatorio, funcao;
if (j==0)
{
somatorio=nprest;
funcao=somatorio-(vbem/prest);
}
else
{
somatorio=(1-(potencia(1/(1+j),nprest)))/(1-(1/(1+j)));
funcao=somatorio-(vbem/prest);
}
return funcao;
}
double juros (double vbem, int nprest, double prest)
{
double x0=0, x1, fx0, fx1, x2, fx2, fx3, h1, h2, q2, a, b, c, x3, esp, fx=1, resp, qlinha, qlinhalinha;
x1=0.3*(prest/(vbem-prest));
x2=prest/(vbem-prest);
fx0=f(x0,vbem,nprest,prest);
fx1=f(x1,vbem,nprest,prest);
fx2=f(x2,vbem,nprest,prest);
h1=x1-x0;
h2=x2-x1;
q2=h2/h1;
a=(q2*fx2)-(q2*(1+q2)*fx1)+((potencia(q2,2))*fx0);
b=((2*q2+1)*fx2)-((potencia((1+q2),2))*fx1)-((potencia(q2,2))*fx0);
c=(1+q2)*fx2;
qlinha=(-2*c)/(b+(raiz_quadrada(b*b-(4*a*c))));
qlinhalinha=(-2*c)/(b-(raiz_quadrada(b*b-(4*a*c))));
if (valor_absoluto(qlinha)>valor_absoluto(qlinhalinha))
{
x3=x2+(h1*qlinhalinha);
}
else
{
x3=x2+(h1*qlinha);
}
fx3=f(x3,vbem,nprest,prest);
esp=erro_relativo(x3, x2);
x0=x1;
x1=x2;
x2=x3;
resp=x3;
if (fx0==0)
{
fx=fx0;
resp=x0;
}
if (fx1==0)
{
fx=fx1;
resp=x1;
}
if (fx2==0)
{
fx=fx2;
resp=x2;
}
while (esp>=TOL && fx!=0)
{
fx0=f(x0,vbem,nprest,prest);
fx1=f(x1,vbem,nprest,prest);
fx2=f(x2,vbem,nprest,prest);
h1=x1-x0;
h2=x2-x1;
q2=h2/h1;
a=(q2*fx2)-(q2*(1+q2)*fx1)+((potencia(q2,2))*fx0);
b=((2*q2+1)*fx2)-((potencia((1+q2),2))*fx1)-((potencia(q2,2))*fx0);
c=(1+q2)*fx2;
qlinha=(-2*c)/(b+(raiz_quadrada(b*b-(4*a*c))));
qlinhalinha=(-2*c)/(b-(raiz_quadrada(b*b-(4*a*c))));
if (valor_absoluto(qlinha)>valor_absoluto(qlinhalinha))
{
x3=x2+(h1*qlinhalinha);
}
else
{
x3=x2+(h1*qlinha);
}
fx3=f(x3,vbem,nprest,prest);
esp=erro_relativo(x3, x2);
x0=x1;
x1=x2;
x2=x3;
resp=x3;
if (fx0==0)
{
fx=fx0;
resp=x0;
}
if (fx1==0)
{
fx=fx1;
resp=x1;
}
if (fx2==0)
{
fx=fx2;
resp=x2;
}
}
return resp;
}
int main()
{
int nprest=1;
double vbem=1,prest=1;
while (vbem>0)
{
printf("Digite valor do bem,numero de prestacoes e valor das prestacoes=");
scanf("%lf %lf %lf", &vbem, &nprest, &prest);
printf("juros= %lf\n", juros(vbem,nprest,prest));
}
system("PAUSE");
return 0;
}
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.