Você está na página 1de 5

UNIVERSIDADE FEDERAL DE SÃO PAULO

Instituto de Ciências Ambientais, Quı́micas e Farmacêuticas


Departamento de Engenharia Quı́mica

ALGORITMOS E PROGRAMAÇÃO COMPUTACIONAL


Atividade 02 - 29/janeiro/2021

INSTRUÇÕES:

1. O código deverá ter o seguinte cabeçalho:


/*****************************************************************
*** ***
*** ATIVIDADE AVALIATIVA 02 ***
*** ***
*** Nome completo dos integrantes do grupo ***
*** ***
*****************************************************************/

2. A atividade pode ser feita em grupos de 4 alunos.

3. Data de entrega: até às 23:00h do dia 20/fevereiro/2021

4. Na data acima, cada grupo deverá entregar o código fonte (arquivo com extensão
.c) e um breve vı́deo explicativo. Neste vı́deo, você deverá explicar os pontos mais
importantes do código e a estratégia usada para resolver o problema. Cada vı́deo não
deve ultrapassar 3 minutos.

5. A entrega dos arquivos deverá ser feito via Google Classroom.

6. Receberá nota ZERO:

(a) Programas com erros de sintaxe, ou seja, erros de compilação


(b) Os grupos que utilizarem estruturas, comandos, recursos, bibliotecas e funções
que não foram abordados em aula, ou que não foram citados no enunciado.
(c) Os grupos que enviarem os arquivos após o prazo de entrega
(d) Os grupos que não entregarem o material completo (vı́deo + código)
1

DE OLHO NO BOLSO

1. Introdução
Uma situação com a qual nos deparamos frequentemente quando vamos adquirir um bem de
consumo é saber qual é a taxa de juros embutida em um financiamento. Em geral, sabemos
somente o valor à vista do bem (Vbem ) e, caso optemos por um crediário, o número de
prestações n e o valor de cada prestação mensal Pk (1 ≤ k ≤ n). A taxa mensal de juros
j ≥ 0 não é revelada na maioria da vezes.
Vamos supor que todas as prestações possuem o mesmo valor P e que a primeira das
prestações é paga à vista, ou seja, a entrada do financiamento. Trazendo todas as prestações
vincendas para o presente, podemos escrever:
P P P
Vbem = P + + 2 + ... + = PS
1 + j (1 + j) (1 + j)n−1
onde definimos S pela somatória
1 1 1
S =1+ + 2 + ... +
1 + j (1 + j) (1 + j)n−1
Observe ainda que podemos simplificar o cálculo de S por
  n
1
1−


1+j



S= se j > 0
1
 1−


 1+j
n se j = 0

Caso conheçamos os valores de Vbem , n e P , e estejamos interessados em saber que taxa de


juros j está sendo praticada, precisamos resolver um polinômio de grau n−1 que, todavia, não
possui um método genérico para a obtenção de uma solução exata. Usualmente satisfazemo-
nos com uma solução aproximada de uma tal raiz, obtida através de métodos computacionais.
A determinação da taxa mensal de juros j pode então ser feita pela determinação da raiz
real positiva da função:
Vbem
f (j) = S −
P
Para determinação de tal raiz, utilizaremos um método conhecido por método de Muller, a
ser descrito a posteriori. Definimos o erro relativo de x em relação a y como sendo:

 x − y
ErroRel(x, y) = y se y 6= 0
1 se y = 0

2. Objetivos
Faça um programa que leia uma sequência de triplas (Vbem , n, P ) e que calcula, para cada
tripla, a taxa de juros j com uma precisão  ( = 10−9 ) correspondente ao financiamento de
2
um bem de valor Vbem > 0 com n ≥ 1 prestações de valor P > 0. Parta das aproximações
P P
iniciais 0, 0.3 × e .
Vbem − P Vbem − P
Seu programa deve obrigatoriamente encerrar a execução quando o usuário digitar um va-
lor negativo (ver Exemplo de Saı́da). Não é permitido o uso de nenhuma função da biblioteca
math.h neste exercı́cio. Você deve implementar as funções de protótipo abaixo especificadas
que computam, respectivamente, os valores de: x elevado a n; a raiz quadrada positiva de
x com precisão ; o valor absoluto de x; a taxa de juros com precisão  correspondente ao
financiamento de um bem de valor vbem com n prestações de valor prestacao; o erro relativo
de x em relação a y.

double potencia(double x, int n);

double raiz quadrada(double x);

double valor absoluto(double x);

double juros(double vbem, int n, double prestacao);

double erro relativo(double x, double y);

Na função raiz quadrada utilize a seguinte fórmula recursiva:

r0 = x
 
1 x
rn+1 = rn +
2 rn
O cálculo iterativo deverá ser executado enquanto a condição rn+1 − rn >  for verdadeira.
Por fim, além das funções acima, você pode criar outras funções que julgar necessárias para
melhorar a legibilidade do programa e reduzir a complexidade do problema.

3. O método de Muller
1. Sejam xn−2 , xn−1 e xn , três aproximações distintas de uma raiz de f e seja  a precisão
desejada. Se f é anulada em algum dos pontos, já encontramos a raiz. Caso contrário,
procuramos uma nova aproximação.
hi
2. Para ı́ndices apropriados i, sejam fi = f (xi ), hi = xi − xi−1 e qi =
hi−1

3. Seja A = qn fn − qn (1 + qn ) fn−1 + qn2 fn−2

4. Seja B = (2qn + 1) fn − (1 + qn )2 fn−1 − qn2 fn−2

5. Seja C = (1 + qn ) fn

2C
6. Definindo q 0 = − √ ,
B+ B 2 − 4AC
3
2C
7. q” = − √ e
B− B 2 − 4AC
8. Seja qn+1 o elemento de {q 0 , q”} com menor valor absoluto

9. A nova aproximação para a raiz de f é obtida por xn+1 = xn + hn qn+1

Repetimos o processo acima com as três últimas aproximações calculadas (xn−1 , xn , xn+1 )
até que a precisão desejada seja atingida, ou seja, até que:

ErroRel (xn , xn+1 ) <  ou f (xn+1 ) = 0

4. Exemplos de saı́da
Valor do bem: 1000
Numero de prestacoes: 10
Valor da prestacao: 100

Juros = 0.0

Valor do bem: 1000


Numero de prestacoes: 10
Valor da prestacao: 100.45

Juros = 0.000999

Valor do bem: 1000


Numero de prestacoes: 10
Valor da prestacao: 104.54

Juros = 0.010007

Valor do bem: 1000


Numero de prestacoes: 10
Valor da prestacao: 147.95

Juros = 0.099999

Valor do bem: 1000


Numero de prestacoes: 100
Valor da prestacao: 15.71

Juros = 0.010002

Valor do bem: 1000


4
Numero de prestacoes: 100
Valor da prestacao: 90.92

Juros = 0.100005

Valor do bem: -1
FIM DO PROGRAMA

Você também pode gostar