/*
 * "Grundkurs Programmieren in Java (7. Auflage, 2014)"
 * 2003-2014, Carl Hanser Verlag
 * Loesungsvorschlag zu Aufgabe 12.8 (Version 2.0)
 * (c) 2003-2014 D. Ratz, J. Scheffler, D. Seese, J. Wiesenberger
 *
 */

import java.math.*;
import Prog1Tools.IOTools;
public class BigNewton2 {
  public static BigDecimal drei  = new BigDecimal("3");
  public static BigDecimal vier  = new BigDecimal("4");
  public static BigDecimal sechs = new BigDecimal("6");
  public static BigDecimal zehn  = new BigDecimal("10");

  public static BigDecimal f (BigDecimal x) {       // berechnet f(x)
    BigDecimal xh2 = x.multiply(x);
    return xh2.multiply(xh2).subtract(drei.multiply(xh2)).subtract(zehn);
  }

  public static BigDecimal fstrich (BigDecimal x) { // berechnet f'(x)
    BigDecimal xh2 = x.multiply(x);
    return  vier.multiply(x).multiply(xh2).subtract(sechs.multiply(x));
  }

  public static void main (String[] args) {
    System.out.println("Newton-Verfahren fuer x^4-3x^2-10");
    
    String start = IOTools.readString("Startwert fuer Iteration: ");
    int stellen = IOTools.readInteger("Gewuenschte Stellenzahl: ");

    BigDecimal xAlt, xNeu = new BigDecimal(start);
    BigDecimal fx, fsx;
    int runden = BigDecimal.ROUND_HALF_DOWN;
    int k = 0;
    System.out.println("x = " + xNeu);
    do {                                            // Newton-Iteration
      k    = k+1;
      xAlt = xNeu;
      fx   = f(xAlt);
      fsx  = fstrich(xAlt);
      xNeu = xAlt.subtract(fx.divide(fsx,stellen,runden));
      System.out.println("x = " + xNeu);
    } while (!(xNeu.compareTo(xAlt) == 0) && (k < 100));
  }
}
