// Newton metodu ile optimizasyon
// 
import java.util.*;
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
import javax.swing.*;

class f1 extends f_xj
{
public double func(double x[]) 
{
//çözümü istenen fonksiyon	
double ff;
ff=3.0*x[0]*x[0]-4.0*x[0]*x[1]+2.0*x[1]*x[1]-x[0]-x[1];
return ff; //minimum değer
}
}

class f2 extends fi_xi
{
public double[] func(double x[]) 
{
//çözümü istenen fonksiyon	
double ff[]=new double[2];
ff[0]=6.0*x[0]-4.0*x[1]-1.0;
ff[1]=4.0*x[1]-4.0*x[0]-1.0;
return ff; //minimum değer
}
}

class f3 extends fij_xi
{
public double[][] func(double x[]) 
{
//çözümü istenen fonksiyon	
double ff[][]={{6.0,-4.0},{-4.0,4.0}};
return ff; //minimum değer
}
}


public class OPO6B
{
public static double[] newton( f_xj f,fi_xi df,fij_xi d2f,double x[])
{
// lineer olmıyan denklem siteminin kökleri
// fj(xi)=0 lineer olmıyan denklem sistemi için çözüm matrisi 
// Newton-Raphson metodu ile lineer olmıyan denklem sistemi çözümü 
double ti=1.0;
int i,ii,jj;
int nmax=500;
double tolerance=1.0e-10;
int n=x.length;
double b[];
b=new double[n];
i=0;
for(i=0;i<n;i++)
{b[i]=1.0;}
while( i++ < nmax && Matrix.abs(b) > tolerance )
{
    b=Matrix.multiply(Matrix.divide(df.func(x),d2f.func(x)),-ti);
    x=Matrix.add(x,b);
}
if(i >= nmax) 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[])  
     {  
	 String s="kök tahmin değerlerini arada bir boşluk bırakarak giriniz: ";
     double [] x0=verigir(s);
     f1 f=new f1();
     f2 df=new f2();
     f3 d2f=new f3();
     double [] r1= newton(f,df,d2f,x0);
     s=" çözüm seti  : \n"+Matrix.toStringT(r1);
     String s2="Newton metodu ile lineer olmıyan çok değişkenli fonksiyon optimizasyonu:";
     JOptionPane.showMessageDialog(null,s,s2,JOptionPane.PLAIN_MESSAGE);
     System.exit(0);
     } 
}