import java.io.*;
import javax.swing.*;
import javax.tools.*;
import java.util.*;
import java.lang.Integer;
import java.awt.*;
import java.awt.event.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.awt.image.*;
import javax.swing.*;
import java.util.Locale;
import java.text.*;
import java.util.*;
import javax.swing.table.*;

class ce13 
{ 	 	
	 public ce13(double x1,double x2,String s) 
	 {     
        double a[]={x1,x2};
        double r;
        r= newton_bisection(new fa(),a[0],a[1]);
        JOptionPane.showMessageDialog(null," kök değeri  : "+r,
        "f(x) = "+s,JOptionPane.PLAIN_MESSAGE);
     }

public static double dfx(f_x f,double x,double h)
{ //Türev hesabı
  double hh=1.0/h; 
  return (-f.func(x+2.0*h)+8.0*f.func(x+h)-8.0*f.func(x-h)+f.func(x-2.0*h))/12.0*hh;
}

public static double newton_bisection(f_x fx, double x1, double x2)
{
double xacc=1.0e-10; //iterasyonlar arasındaki fark, bu rakamdan 
// küçük olduğunda çözüme ulaştığımızı kabul edeceğiz
double h=0.0001; //türev step büyüklüğü
int MAXIT=100;  //Maksimum iterasyon sayısı
int j;
double dfr,dx,dxold,fr,fh,fl;
double temp,b,a,r;
fl=fx.func(x1);
fh=fx.func(x2);
//Bölgemizde kök değeri varmı kontrol et
if ((fl > 0.0 && fh > 0.0) || (fl < 0.0 && fh < 0.0))
System.out.println("verilen sınırlar içinde kök değeri yok");
if (fl == 0.0) return x1;
if (fh == 0.0) return x2;
if (fl < 0.0)   { a=x1;b=x2;} 
else            { b=x1;a=x2;}
r=0.5*(x1+x2); //orta nokta değeri 
dxold=Math.abs(x2-x1); 
dx=dxold; 
fr=fx.func(r);   //fonksiyonun r noktasındaki değeri
dfr=dfx(fx,r,h); //fonksiyonun türevinin r noktasındaki değeri
for (j=1;j<=MAXIT;j++) 
{ 
if ((((r-b)*dfr-fr)*((r-a)*dfr-fr) > 0.0) || (Math.abs(2.0*fr) > Math.abs(dxold*dfr))) 
    { //ikiye bölme 
	  dxold=dx;
      dx=0.5*(b-a);
      r=a+dx;
      if (a == r) return r; //çözüm!!!!
    } 
else{ //Newton-Raphson
	  dxold=dx;
      dx=fr/dfr;
      temp=r;
      r -= dx;
      if (temp == r) return r;  //çözüm!!!!!
    }
if (Math.abs(dx) < xacc) return r; //çözüm!!!!!
fr=fx.func(r);
dfr=dfx(fx,r,h);
if (fr < 0.0) 
a=r;
else
b=r;
}
System.out.println("Maksimum iterasyon sayısı aşıldı");
return 0.0; //program buraya gelmemeli 
}

public static double ikiyebolme(f_x f,double a,double b)
{
//ikiye bölme yöntemi a ile b arsında kök değerini 
// her seferinde sayıyı ikiye bölerek arar.
double test;
double p=0;
double es,ea;
double fa,fp;
int maxit=500,iter=0;
es=0.0000001;
ea=1.1*es;
while((ea>es)&&(iter<maxit))
{
    p=(a+b)/2.0;
    iter++;
    if((a+b)!=0)
        { ea=Math.abs((b-a)/(a+b))*100;}
    fa= f.func(a);
    fp= f.func(p);
    test= fa*fp;
    if(test==0.0)      ea=0;
    else if(test<0.0)  b=p;
    else              {a=p;}
} 
if(iter>=maxit) 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 p;
}
	  public static void main(String arg[])
	  { String s1=JOptionPane.showInputDialog(" Fonksiyonu giriniz : ");
		ce1 x0=new ce1(s1);
        double a[]=Text.readDoubleV("Fonksiyonun minimum ve maksimum değerlerini giriniz xmin xmax");
        ce3 x1=new ce3(a[0],a[1],100,x0.s);
        ce2 x2=new ce2(a[0],a[1],x0.s);
	  }
 }
