java java中的二分法实现
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/25956198/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Bisection method implementation in java
提问by tofu
I am implementing the bisection method for solving equations in java. I had initially coded the solution for a pre-defined polynomial equation x^3 + 4x^2 - 10. Now I am generalizing the solution for any polynomial which the user inputs.
我正在实现用于在 Java 中求解方程的二分法。我最初为预定义的多项式方程 x^3 + 4x^2 - 10 编写了解决方案。现在我正在推广用户输入的任何多项式的解决方案。
I read the coefficients of corresponding degrees. Now I only need to tweak the f() method so that I can evaluate the f(a) , f(b) and f(c) .
我读了相应度数的系数。现在我只需要调整 f() 方法,以便我可以评估 f(a) 、 f(b) 和 f(c) 。
// BISECTION METHOD IMPLEMENTATION IN JAVA
// This program uses bisection method to solve for x^3 + 4x^2 -10 = 0
package nisarg;
import java.util.Scanner;
public class BetterBisection {
public static void main(String[] args) {
double a, b, c; // a, b and c have the usual meaning
double f_of_a, f_of_b; // f_of_a, f_of_b store values of f(a) and f(b)
// respectively
int highest_degree;
System.out.println("What is the highest degree of your polynomial? ");
Scanner input = new Scanner(System.in);
highest_degree = input.nextInt();
for (int i = highest_degree; i >= 0; i--) {
int coeff_deg_i;
coeff_deg_i = poly_input(i);
// System.out.println(coeff_deg_i);
}
// The following do-while loop keeps asking the user for a and b until
// f(a)f(b) does not become negative
do {
a = input();
b = input();
if (f(a) * f(b) >= 0) {
System.out
.println("Sorry the two numbers are not bracketing the root. Please try again ");
}
} while (f(a) * f(b) >= 0);
f_of_a = f(a);
f_of_b = f(b);
double root = bisectionMethod(f_of_a, f_of_b, a, b);
System.out.println("Root is : " + root);
}
public static double input() { // Reads in the bracketing number i.e a and b
Scanner input = new Scanner(System.in);
System.out.println("Enter a bracketing number");
return (input.nextDouble());
}
public static double f(double num) { // Calculates f(x) given x and returns
// f(x)
final int COEFF_DEG_3 = 1; // Coefficient of x^3
final int COEFF_DEG_2 = 4; // Coefficient of x^2
final int COEFF_DEG_0 = -10; // Coefficient of x^0
return (COEFF_DEG_3 * Math.pow(num, 3) + COEFF_DEG_2 * Math.pow(num, 2) + COEFF_DEG_0
* Math.pow(num, 0));
}
public static double bisectionMethod(double f_of_a, double f_of_b, double a,
double b) { // Does the actual work of evaluating
double c; // the root using the method of bisection.
double f_of_c;
final double TOLERANCE = 0.0001;
while (Math.abs(a - b) > TOLERANCE) {
c = (a + b) / 2;
f_of_c = f(c);
if (f_of_c * f(a) == 0 || f_of_c * f(b) == 0) {
return c;
} else if (f_of_c * f(a) > 0) {
a = c;
} else {
b = c;
}
}
return (a + b) / 2;
}
public static int poly_input(int degree) {
System.out.println("Please enter coefficient for degree " + degree);
Scanner input = new Scanner(System.in);
int coefficient;
coefficient = input.nextInt();
return coefficient;
}
}
回答by Mureinik
You can't use loops to define variables. Either have 12 explicit variables:
您不能使用循环来定义变量。要么有 12 个显式变量:
public class global {
public static int coeff_deg_1;
public static int coeff_deg_2;
public static int coeff_deg_3;
// and so on...
}
Or define a single array with 12 elements:
或者定义一个包含 12 个元素的数组:
public class global {
public static final int coeff_degs = new int[12];
}
回答by Tu?bars Hepta?k?n
here is a recursive one:
这是一个递归的:
public static double f(double x) {
return (x*x*x)-4*x-10;
}
public static double RecursiveBisection(Function fct, final double left, final double right, final double tolerance) {
double x = 0;
double dx = 0;
if ( Math.abs(right - left) < tolerance ) // base case
return (left + right) / 2;
else { // recursive case
x = (left + right)/2;
System.out.println("Root obtained: " + x);
dx = right - left;
System.out.println("Estimated error: " + dx);
if ( fct.f(left) * fct.f(x) > 0 ) // on same side
return RecursiveBisection (fct, x, right, tolerance);
else // opposite side
return RecursiveBisection(fct, left, x, tolerance);
}
}