///OPtimizasyon
// 
//  
// Newton-Raphson_Aitken yöntemi ile kök bulmak 
//  
//  

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


public class SCO4B
{

public static double f(double x)
{ return Math.log(x*x)-0.7;}

public static double df(double x)
{ return 2.0/x;}
	
public static double newton_aitken(double x)
{
// newton metodu aitken extrapolasyonuyla birlikte	
int nmax=500;
double tolerance=1.0e-10;
double fx,dfx;
double xm1,xm2;
xm1=x;
xm2=x;
int j=0;; 
for(int i=0;i<3;i++)
{  if(i==0) xm2=x;
   else if(i==1) xm1=x;
   fx=f(x);
   dfx=df(x);
   x-=fx/dfx;
   if(Math.abs(fx)<tolerance) { return x;}
}
for(int i=3;i<nmax;i++)
{   x=(xm2*x-xm1*xm1)/(xm2-2.0*xm1+x); //extrapolasyon
    fx=f(x);
    if(Math.abs(fx)<tolerance) { return x;}  
    xm2=xm1;
    xm1=x;    
    dfx=df(x);
    x-=fx/dfx;
    fx=f(x);
    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= newton_aitken(x0);
     JOptionPane.showMessageDialog(null," kök değeri  : "+r+"\nFonksiyon değeri : "+f(r),
     "Newton-Raphson-Aitken ektrapolasyon yöntemiyle kök hesabı : ",JOptionPane.PLAIN_MESSAGE);
     System.exit(0);
     } 
}