///Bilgisayar programlama II ve Sayısal Çözümleme
// Muller yöntemi ile kök bulma


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


public class SCO2
{
public static double f(double t)
{return 12*(1-Math.exp(-0.04*t))+5*Math.exp(-0.04*t)-6.035;}

public static double muller(double xr,double h)
{
//Müller yöntemi ile kök bulma (gerçek kökler)
//orta xr noktasından +/- h kadar giderek diğer 2 noktaya ulaşıyoruz.
int maxit=50;
double x2=xr;
double x1=xr*(1+h);
double x0=xr*(1-h);
int iter=0;
double es1=0.001;
double es=es1;
double ea=1.1*es;
double h0,h1;
double d0,d1;
double a,b,c;
double fx0,fx1,fx2;
double determinant;
double den;
double dxr;
while(iter<maxit && ea>es)
{
    fx0=f(x0);
    fx1=f(x1);
    fx2=f(x2);
    h0=x1-x0;
    h1=x2-x1;
    d0=(fx1-fx0)/h0;
    d1=(fx2-fx1)/h1;
    a=(d1-d0)/(h1+h0);
    b=a*h1+d1;
    c=fx2;
    determinant=b*b-4.0*a*c;
    if(determinant<=0) determinant=0;//we do not want to calculate complex roots here
    else determinant=Math.sqrt(determinant);
    if(Math.abs(b+determinant)>Math.abs(b-determinant)) {den=b+determinant;;}
    else {den=b-determinant;}
    dxr=-2*c/den;
    xr=x2+dxr;
    ea=Math.abs((xr-x2)/xr)*100;
    iter++;
    x0=x1;
    x1=x2;
    x2=xr;
} 
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 xr;
}

     public static void main (String args[])  
     {   
     double xr,h;
     xr=Double.parseDouble(JOptionPane.showInputDialog(" kök tahmini xr : "));
     h=0.1;
     double r;
     r= muller(xr,h);
     JOptionPane.showMessageDialog(null," kök değeri  : "+r+"\nFonksiyon değeri : "+f(r),
     "müller yöntemiyle kök hesabı : ",JOptionPane.PLAIN_MESSAGE);
     System.exit(0);

     } 
}