///Bilgisayar programlama II ve Sayısal Çözümleme
// 
//  
// Ridder 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 SCO8
{

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

public static double ridder(double x1,double x2)
{
  // Ridder Metodu ile lineer olmıyan denklemlerin köklerinin bulunması
  //referans : Numerical Recipes in C, second edition, William H. Press, 
  //Saul A. Teukolsky, William T. Vetterling, Brian P. Flannery
  //cambridge university press	
	int MAXIT=30;
    double xacc=1.0e-10;int j;
	double fl,fh,xl,xh,swap,dx,del,ff;
	double rtf=x1;
	fl=f(x1);
	fh=f(x2);
    if (fl*fh > 0.0) JOptionPane.showMessageDialog(null,"Kök sınırları doğru olarak seçilmemiş \n sonuç hatalı olabilir"
	,"KÖK SINIRLARI SEÇİM UYARISI",JOptionPane.WARNING_MESSAGE);
	if (fl < 0.0) {
		xl=x1;
		xh=x2;
	} else {
		xl=x2;
		xh=x1;
		swap=fl;
		fl=fh;
		fh=swap;
	}
	dx=xh-xl;
	for (j=1;j<=MAXIT;j++) {
		rtf=xl+dx*fl/(fl-fh);
		ff=f(rtf);
		if (ff < 0.0) {
			del=xl-rtf;
			xl=rtf;
			fl=ff;
		} else {
			del=xh-rtf;
			xh=rtf;
			fh=ff;
		}
		dx=xh-xl;
		if (Math.abs(del) < xacc || ff == 0.0) return rtf;
	}
	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 rtf; 
}

     public static void main (String args[])  
     { 
     double a,b;
     a=Double.parseDouble(JOptionPane.showInputDialog(" Fonksiyonun alt sınırını giriniz a : "));
     b=Double.parseDouble(JOptionPane.showInputDialog(" Fonksiyonun üst sınırını giriniz b : "));
     double r;
     r= ridder(a,b);
     JOptionPane.showMessageDialog(null," kök değeri  : "+r+"\nFonksiyon değeri : "+f(r),
     "Ridder yöntemiyle kök hesabı : ",JOptionPane.PLAIN_MESSAGE);
     System.exit(0);
     } 
}