/// Sin.DiodeVol.java
// RM0/1 gr. stud. Tomas Venclovas
//Si programa skirta diodo VACH koeficientu nustatymui 
//naudojamasi "atvirkstine" VACH
//Diodo VACH yra aprasoma formule, kurioje yra trys nezinomi koeficientai
//Optimizavimas vykdomas pagal
//kvadratine reiksme. 
// Failas konvertuotas is fi.c, skirto diodo VACH
//skaiciavimui su C kalba

package lt.ktu.gmj.tasks;

import lt.ktu.gmj.*;
import lt.ktu.gmj.propertySheet.*;

class DiodeVolDomain extends Domain {
 static final String []dimensions={
  "fi", 	
  "I0",
  "rb"
 };

 public String[] dimensions ()
 { return dimensions; }

 DiodeVolDomain ()
 {
   min[0]=0.1;
   max[0]=10;
   min[1]=0.1; 
   max[1]=100;
   min[2]=1; 
   max[2]=500;

   defaultPoint.x[0]=1;
   defaultPoint.x[1]=50;
   defaultPoint.x[2]=50;
 }

};

public class DiodeVol extends AbstractTask implements TaskWithAnalyzers {
 private DiodeVolDomain domain=new DiodeVolDomain();
 public double multiplier=1;
 public int function=1;

 public void customize (PropertyManager manager)
 {
   manager.add ( new DoubleProperty("Multiplier",
                  new FieldProvider(this, "multiplier"), 0.1, 1000));
 }

 public Domain domain ()
 { return domain; }

 public double f (Point pt)
 {  
   	int i; 		
	double norma = 0;
	double[] Vbe, y, Ic, value;               
        Vbe = new double[4];        
	y = new double[4];
	Ic = new double[4];
	value = new double[4];
		
	Vbe[0] = 0.62; Vbe[1] = 0.7; Vbe[2] = 0.8; Vbe[3] = 0.91;
	Ic[0]=0.0005; Ic[1]=0.008; Ic[2]=0.05; Ic[3]=0.2;
		
	for(i=0;i<4;i++)
	{y[i]=0.025*pt.x[0]* Math.log(Ic[i]/pt.x[1])+Ic[i]*pt.x[2];};
			
	norma=0;
	for(i=0;i<4;i++)
		{value[i]=(y[i]-Vbe[i])*(y[i]-Vbe[i]);
		norma=norma+value[i];}
	norma=norma*multiplier;	
	return norma;
 }

 public Class[] analyzers () throws ClassNotFoundException
 {
   Class spectrumClass=Class.forName("lt.ktu.gmj.analysis.Spectrum");
   return new Class[]{ spectrumClass };
 }

};

