Ir al contenido


Foto

Despejar - ecuación matemática


  • Por favor identifícate para responder
21 respuestas en este tema

#21 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 07 septiembre 2012 - 01:46

Bueno ya he tenido éxito con la codificación de dicho despeje  8o|, gracias por tu valiosa ayuda Delphius  :); logrando sustituir la función tasa que usaba en excel.

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:



delphi
  1.   function CalculaTasa(capi,plazo,cuota){
  2.       var i_1 = cuota/capi
  3.       var i_ = i_1 * (1-(1/Math.pow(1+i_1,plazo)));
  4.       var i_n = i_1 * (1-(1/Math.pow(1+i_,plazo)));
  5.  
  6.       while ((i_ - i_n)>=0.00000017)          //Tolerancia
  7.       {
  8.         i_ = i_n;
  9.         i_n = i_1 * (1-(1/Math.pow(1+i_,plazo)));
  10.       }
  11.   return i_n
  12.   }



Saludos
  • 0

#22 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 07 septiembre 2012 - 02:12

Hola!
Tengo algunas observaciones:
1) Como medida de seguridad, emplear el valor absoluto de la diferencia al comparar con la tolerancia
2) El criterio de salida del ciclo para la tolerancia es que sea menor (o a lo sumo igual)
3) Como segunda medida de seguridad, añade una variable máxima de iteraciones

Esto por puntos son esenciales para evitar un posible bucle infinito:
Si la diferencia es negativa y no se considera en términos absolutos, una evaluación <= contra un valor por más pequeño pasará el examen como falso positivo. Por ejemplo supongamos que tu dices que la tolerancia es de 0,0001 pero la diferencia calculada es -0,0065. Si no consideras el valor absoluto la evaluación es:
-0,0065 <= 0,0001
Por lo que cumple el criterio pero en realidad un
|-0,0065| <= 0,0001
queda en:
0,0065 <= 0,0001
Lo cual es falso y por tanto quiere decir que la diferencia entre ambos valores no es tan cercana al valor de tolerancia permitido.

El otro motivo, el de añadir unas iteraciones máximas es para obligar al algoritmo a salir en los peores casos. Es posible que haya casos en que no se logre entrar en convergencia a ciertos valores de tolerancia, sobre todo si son valores muy pequeños. Al poner este tope de iteraciones le estás indicando que tiene m oportunidades de resolver las cosas. Si después de esas m no ha llegado a resultados entonces habrá que aflojar la tolerancia o bien permitirle iterar más a ver si llega.

4) Generalmente la tolerancia se expresa en términos de 1x10^+-n. No es del todo adecuado ver un 0,...17  ;)

5) Opcional: permitir que el sistema acepte ingresar un valor de tolerancia. Si no pasa tomar uno por defecto.

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.