求解 Java 中的多项式方程
Solving polynomial equation in Java
我有下面的代码,它给出了 price 给定的 rate:
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 中实现这个来求解方程。
您需要确定您的方程式是否可以使用 radicals 求解,如果可以,您可以尝试实施该算法。否则,您可以尝试采用 TI-82 图形计算器方法 "visualizing" 代码中的方程(以 "sufficiently" 小粒度迭代),观察从正到负的变化(或反之亦然),或等式恰好为零并向下近似以找到足够接近的值的点。然而,在阅读五次函数时,似乎没有一个很好的公式解决这个问题(至少不是我的数学能力可以理解的)。
已知从价格计算利率是一个没有封闭形式解决方案的问题(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
可以作为一个很好的起始值。
这是使用布伦特方法实现根查找(来自 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
我有下面的代码,它给出了 price 给定的 rate:
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 中实现这个来求解方程。
您需要确定您的方程式是否可以使用 radicals 求解,如果可以,您可以尝试实施该算法。否则,您可以尝试采用 TI-82 图形计算器方法 "visualizing" 代码中的方程(以 "sufficiently" 小粒度迭代),观察从正到负的变化(或反之亦然),或等式恰好为零并向下近似以找到足够接近的值的点。然而,在阅读五次函数时,似乎没有一个很好的公式解决这个问题(至少不是我的数学能力可以理解的)。
已知从价格计算利率是一个没有封闭形式解决方案的问题(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
可以作为一个很好的起始值。
这是使用布伦特方法实现根查找(来自 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