I am trying to implement the "RATE()" function in Java as Excel does it. After initial research, I saw I needed to use Newton's method to get to the rate since we cannot solve for r explicitly.
Payment function => P = r × (PV) /(1 − (1 + r) ^ −n)
I calculated the derivative you see below in the static method using Mathmatica and then went back in and added the variables.
The code is producing values that actually get worse with each iteration.
Here are the results from the code below for the first four iterations:
0.0018297879140010277
0.3979496233654264
-1.5652077088934568E102
Infinity
(I will make this a recursive method once it actually works).
Here is the code. Any help what's off would be appreciated.
public static void main(String[] args)
{
double Pv = 99000.0; // financed amount, minus any fees.
double loanAmount = 100000.0; // before fees.
int numPeriods = 360; // number of payments
double lastGuess = 0.00001; // starting point for Newton's method.
double newGuess = 0.0; // calculated Newton result on each iteration
// first guess
newGuess = lastGuess - f(Pv, numPeriods, lastGuess, loanAmount) / derivative(Pv, numPeriods, lastGuess);
System.out.println(newGuess);
lastGuess = newGuess;
newGuess = lastGuess - f(Pv, numPeriods, lastGuess, loanAmount) / derivative(Pv, numPeriods, lastGuess);
System.out.println(newGuess);
lastGuess = newGuess;
newGuess = lastGuess - f(Pv, numPeriods, lastGuess, loanAmount) / derivative(Pv, numPeriods, lastGuess);
System.out.println(newGuess);
lastGuess = newGuess;
newGuess = lastGuess - f(Pv, numPeriods, lastGuess, loanAmount) / derivative(Pv, numPeriods, lastGuess);
System.out.println(newGuess);
}
private static double f(double Pv, int n, double lastGuess, double loanAmount)
{
return lastGuess * Pv * Math.pow((1 + lastGuess), n) - loanAmount;
}
//---------------------------------------------------
private static double derivative(double Pv, int n, double lastGuess)
//---------------------------------------------------
{
return (Pv * n * lastGuess) / (Math.pow((1 + lastGuess), n) * Math.pow(1 - (1 / (Math.pow((1 + lastGuess), n))), 2)) -
Pv / (1 - Math.pow((1 + lastGuess), n));
}
Thanks in advance.