我有以下代码,它给出了给定的rate的price:
public static void main(String[] args) {
double term = 5;
double coupon = 5;
double rate = 0.0432;
//should get the price == 103;
double price;
double sum = 0;
for (int i = 1; i <= term; i++) {
sum = sum + (coupon / Math.pow((1 + rate), i));
}
double lastAmount = (100 / Math.pow((1 + rate), (term)));
price = sum + lastAmount;
System.out.println("price is:" + price);
}
我的问题是,我怎样才能以其他方式做到这一点?其中价格已给出,但费率未知。 所以我发现,这将是一个指数方程。 它应该如下所示:
103x^5 - 5x^4 - 5x^3 - 5x^2 - 5x - 105=0
哪里
x = 1+rate
求解指数方程,得到 x = 1.0432,这意味着比率为预期的 0.0432。
我如何在java中实现这个来求解方程。
这里的代码使用布伦特方法的实现来查找根(来自 Apache Commons)。它将打印 -10000 到 +10000 之间的任何根。它可能不适用于多个根间隔小于
intervalSize
(0.01) 的函数(你的不是这样的函数)。
package sandbox;
import org.apache.commons.math3.analysis.UnivariateFunction;
import org.apache.commons.math3.analysis.solvers.BrentSolver;
public class BrentsMethodRootFinderExample {
private void solveit () {
BrentSolver solver = new BrentSolver();
UnivariateFunction f = new UnivariateFunction() {
@Override
public double value(double x) {
return 103*Math.pow(x, 5.0)-5*Math.pow(x, 4.0)-5*Math.pow(x, 3.0)-5*Math.pow(x, 2.0)-5*x - 105;
}
};
double intervalStart = -10000;
double intervalSize = 0.01;
while (intervalStart < 10000) {
intervalStart+= intervalSize;
if(Math.signum(f.value(intervalStart)) != Math.signum(f.value(intervalStart+intervalSize))) {
System.out.println("x = " + solver.solve(1000, f, intervalStart, intervalStart+intervalSize));
}
}
}
public static void main(String[] args) {
new BrentsMethodRootFinderExample().solveit();
}
}
输出:
x = 1.0432004413216969
您需要确定您的方程是否可以使用根式求解,如果可以,您可以尝试实现该算法。否则,您可以尝试采用 TI-82 图形计算器方法,在代码中“可视化”方程(以“足够”小的粒度进行迭代),观察从正到负的拐点(反之亦然),或者观察某个点该方程精确地为零,并向下近似以找到足够接近的值。然而,在阅读五次函数时,似乎这个问题可能没有一个很好的公式解决方案(至少不是我的数学能力可以理解的)。
众所周知,根据价格计算利率是一个没有封闭式解决方案的问题(对于
N>4
)。
使用几何级数的求和公式,方程组
((1+r)^N - 1) / r = R
相当于求
N
次多项式的根。您可以使用多项式求解器,但这里 Netwon 的方法更合适。
要取消的功能是
(1+r)^N - 1 - R r
及其在
r
, 上的导数
N(1+r)^(N-1) - R.
与单利相对应的利率,
R/N
,可以是一个很好的起始值。
查找多项式实根的另一种选择可能是使用我刚刚编写的库。
使用命令行版本的输出如下:
$ java -jar ./polynomial-roots-v1.0-SNAPSHOT-all.jar -precision 15 -polynomial_coefs "-105 -5 -5 -5 -5 103"
{ 103 * x ^ 5 - 5 * x ^ 4 - 5 * x ^ 3 - 5 * x ^ 2 - 5 * x - 105 = 0 }
Solution[1]: x = 1.04320048314876
该库可以轻松地包含在 Java 应用程序中(它是在 lgpl 许可证下提供的)
您可以在以下位置下载: