当前位置: 首页 > news >正文

java 求解 一元三次次方程

这里是使用牛顿迭代公式,因为牛顿迭代公式一次只能求一个根,因此需要设置不同的初始值来求出三个根

大体思路如下:

1.求ax^3+bx^2+cx+d 的两个顶点, 两个顶点一定在三个根的空隙间如下图

        x1-------top1------x2-----top2------x3

2. 我们规定 a>0 ,不考虑a<0 的情况,(如果小于0 左右同时乘-1)

3.求出两个顶点的ax^3+bx^2+cx +d的值为y1 和 y2.(y1 > y2)

4.如果y1 > 0 并且 y2 < 0  则方程有三个解

   如果 0 等于y1 或者 y2 则有两个解

   否则只有一个解

    public static void main(String[] args) {//ax^2+bx+c=0double a = 1000;double b = 90;double c = 10;double d = 20;List<Double> result = solveEquations3(a, b, c, d);double x = result.get(0);System.out.printf("%.4f%n", a *x * x * x + b * x * x + c * x + d);}public static List<Double> solveEquations3(double a, double b, double c, double d) {//ax^3+bx^2+cx+d=0// 3ax^2 + 2bx + c = 0为ax^3+bx^2+cx+d的顶点List<Double> result = new ArrayList<>();List<Double> result2 = solveEquations2(3*a, 2*b, c);//一个根double x;double x1 = 0;if (result2.isEmpty()) {do {x = x1;x1 = x - (a *x * x * x + b * x * x + c * x + d) / (3 * a * x * x + 2 * b * x + c);} while (!(Math.abs(x1 - x) < 0.0000000000001));result.add(x1);return result;}double topX1 = result2.get(0);double topX2 = result2.get(1);x1 = topX1 - 5;;double x2 = (topX1 + topX2) /2;double x3 = topX2 + 5;;double value1 = a * topX1 * topX1 * topX1 + b * topX1 * topX1 + c * topX1 + d;double value2 = a * topX2 * topX2 * topX2 + b * topX2 * topX2 + c * topX2 + d;//三个解,可能存在同根,这里就不细分了if (value1 >= 0 && value2 <= 0) {do {x = x1;x1 =  x - (a *x * x * x + b * x * x + c * x + d) / (3 * a * x * x + 2 * b * x + c);} while (!(Math.abs(x1 - x) < 0.0000000000001));do {x = x2;x2 = x - (a *x * x * x + b * x * x + c * x + d) / (3 * a * x * x + 2 * b * x + c);} while (!(Math.abs(x2 - x) < 0.0000000000001));do {x = x3;x3 = x - (a *x * x * x + b * x * x + c * x + d) / (3 * a * x * x + 2 * b * x + c);} while (!(Math.abs(x3 - x) < 0.0000000000001));result.add(x3);result.add(x1);result.add(x2);return result;}//一个根if (value1 >= 0 && value2 >= 0) {do {x = x1;x1 = x - (a *x * x * x + b * x * x + c * x + d) / (3 * a * x * x + 2 * b * x + c);} while (!(Math.abs(x1 - x) < 0.0000000000001));result.add(x1);} else  {do {x = x3;x3 = x - (a *x * x * x + b * x * x + c * x + d) / (3 * a * x * x + 2 * b * x + c);} while (!(Math.abs(x3 - x) < 0.0000000000001));result.add(x3);}return result;}public static List<Double> solveEquations2(double a, double b, double c) {// (2 * a * x + b) = 0 为ax^2+bx+c=0 的顶点  x = -b/2aList<Double> result = new ArrayList<>();double topX = -b/(2*a);double x;double v = b * b - 4 * a * c;if (v < 0) {return result;}if (v == 0) {result.add(topX);return result;}double x1 = topX - 5;double x2 = topX + 5;;do {x = x1;x1 = x - (a * x * x + b * x + c) / (2 * a * x + b);} while (!(Math.abs(x1 - x) < 0.0000000000001));do {x = x2;x2 = x - (a * x * x + b * x + c) / (2 * a * x + b);} while (!(Math.abs(x2 - x) < 0.0000000000001));result.add(x1);result.add(x2);return result;}


http://www.mrgr.cn/news/26235.html

相关文章:

  • [Java后端面经]-自用牛客大中小厂一面二面三面实习or正式批-
  • 食品分类2检测系统源码分享
  • 【物联网】时序数据库InfluxDB解析及1.x版本与2.x版本区别详解
  • gcc 与 g++ 区别
  • 云曦2024秋季开学考复现(部分)
  • apache文件共享和访问控制
  • Linux驱动.之platform平台总线驱动框架(二),正点原子
  • 组件上的v-model(数据传递),props验证,自定义事件,计算属性
  • 从用户数据到区块链:Facebook如何利用去中心化技术
  • 分布式事务学习笔记(一)分布式事务问题、CAP定理、BASE理论、Seata
  • JavaScript知识点2
  • C语言基础:条件语句与分支控制实例解析
  • js 笔记
  • 面试真题 | web自动化关闭浏览器,quit()和close()的区别
  • leetcode 每日一题
  • deepin 25 版本规划
  • 精选推荐!分享6款论文写作ai免费带附加文献
  • 【QT】系统-上
  • FL studio1——手把手教你写歌,从作曲到发布一条龙服务
  • day48