Advertisement
Guest User

Ternary Search

a guest
Apr 25th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.24 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std ;
  3.  
  4. double M_a , M_b ,  V_a , V_eq , K_a , K_w , V_m , V_p ;
  5.  
  6. double pH(double V_b)
  7. {
  8.     double beta , b , c , x , E ;
  9.     x = (V_eq+(K_a/M_b)*(V_a+V_eq)) ;
  10.  
  11.     beta = (K_w*K_w*(V_a+V_eq)*(V_a+V_eq))/(2*M_b*M_b*x*x) ;
  12.     beta *= (1 + sqrt(1 + (4*K_a*M_b*x)/(K_w*(V_a+V_eq)))) ;
  13.     beta += (K_a*K_w*(V_a+V_eq))/(M_b*x) ;
  14.     beta = 1/sqrt(beta) ;
  15.  
  16.     x = V_b + (K_a*(V_a+V_b))/M_b ;
  17.     c = -(K_a*K_w*(V_a+V_b))/(M_b*x) ;
  18.     b = (K_a*(V_b - (M_a/M_b)*V_a)) - (K_w/M_b)*(V_a+V_b) ;
  19.     b /= x ;
  20.  
  21.     x = -(b/2) + sqrt(((b*b)/4)-c) ;
  22.     E = ((beta*beta*x*x)-1)/(2*beta*x) ;
  23.  
  24.     double ret = log10(beta) - (asinh(E)*log10(exp(1))) ;
  25.    
  26.     return ret ;
  27. }
  28.  
  29. double err(double u){
  30.     M_a = u ;
  31.     V_eq = (M_a*V_a)/M_b ;
  32.     double mm = (3.1+4.4)/2 ;
  33.     double mp = (8.2+10)/2 ;
  34.     double ret = abs(mm - pH(V_m))+abs(mp-pH(V_p)) ;
  35.     return ret ;
  36. }
  37.  
  38. int main(int argc, char const *argv[])
  39. {
  40.     V_a = 0.05 ;
  41.     M_b = 0.1 ;
  42.     K_a = 1.8 * 1e-5 ;
  43.     K_w = 1e-14 ;
  44.     V_m = 0.02 ;
  45.     V_p = 0.07 ;
  46.  
  47.     //ternary search
  48.     double l = 0 , r = 1 ;
  49.    
  50.     while(r-l > 1e-6){
  51.         double l1 = (l*2+r)/3 ;
  52.         double l2 = (l+2*r)/3 ;
  53.        
  54.        if(err(l1) < err(l2))r = l2 ;
  55.        else l = l1 ;
  56.        
  57.     }
  58.  
  59.     printf("%lf\n" , l) ;
  60.  
  61.     return 0;
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement