Advertisement
impressive_i

Search x(y) by y(x) bisection

Jan 15th, 2021
671
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.92 KB | None | 0 0
  1. import math
  2.  
  3. # Функция, корень которой будем искать
  4. def f(T, P):
  5.     return 22.82 - 2816.91/T - 3.99*math.log10(T) + 0.0000252*T - math.log10(P * 1000000)
  6.  
  7. '''
  8. Функция бисекции, которая возвращает корень на интервале [T_start ; T_end]
  9. eps - погрешность. P - давление (параметр) для текущего уравнения,
  10. которое нужно решить и найти температуру.
  11. '''
  12. def bisection(T_start, T_end, P):
  13.    
  14.     eps = 0.1 # Погрешность метода
  15.     count = 0 # Количество итераций
  16.     Tm = ( T_start + T_end ) / 2 # Среднее значение на интервале
  17.     # Уменьшаем интервал, пока не достигнем заданной погрешности
  18.     while( math.fabs(f(Tm, P)) >= eps ):
  19.        
  20.         Tm = ( T_start + T_end ) / 2
  21.         # Если значения на концах первой половины интервала имеют разные знаки
  22.         if( f(T_start, P) * f(Tm, P) < 0 ):
  23.             T_end = Tm # то корень в 1-й половине и смещаем правую границу в середину
  24.         else:
  25.             T_start = Tm #иначе корень во 2-й половине, смещаем левую границу в середину
  26.  
  27.         count += 1
  28.        
  29.     return round(( T_start + T_end ) / 2, 2)
  30.  
  31.  
  32. # Табуляция, нахождения обратных значений x = g(y)
  33. def table_solution(P_start, P_end):
  34.     T_start = 273
  35.     T_end = 1000
  36.    
  37.     dP = 0.1
  38.     P = P_start
  39.     while(P <= P_end):
  40.         T = bisection(T_start, T_end, P)
  41.         print('Давление P = ', round(P, 2), 'МПа -> Температура T = ', T,'K' )
  42.         P = P + dP
  43.  
  44. #Вызов функции
  45. table_solution(0.8, 1.5)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement