package com.zhp.fist;
/**
* 区间二分法和试位法的实验
*
* @author 郑海鹏
* @since 2014/09/24 13:09
*/
public class One {
final static double scale = 0.000000001;// 计算精度
public static void main(String[] args) {
double leftX = 1.0;
double rightX = 1.5;
System.out.println("二分法的结果为:" + ErFen(leftX, rightX));
System.out.println("试位法的结果为:" + ShiWei(leftX, rightX));
}
public static double ErFen(double leftX, double rightX) {
double leftY = getY(leftX);
double rightY = getY(rightX);
double middleX = (leftX + rightX) / 2;
double middleY = getY(middleX);
if (leftX > rightX) {
double temp = leftX;
leftX = rightX;
rightX = temp;
}
if (Math.abs(rightY - leftY) < scale) {
return middleX;
}
if (leftY * middleY <= 0) {
rightX = middleX;
} else {
leftX = middleX;
}
return ErFen(leftX, rightX);
}
public static double ShiWei(double leftX, double rightX) {
double leftY = getY(leftX);
double rightY = getY(rightX);
double intersectionX = getXByLine(leftX, leftY, rightX, rightY);
double intersectionY = getY(intersectionX);
if (Math.abs(intersectionY) <= scale) {
return intersectionX;
}
leftX = intersectionX;
return ShiWei(leftX, rightX);
}
public static double getY(double x) {
return Math.pow(x, 3) - x - 1;
}
public static double getXByLine(double leftX, double leftY, double rightX, double rightY) {
leftY = Math.abs(leftY);
rightY = Math.abs(rightY);
return (rightX * leftY + leftX * rightY) / (leftY + rightY);
}
}