

La fórmula usada fue la siguiente, que da el capital en la amortización de un préstamo de cuota fija en sistema francés.
Siendo C el capital a pagar, R la cuota, I la tasa periódica y n el número de períodos.
C=R[1-(1+i)^-n)]/i
Detalles del despeje tomados de: http://mx.answers.ya...14211255AAHlXHc
. . . R (1+i)^n – 1]. . .R. . (1+i)^n – 1. . R. . . . . . .1
I = ───────── = ── ─────── = ── [1 - ─────]
. . . . C (1+i)^n. . . . . C. . . (1+i)^n. . . .C. . . . . (1+i)^n
Aplicando ahora el método de aproximaciones, se modifica sucesivamente el término 1/(1+i)^n, cantidad muy pequeña respect a 1. Si suponemos que esta cantidad es igual a cero, la igualdad [1] se nos convierte en
. . . . R
i1 = ──
. . . . C
Si el valor así obtenido lo reemplazamos en la misma igualdad, pero en (1+i)^n, tendremos
. . . . R. . . . . . .1
i2 = ── [1 - ──────]
. . . . C. . . . (1+i1)^n
Este valor i2 se reemplaza por i en 1/(1+i) de la misma igualdad y tendremos
. . . . R. . . . . . .1
I3 = ── [1 - ──────]
. . . . C. . . . .(1+i2)^n
Continuando de la misma manera obtendremos valores cada vez más próximos a i cuanto queramos.
Al final solo queda codificar tal fórmula considerando lo siguiente(tolerancia):
Pero en los casos en que no es posible tener modo de llegar a un valor real se estila por aproximación entre el cálculo anterior y el actual, en términos del error absoluto:
Abs(Actual - Anterior) < Tolerancia
En este caso se debe aplicar esta última. Ya que no hay modo de estimar el real, sólo nos queda confiar en una posible convergencia y en una mejora en los decimales progresivamente.
El algoritmo se detiene en cuanto la diferencia entre el valor estimado anteriormente y en la actual iteración es tan chica y menor a la tolerancia que se define.
El código siguiente esta en JS, me funcionó de primera instancia y esta sujeto a mejoras que con gusto son recibidas:
function CalculaTasa(capi,plazo,cuota){ var i_1 = cuota/capi var i_ = i_1 * (1-(1/Math.pow(1+i_1,plazo))); var i_n = i_1 * (1-(1/Math.pow(1+i_,plazo))); while ((i_ - i_n)>=0.00000017) //Tolerancia { i_ = i_n; i_n = i_1 * (1-(1/Math.pow(1+i_,plazo))); } return i_n }
Saludos