用Java求解多项式方程

问题描述 投票:0回答:4

我有以下代码,它给出了给定的rateprice

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中实现这个来求解方程。

java math equation polynomial-math equation-solving
4个回答
0
投票

这里的代码使用布伦特方法的实现来查找根(来自 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


0
投票

您需要确定您的方程是否可以使用根式求解,如果可以,您可以尝试实现该算法。否则,您可以尝试采用 TI-82 图形计算器方法,在代码中“可视化”方程(以“足够”小的粒度进行迭代),观察从正到负的拐点(反之亦然),或者观察某个点该方程精确地为零,并向下近似以找到足够接近的值。然而,在阅读五次函数时,似乎这个问题可能没有一个很好的公式解决方案(至少不是我的数学能力可以理解的)。


0
投票

众所周知,根据价格计算利率是一个没有封闭式解决方案的问题(对于

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
,可以是一个很好的起始值。


0
投票

查找多项式实根的另一种选择可能是使用我刚刚编写的库。

使用命令行版本的输出如下:

$ 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 许可证下提供的)

您可以在以下位置下载:

实多项式根计算库下载

© www.soinside.com 2019 - 2024. All rights reserved.