package org.geogebra.common.kernel.advanced; import org.apache.commons.math3.analysis.DifferentiableUnivariateFunction; import org.apache.commons.math3.analysis.UnivariateFunction; /** * @author michael * * returns fundamental function * * f(rate) = pmt * (1 + rate * pmtType) * ((1 + rate)^n - 1) / (rate) + * pv * (1 + rate)^n + fv * * */ public class RateFunction implements DifferentiableUnivariateFunction { private double n; private double pv; private double fv; private double pmt; private double pmtType; private RateFunctionDerivative deriv; /** * @param n * number of payments * @param pv * Present Value * @param fv * Future Value * @param pmt * Payment * @param pmtType * 0 or 1 */ public RateFunction(double n, double pv, double fv, double pmt, double pmtType) { this.n = n; this.pv = pv; this.fv = fv; this.pmt = pmt; this.pmtType = pmtType; this.deriv = new RateFunctionDerivative(n, pv, pmt, pmtType); } @Override public double value(double x) { // fv + pmt (1 + x pmtType) ((1 + x)^n - 1) / x + pv (1 + x)^n // fill in the "hole" in the function // limit of (Math.pow(1 + x, n) - 1) / x // as x tends to 0 // is n if (x == 0) { return fv + pmt * (1 + x * pmtType) * n + pv * Math.pow(1 + x, n); } return fv + pmt * (1 + x * pmtType) * (Math.pow(1 + x, n) - 1) / x + pv * Math.pow(1 + x, n); } @Override public UnivariateFunction derivative() { return deriv; } }