Está en la página 1de 4

Interés sobre saldo

Problema (Interés sobre saldo). Un artı́culo cuesta $100 de lista. Puedo comprarlo al contado
con un 10% de descuento, o con un plan de pagos de anticipo y 9 cuotas mensuales de $10 c/u,
¿cuál es la tasa de interés (nominal anual) que están cobrando? ✄
En este problema consideramos que la cuota se calcula mediante el llamado interés sobre saldo,
que da como respuesta a la pregunta anterior una tasa de 29.07%.
Para describir un préstamo donde el interés se considera sobre el saldo, supongamos que el
monto del préstamo es a (en $), que la tasa de interés anual (nominal) es r (en %), y que pagaremos
n cuotas mensuales fijas de p (en $) comenzando al final del primer mes.
Si am es el saldo adeudado a fin del mes m, justo antes de pagar la cuota m-ésima, y dm es el
saldo inmediatamente después de pagar esa cuota, poniendo t = 1 + r/(100 × 12), tendremos:
a1 = t × a y dm = am − p, am+1 = t × dm para m ≥ 1.
Puesto de otra forma, inmediatamente después de pagar la m-ésima cuota la deuda es
dm = t × dm−1 − p para m = 1, 2, . . .,
donde por comodidad ponemos d0 = a.
Uno de los primeros objetivos es calcular la función saldo(a, r, p, m), que dados el monto inicial
a, la tasa r, y el pago mensual p, calcula el saldo dm = saldo(a, r, p, m) para m = 0, 1, 2, . . . , y
que está implementada en el Programa sobresaldo. Usando esta función como base, el programa
emplea distintas funciones para calcular una de las variables (a, r, p o n) si las tres restantes son
conocidas:
• para calcular r dados a, p y n: calcularr ,
• para calcular a dados r, p y n: calculara,
• para calcular p dados a, r y n: calcularp,
• para calcular n dados a, r y p: calcularn.
Todas estas funciones (calcularr , calculara, calcularp y calcularn) usan la monotonı́a de saldo
cuando se fijan tres de las variables y se deja mover la restante: saldo(a, r, p, m) es
i) decreciente con p para a, r y m fijos,
ii) creciente con a para r, p y m fijos,
iii) creciente con r para a, p y m fijos.
Cuando se fijan a, r y p y se deja mover m, saldo(a, r, p, m) puede ser creciente o decreciente
(por ejemplo si r es muy grande o muy chico), e inclusive puede ser constante si se satisface cierta
relación entre a, r y p. En efecto, dados a y r existe un pago mensual crı́tico, pcrit , tal que
saldo(a, r, pcrit , m) = a para m = 0, 1, . . .
que explı́citamente es
r
pcrit = a × .
12 × 100
De este modo, si a, r y p están fijos, la función saldo(a, r, p, m) es decreciente con m si p > pcrit ,
es constante si p = pcrit , y es creciente si p < pcrit .
La ecuación que describe pcrit (junto con la monotonı́a de saldo) también es importante para
determinar el intervalo inicial para emplear el método de la bisección en las funciones calcularr ,
calculara y calcularp, ya que como sabemos, para este método la función correspondiente debe
tener signos opuestos en los extremos iniciales. Ası́, podemos hacer una tabla de valores de poco
y mucho apropiados en cada caso como se muestra en la Tabla 1.
Por otra parte, para calcular n la función calcularn emplea un simple lazo “ while ”, pero
podrı́amos usar también el método de la bisección: poniendo
r
λ =p−a× (= p − pcrit ),
12 × 100
Para calcular función poco mucho
p × 12 × 100
r calcularr 0
a
p × 12 × 100
a calculara 0
r
r r 
p calcularp a× (= pcrit ) a× 1+
12 × 100 12 × 100
Tabla 1: Valores de poco y mucho apropiados

y bajo la suposición de que λ > 0, puede verse que, para a, r y p fijos debe ser

saldo(a, p, r, m) ≤ a − m × λ para m = 0, 1, . . .,

de modo que para calcular n con el método de la bisección podrı́a ponerse poco = 0 y mucho =
da/λe. Sin embargo, como los valores de n son discretos y no continuos, el método debe cambiarse
bastante, y se transforma en el de búsqueda binaria que se ve en otra práctica.
Observar finalmente que el uso de la función calcularn presupone que los datos a, r y p son
tales que λ = p − pcrit > 0, que en el problema propuesto se verifica porque ya sabemos que hay
un número finito de cuotas. Pero si se tratara de usar calcularn para a, r y p cualesquiera, debe
verificarse si p > pcrit antes de usar calcularn, ya que en otro caso el lazo “ while ” no termina
nunca. Además, puede ser que la última cuota no sea exactamente p sino un poco menor, por lo
que en el Programa sobresaldo se agrega el cálculo de ultimacuota.

Programa sobresaldo

program sobresaldo( input, output);


(*
Calcula la tasa de interes r usada en un prestamo con
interes sobre saldo, dados el monto inicial a del
prestamo, el pago mensual p y la cantidad de cuotas n.

Despues se hace una verificacion, calculando:


a dados r, p y n,
p dados a, r y n,
n dados a, r y p.

Para calcular r, a y p se usa el metodo de la biseccion.


*)

const tolerancia = 0.001; (* montos y tasas con dos decimales *)

var
n, ncalculado: integer;
a, r, p, ultimacuota: real;

function saldo(a, r, p: real; mes: integer): real;


(* calcula el saldo inmediatamente despues del mes *)
var i: integer; t, s: real;
begin
t := (1 + r / (100 * 12));
s := a; (* si mes = 0 *)
for i := 1 to mes do s := t * s - p;
saldo := s
end;

2
function calcularr(a, p: real; n: integer): real;
(*
Metodo de la biseccion para calcular la tasa r,
dados el capital inicial a, la cuota mensual p
y el numero de meses n.
*)
var poco, mucho, ypoco, ymucho, medio, ymedio: real;
begin
poco := 0.0; mucho := p * 12 * 100 / a;
ypoco := saldo(a, poco, p, n);
ymucho := saldo(a, mucho, p, n);
repeat
medio := (poco + mucho)/2;
ymedio := saldo(a, medio, p, n);
if (ymedio * ypoco < 0) then mucho := medio
else begin poco := medio; ypoco := ymedio end
until (abs(ymedio) < tolerancia);
calcularr := medio
end;

function calculara(r, p: real; n: integer): real;


(*
Metodo de la biseccion para calcular el capital
inicial a, dados la cuota mensual p, la tasa r,
y el numero de meses n.
*)
var poco, mucho, ypoco, ymucho, medio, ymedio: real;
begin
poco := 0;
mucho := p * 12 * 100 / r;
ypoco := saldo(poco, r, p, n);
ymucho := saldo(mucho, r, p, n);
repeat
medio := (poco + mucho)/2;
ymedio := saldo(medio, r, p, n);
if (ymedio * ypoco < 0) then mucho := medio
else begin poco := medio; ypoco := ymedio end
until (abs(ymedio) < tolerancia);
calculara := medio
end;

function calcularp(a, r: real; n: integer): real;


(*
Metodo de la biseccion para calcular la cuota
mensual p, dados el capital inicial a, la tasa r,
y el numero de meses n.
*)
var poco, mucho, ypoco, ymucho, medio, ymedio: real;
begin
poco := a * r / (12 * 100);
mucho := a + poco;
ypoco := saldo(a, r, poco, n);
ymucho := saldo(a, r, mucho, n);
repeat
medio := (poco + mucho)/2;
ymedio := saldo(a, r, medio, n);

3
if (ymedio * ypoco < 0) then mucho := medio
else begin poco := medio; ypoco := ymedio end
until (abs(ymedio) < tolerancia);
calcularp := medio
end;

function calcularn(a, r, p: real): integer;


(*
Calcular la cantidad de cuotas mensuales n,
dados dados el capital inicial a, la tasa r,
y la cuota mensual p.

Se supone que las cuotas son iguales, excepto


tal vez la ultima que puede ser menor
(pero todavia positiva).

Tambien suponemos que se verifica p > a r /(12 100).


*)
var m: integer;
begin
m := 0;
while (saldo(a, r, p, m) > tolerancia) do m := m + 1;
calcularn := m
end;

begin
(* carteles *)
writeln(’** Calcula la tasa de interes en un prestamo con’);
writeln(’ interes sobre saldo, dados el monto inicial del’);
writeln(’ prestamo, el pago mensual y la cantidad de cuotas **’);
writeln;

(* datos de entrada *)
write(’ Entrar el monto del prestamo: ’); readln(a);
write(’ Entrar el monto de la cuota mensual: ’); readln(p);
write(’ Entrar la cantidad de cuotas: ’); readln(n);
writeln;

(* calculos *)
r := calcularr(a,p,n);

(* resultados *)
writeln(’ La tasa anual es ’, r:4:2); writeln;

writeln(’** Verificacion:’);
writeln(’ El monto inicial es ’, calculara(r,p,n):4:2);
writeln(’ La cuota mensual es ’, calcularp(a,r,n):4:2);
ncalculado := calcularn(a,r,p);
ultimacuota := calcularp(saldo(a,r,p,ncalculado-1),r,1);
write(’ La cantidad de cuotas es ’, ncalculado:1);
write(’ y la ultima cuota es de ’, ultimacuota:4:2);

(* fin *)
writeln; writeln(’** Fin **’)
end.

También podría gustarte