//Benedict-Webb-Rubin (BWR) denklemi ile azot gazı için verilen koşullarda P,T,v değerlerinin hesaplanması :
// Program 3 kısma bölünerek hazırlanmıştır.
// herhangi iki değer verildiğinde 3. değer aranağı için bulunmak istenen değer yerine sıfır girilmelidir.

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


public class vizesorusu3
{

public static double f(double p ,double v, double t)
{	
	
//Çengel Y:"Heat Transfer A Practical Approach" Appendix 1 ,Table A-1 verilerine göre azot gazı için R=0.2968 kJ/kgK alınmıştır.
	
return (0.2968*t/v)+((0.2968*t*0.0458)-1.1925-(0.0058891/(t*t)))/(v*v)+((0.2968*t*0.001981554)+0.01490)/(v*v*v)+(0.01490*0.291545/(v*v*v*v*v*v))+((0.000548064/(v*v*v)*(t*t))*(1+(0.75/(v*v)))*Math.log(0.75/(v*v)));
}
//sıcaklık değerini hesaplayan program kısmı :
public static double ridderT(double x1,double x2,double p ,double v)
{
  
	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,p,v);
	fh=f(x2,p,v);
    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,p,v);
		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; 
}
//özgül hacim değerini hesaplayan program kısmı:
public static double ridderV(double x1,double x2,double t ,double p)
{
  
	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,p,t);
	fh=f(x2,p,t);
    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,t,p);
		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; 
}
//basınç değerini hesaplayan program kısmı :
public static double ridderP(double x1,double x2,double t ,double v)
{
  
	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,t,v);
	fh=f(x2,t,v);
    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,t,v);
		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;
     double p=0;
     double t=0;
     double v=0;
     
     p=Double.parseDouble(JOptionPane.showInputDialog("P"));
     t=Double.parseDouble(JOptionPane.showInputDialog("T"));
     v=Double.parseDouble(JOptionPane.showInputDialog("v"));
     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;
     
   if (p==0){
     r= ridderP(a,b,t,v);
     JOptionPane.showMessageDialog(null," kök değeri  : "+r+"\nFonksiyon değeri : "+f(r,t,v),
     "Ridder yöntemiyle kök hesabı : ",JOptionPane.PLAIN_MESSAGE);
     System.exit(0);
     } 
   
     if (v==0){
     r= ridderP(a,b,t,p);
     JOptionPane.showMessageDialog(null," kök değeri  : "+r+"\nFonksiyon değeri : "+f(r,t,p),
     "Ridder yöntemiyle kök hesabı : ",JOptionPane.PLAIN_MESSAGE);
     System.exit(0);
     } 
       
   if (t==0){
     r= ridderP(a,b,p,v);
     JOptionPane.showMessageDialog(null," kök değeri  : "+r+"\nFonksiyon değeri : "+f(r,p,v),
     "Ridder yöntemiyle kök hesabı : ",JOptionPane.PLAIN_MESSAGE);
     System.exit(0);
     }   
}
}
// BWR denkleminde bulunan sonuçlar ideal gaz denklemi ile bulunan değerlerden daha doğru yaklaşımlar vermektedir.
//Çünkü ideal gaz varsayımı ile yapılan hesaplamalarda yapılan kabullerde gazların gerçek davranışlarındaki bazı durumlar ihmal edilmektedir.