newtonsrootfinder.java~1~

来自「一个一元曲线多项式数值演示例子」· JAVA~1~ 代码 · 共 121 行

JAVA~1~
121
字号
package numbercruncher.mathutils;/** * The root finder class that implements Newton's algorithm. */public class NewtonsRootFinder extends RootFinder{    private static final int   MAX_ITERS = 50;    private static final float TOLERANCE = 100*Epsilon.floatValue();    /** x[n] value */             private float xn;    /** x[n+1] value */           private float xnp1;    /** previous x[n+1] value */  private float prevXnp1;    /** f(x[n]) */                private float fn;    /** f(x[n+1]) */              private float fnp1;    /** f'(x[n]) */               private float fpn;    /**     * Constructor.     * @param function the functions whose roots to find     */    public NewtonsRootFinder(Function function)    {        super(function, MAX_ITERS);    }    /**     * Reset.     * @param x0 the initial x-value     */    public void reset(float x0)    {        super.reset();        xnp1 = x0;        fnp1 = function.at(xnp1);    }    //---------//    // Getters //    //---------//    /**     * Return the current value of x[n].     * @return the value     */    public float getXn() { return xn; }    /**     * Return the current value of x[n+1].     * @return the value     */    public float getXnp1() { return xnp1; }    /**     * Return the current value of f(x[n]).     * @return the value     */    public float getFn() { return fn; }    /**     * Return the current value of f(x[n+1]).     * @return the value     */    public float getFnp1() { return fnp1; }    /**     * Return the current value of f'(x[n]).     * @return the value     */    public float getFpn() { return fpn; }    //-----------------------------//    // RootFinder method overrides //    //-----------------------------//    /**     * Do Newton's iteration procedure.     * @param n the iteration count     */    protected void doIterationProcedure(int n)    {        xn = xnp1;    }    /**     * Compute the next position of x[n+1].     */    protected void computeNextPosition()    {        fn  = fnp1;        fpn = function.derivativeAt(xn);        // Compute the value of x[n+1].        prevXnp1 = xnp1;        xnp1     = xn - fn/fpn;        fnp1 = function.at(xnp1);    }    /**     * Check the position of x[n+1].     * @throws PositionUnchangedException     */    protected void checkPosition()        throws RootFinder.PositionUnchangedException    {        if (xnp1 == prevXnp1) {            throw new RootFinder.PositionUnchangedException();        }    }    /**     * Indicate whether or not the algorithm has converged.     * @return true if converged, else false     */    protected boolean hasConverged()    {        return Math.abs(fnp1) < TOLERANCE;    }}

⌨️ 快捷键说明

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