求解 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