/*
 */

// Project 1.3 by Stephanie Morris
//    Newton.java
//    Uses Newton-Raphson method to find zero of f(x)
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;

public class Newton extends Applet implements Runnable
{
    Thread thr = new Thread(this) ;             // new Thread
    Tracer tr = new Tracer("Newton-Raphson") ;  // new instance of Tracer
   
    double r, x, xi, newx, delta, result ;     // some variables we need
    int ypos;

    public void init()                  //    set up Tracer
    {
        thr.start() ;
    }

    public void run ()
    {
        while (true) {
                r = tr.trace("r value:", r) ; // get trial x value
                xi = tr.trace("Trial x value:", xi) ; // get trial x value
 // showStatus("r= "+r);
                repaint();
        }               
    }

    public void paint(Graphics g)
    {
        ypos = 15;  // starting y position on applet
        g.drawString("r = " + r, 15, ypos);
        ypos += 15; x = xi;
        g.drawString("x = " + x + "     F(x) = " + F(x), 15, ypos);  // draw initial values
        ypos += 15;
        do {
            delta = -F(x)/dFdx(x) ;
            newx = x + delta ;        // Newton-Raphson step
            result = F(newx);
            g.drawString("x = " + newx + "     F(x) = " + result, 15, ypos); // draw results
            x = newx;    // get new estimate for x
            ypos += 15; 
        } while(Math.abs(result) > 0.00000000000000000001) ; // continue until a root is found
    }

    double F (double x )    {
        return x * (r-1) - r*x*x;           //   the function
    }

    double dFdx (double x ) {
        return r - 1 - 2*r*x;        //   the derivative of the function
    }
}