⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bisectionrootfinder.java

📁 一个一元曲线多项式数值演示例子
💻 JAVA
字号:
package numbercruncher.mathutils;

/**
 * The root finder class that implements the bisection algorithm.
 */
public class BisectionRootFinder
    extends RootFinder {
  private static final int MAX_ITERS = 50;
  private static final float TOLERANCE = 100 * Epsilon.floatValue();

  /** x-negative value */
  private float xNeg;
  /** x-middle value */
  private float xMid = Float.NaN;
  /** x-positive value */
  private float xPos;
  /** previous x-middle value */
  private float prevXMid;
  /** f(xNeg) */
  private float fNeg;
  /** f(xMid) */
  private float fMid;
  /** f(xPos) */
  private float fPos;

  /**
   * Constructor.
   * @param function the functions whose roots to find
   * @param xMin the initial x-value where the function is negative
   * @param xMax the initial x-value where the function is positive
   * @throws RootFinder.InvalidIntervalException
   */
  public BisectionRootFinder(Function function,
                             float xMin, float xMax) throws RootFinder.
      InvalidIntervalException {
    super(function, MAX_ITERS);
    checkInterval(xMin, xMax);

    float yMin = function.at(xMin);
    float yMax = function.at(xMax);

    // Initialize xNeg, fNeg, xPos, and fPos.
    if (yMin < 0) {
      xNeg = xMin;
      xPos = xMax;
      fNeg = yMin;
      fPos = yMax;
    }
    else {
      xNeg = xMax;
      xPos = xMin;
      fNeg = yMax;
      fPos = yMin;
    }
  }

  //---------//
  // Getters //
  //---------//

  /**
   * Return the current value of x-negative.
   * @return the value
   */
  public float getXNeg() {
    return xNeg;
  }

  /**
   * Return the current value of x-middle.
   * @return the value
   */
  public float getXMid() {
    return xMid;
  }

  /**
   * Return the current value of x-positive.
   * @return the value
   */
  public float getXPos() {
    return xPos;
  }

  /**
   * Return the current value of f(x-negative).
   * @return the value
   */
  public float getFNeg() {
    return fNeg;
  }

  /**
   * Return the current value of f(x-middle).
   * @return the value
   */
  public float getFMid() {
    return fMid;
  }

  /**
   * Return the current value of f(x-positive).
   * @return the value
   */
  public float getFPos() {
    return fPos;
  }

  //-----------------------------//
  // RootFinder method overrides //
  //-----------------------------//

  /**
   * Do the bisection iteration procedure.
   * @param n the iteration count
   */
  protected void doIterationProcedure(int n) {
    if (n == 1) {
      return; // already initialized
    }

    if (fMid < 0) {
      xNeg = xMid; // the root is in the xPos half
      fNeg = fMid;
    }
    else {
      xPos = xMid; // the root is in the xNeg half
      fPos = fMid;
    }
  }

  /**
   * Compute the next position of xMid.
   */
  protected void computeNextPosition() {
    prevXMid = xMid;
    xMid = (xNeg + xPos) / 2;
    fMid = function.at(xMid);
  }

  /**
   * Check the position of xMid.
   * @throws PositionUnchangedException
   */
  protected void checkPosition() throws RootFinder.PositionUnchangedException {
    if (xMid == prevXMid) {
      throw new RootFinder.PositionUnchangedException();
    }
  }

  /**
   * Indicate whether or not the algorithm has converged.
   * @return true if converged, else false
   */
  protected boolean hasConverged() {
    return Math.abs(fMid) < TOLERANCE;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -