前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用apache.commons.math求解一元多项式方程

使用apache.commons.math求解一元多项式方程

作者头像
算法之名
发布2021-03-04 10:28:12
1.1K0
发布2021-03-04 10:28:12
举报
文章被收录于专栏:算法之名

添加依赖

代码语言:javascript
复制
<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-math3</artifactId>
   <version>3.6.1</version>
</dependency>

它的原理是Newton-Raphson算法,又叫做牛顿-拉裴森(Newton-Raphson)方法,是一维求根方法中最著名的一种。其特点是在计算时需要同时计算函数值与其一阶导数值,从几何上解释,牛顿法是将当前点处的切线延长,使之与横轴相交,然后把交点处值作为下一估值点。

从数学上解释,牛顿法可以从函数的泰勒展开得到。?(?)f(x)的泰勒展开可以表示为:

?(?+?)=?(?)+?′(?)?+?″(?)2?2+?(?3)f(x+δ)=f(x)+f′(x)δ+f″(x)2δ2+O(δ3)

对于足够小的?δ,可以将只保留上式右端关于的一阶项,得到:

?=−?(?)?′(?)δ=−f(x)f′(x)

于是得到由到的递推公式:

??+1=??+?=??−?(??)?′(??)xi+1=xi+δ=xi−f(xi)f′(xi)

可见牛顿法是让?x沿着?(?)f(x)梯度的方向下降,类似于最优化方法中的梯度下降法。牛顿法也可以作为最优化算法,只不过那时需要求函数的二阶导数。

代码语言:javascript
复制
public class MathMain {
    public static void main(String[] args) {
        double[] d = new double[]{6.0,-5.0,1.0};
        UnivariateDifferentiableFunction function = new PolynomialFunction(d);
        System.out.println(function);
        UnivariateDifferentiableSolver solver = new NewtonRaphsonSolver();
        List<Double> res = new ArrayList<>();
        double solusion = solver.solve(10, function, 0);
        res.add(solusion);
        solusion++;
        solusion = solver.solve(10, function, solusion);
        res.add(solusion);
        System.out.println(res);
    }
}

运行结果

代码语言:javascript
复制
6 - 5 x + x^2
[2.0000000000000004, 2.9999999999999996]

不过这种也有局限性,需要我们在实际使用中根据你的结果来调整。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档