【发布时间】:2019-11-11 01:40:17
【问题描述】:
我正在尝试像 Excel 那样在 Java 中实现“RATE()”函数。经过初步研究,我发现我需要使用牛顿法来计算速率,因为我们无法明确求解 r。
支付函数 => P = r × (PV) /(1 − (1 + r) ^ −n)
我使用 Mathmatica 在静态方法中计算了您在下面看到的导数,然后返回并添加了变量。
代码生成的值实际上随着每次迭代而变得更糟。
以下是前四次迭代的代码结果:
0.0018297879140010277
0.3979496233654264
-1.5652077088934568E102
Infinity
(一旦它真正起作用,我将使它成为一个递归方法)。
这里是代码。任何帮助将不胜感激。
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));
}
提前致谢。
【问题讨论】:
-
您是否尝试过通过步进或纸笔玩电脑的方式进行调试?警告:这不是 my 方法。我和Fig的关系更密切。
标签: java math newtons-method