// 
//  
// ikinci türev düzeltmeli Newton-Raphson yöntemi 
//  
//  
//  

import java.util.*;
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
import javax.swing.*;


public class SCO4C1
{
public static double f(double x)
{ return x*x*x+3.6*x-36.4;}
	
public static double newton1(double x)
{
int nmax=500;
double h=1.0e-3;
double hh=1.0/h;
double tolerance=1.0e-8;
double fx,dfx,fxm,dfxm,d2fx;

for(int i=0;i<nmax;i++)
{  fx=f(x);
   fxm=f(x-h);
   dfx=(-f(x+2.0*h)+8.0*f(x+h)-8.0*f(x-h)+f(x-2.0*h))/12.0*hh;
   d2fx=(-f(x+2.0*h)+16.0*f(x+h)-30.0*f(x)+16.0*f(x-h)-f(x-2.0*h))/(12.0)*hh*hh;
   x-=fx*dfx/(dfx*dfx-fx*d2fx);
  if(Math.abs(fx)<tolerance) { return x;}
}
JOptionPane.showMessageDialog(null,"Uyarı maximum iterasyon sayısı aşıldı \n"+
   " çözüm geçerli olmıyabilir","MAKSİMUM ITERASYON SAYISI UYARISI",JOptionPane.WARNING_MESSAGE);
return x;
}

     public static void main (String args[])  
     { 
     double x0;
     x0=Double.parseDouble(JOptionPane.showInputDialog(" Fonksiyon değeri için ilk tahmin : "));
     double r= newton1(x0);
     JOptionPane.showMessageDialog(null," kök değeri  : "+r+"\nFonksiyon değeri : "+f(r),
     "ikinci türev düzeltmeli Newton-Raphson yöntemiyle kök hesabı : ",JOptionPane.PLAIN_MESSAGE);
     System.exit(0);
     } 
}