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;}