//   
// root finding with complex Newton-Raphson method
//  
import java.util.*;
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
import javax.swing.*;

public class SCO4G1
{	
public static complex newton(cf_x f,complex x)
{
int nmax=50;
double tolerance=1.0e-8;
complex fx,dfx;
for(int i=0;i<nmax;i++)
{ fx=f.func(x);
  dfx=f.dfunc(x);
  x=complex.substract(x,complex.divide(fx,dfx));
  if(complex.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 double[] verigir(String s)
     {
     String s1=JOptionPane.showInputDialog(s);        
     StringTokenizer token=new StringTokenizer(s1);
     int n=token.countTokens()-1;
     int m=n+1;
     double a[]=new double[m];
     int j=0;           
     while(token.hasMoreTokens())
     {
     Double ax=new Double(token.nextToken());
     a[j++]=ax.doubleValue();
     }
     return a; 
     }

     public static void main (String args[])  
     {double x0[]=verigir(" Fonksiyon değeri için ilk tahmin (iki değer giriniz) z=(a+bi) : ");
      complex x1=new complex(x0[0],x0[1]);
      cf_x f=x->complex.add(complex.multiply(x,x),-2.0);
      complex r= newton(f,x1);
      //complex ff=f.func(r);
      JOptionPane.showMessageDialog(null," kök değeri  : "+r.toString()+"\nFonksiyon değeri : "+f.func(r).toString()+"\ntürev değeri : "+f.dfunc(r).toString(),
      "Newton-Raphson yöntemiyle kök hesabı : ",JOptionPane.PLAIN_MESSAGE);
      System.exit(0);
     } 
}
