Advertisement
mirosh111000

Методика комп’ютерного експерименту ЛР№1

Feb 4th, 2024
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.63 KB | None | 0 0
  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import pandas as pd
  4.  
  5. def euler_method_with_delay(T_initial, T_ambient, k, delta_t, num_iterations, cream_effect=0, delay_time=0):
  6.    
  7.     time = [0]
  8.    
  9.     if cream_effect != 0 and delay_time == 0:
  10.         temperature = [T_initial - cream_effect]
  11.     else:
  12.         temperature = [T_initial]
  13.    
  14.     relaxation_time = None
  15.  
  16.     for i in range(1, num_iterations + 1):
  17.         if (i * delta_t == delay_time) and cream_effect != 0:
  18.             temperature[-1] -= cream_effect
  19.        
  20.         if i * delta_t >= delay_time and delay_time != 0:
  21.            
  22.             dT_dt = -k * (temperature[-1] - T_ambient)
  23.             temp = (temperature[-1] + dT_dt * delta_t)
  24.  
  25.         else:
  26.             dT_dt = -k * (temperature[-1] - T_ambient)
  27.             temp = (temperature[-1] + dT_dt * delta_t)
  28.            
  29.         temperature.append(temp)
  30.         time.append(i * delta_t)
  31.        
  32.         if relaxation_time is None and abs(temp - T_ambient) <= abs(T_initial - T_ambient) * 0.37:
  33.  
  34.             relaxation_time = i * delta_t
  35.  
  36.  
  37.     return time, temperature, relaxation_time
  38.  
  39. def exact_solution(T_initial, T_ambient, k, time, cream_effect=0):
  40.     C = T_ambient + (T_initial - T_ambient - cream_effect) * np.exp(-k * time)
  41.     return C
  42.  
  43. # Початкові умови
  44. T_initial = 83
  45. T_ambient = 18  
  46. k = 0.039  
  47.  
  48. dt = 0.01
  49. dt_values = [1, 0.1, 0.01, 0.001, 0.0001]
  50. num_iterations = 30
  51.  
  52. cream_effect = 5
  53.  
  54. plt.figure(figsize=(10, 6))
  55. plt.xlabel('Час, хв')
  56. plt.ylabel('Температура, градуси')
  57. plt.title('Охолодження кави з різними значеннями k та ефектом вершків')
  58. plt.grid()
  59.  
  60. num_iterations_dt = int(30 / dt)  
  61. time_euler, temperature_euler, _ = euler_method_with_delay(T_initial, T_ambient, k, dt, num_iterations_dt)
  62. time_exact = np.arange(0, (num_iterations_dt + 1) * dt, dt)
  63. temperature_exact = exact_solution(T_initial, T_ambient, k, time_exact)
  64.  
  65. plt.plot(time_euler, np.array(temperature_euler), label='Без вершків')
  66. plt.plot(time_euler, np.array(temperature_exact), linestyle='--', label='Точне рішення без вершків')
  67.  
  68. time_cream, temperature_cream, _ = euler_method_with_delay(T_initial, T_ambient, k, dt, num_iterations_dt, cream_effect)
  69. temperature_exact_cream = exact_solution(T_initial, T_ambient, k, time_exact, cream_effect)
  70. plt.plot(time_exact, np.array(temperature_exact_cream), linestyle='-', label='З вершками')
  71. plt.legend()
  72. plt.show()
  73.  
  74.  
  75. plt.figure(figsize=(10, 6))
  76. plt.xlabel('Час, хв')
  77. plt.ylabel('Абсолютна похибка')
  78. for dt in dt_values:
  79.     num_iterations_dt = int(30 / dt)  
  80.     time_euler, temperature_euler, _ = euler_method_with_delay(T_initial, T_ambient, k, dt, num_iterations_dt)
  81.     time_exact = np.arange(0, (num_iterations_dt + 1) * dt, dt)
  82.     temperature_exact = exact_solution(T_initial, T_ambient, k, time_exact)
  83.     absolute_error = np.abs(np.array(temperature_exact) - np.array(temperature_euler))    
  84.     cutoff_index = find_cutoff_index(time_euler, absolute_error)
  85.  
  86.     start_index = 0
  87.     for i in range(len(time_euler)):
  88.         if time_euler[i] >= 1:
  89.             start_index = i
  90.             break
  91.  
  92.     plt.plot(time_euler[start_index:cutoff_index], absolute_error[start_index:cutoff_index], label=f'dt = {dt}')
  93.  
  94. plt.xlabel('Час, хв')
  95. plt.ylabel('Абсолютна похибка')
  96. plt.title('Графіки абсолютної похибки від часу для різних значень dt')
  97. plt.yscale('log')  
  98. plt.legend()
  99. plt.grid()
  100. plt.show()
  101.  
  102.  
  103.  
  104.  
  105. real_time_values = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
  106. real_temperature_values = np.array([83, 77.7, 75.1, 73, 71.1, 69.4, 67.8, 66.4, 64.7, 63.4, 62.1, 61, 59.9, 58.7, 57.8, 56.6])
  107. temp_df = pd.DataFrame({'Time': real_temperature_values, 'T': real_time_values})
  108.  
  109. T_desired = 50  
  110. k_values = [0.03, 0.038, 0.05]
  111.  
  112.  
  113. time_values = np.arange(0, 30, 1)
  114. temperature_values = []
  115.  
  116.  
  117. for k in k_values:
  118.     temperature = [T_initial]
  119.     for t in range(1, 30):
  120.         dT_dt = -k * (temperature[-1] - T_ambient)
  121.         temperature.append(temperature[-1] + dT_dt)
  122.    
  123.     temperature_values.append(temperature)
  124.  
  125.  
  126. plt.figure(figsize=(10, 6))
  127. for i, k in enumerate(k_values):
  128.     plt.plot(time_values, temperature_values[i], label=f'r = {k}')
  129.  
  130. plt.scatter(real_time_values, real_temperature_values, color='black', marker='s', label='Експеремент')
  131. plt.axhline(y=T_desired, color='r', linestyle='--', label='Комфортна температура')
  132. plt.xlabel('Час, хв')
  133. plt.ylabel('Температура, градуси')
  134. plt.title('Охолодження кави з різними значеннями r')
  135. plt.legend()
  136. plt.grid()
  137. plt.show()
  138.  
  139. delay_time = 3  
  140.  
  141. plt.figure(figsize=(10, 9))
  142. plt.xlabel('Час, хв')
  143. plt.ylabel('Температура, градуси')
  144. plt.title('Охолодження кави', size=24)
  145. plt.grid()
  146.  
  147. num_iterations_dt = int(30 / dt)
  148. time_euler, temperature_euler, _ = euler_method_with_delay(T_initial, T_ambient, k, dt, num_iterations_dt)
  149. plt.plot(time_euler, np.array(temperature_euler), label='Без вершків')
  150.  
  151. temperature_exact_cream = exact_solution(T_initial, T_ambient, k, time_exact, cream_effect)
  152. plt.plot(time_exact, np.array(temperature_exact_cream), linestyle='-', label='З вершками')
  153.  
  154. time_cream, temperature_cream, _ = euler_method_with_delay(T_initial, T_ambient, k, dt, num_iterations_dt, cream_effect=cream_effect, delay_time=delay_time)
  155. plt.plot(time_cream, np.array(temperature_cream), linestyle='--', label=f'З вершками (затримка {delay_time} хв)')
  156.  
  157. time_cup, temperature_cup, _ = euler_method_with_delay(T_initial-10, T_ambient, k, dt, num_iterations_dt)
  158. plt.plot(time_cup, np.array(temperature_cup), linestyle='-', label=f'Товща чашка(кава без вершків)')
  159.  
  160. time_s, temperature_s, _ = euler_method_with_delay(T_initial, 30, k, dt, num_iterations_dt)
  161. plt.plot(time_s, np.array(temperature_s), linestyle='-', label=f'Кава без вершків в літній час')
  162.  
  163.  
  164.  
  165. plt.legend()
  166. plt.show()
  167.  
  168.  
  169.  
  170. T_initial_values = np.linspace(80, 100, 11)  
  171. plt.figure(figsize=(10, 5))
  172. for r in [0.038, 0.05, 0.03]:
  173.     relaxation_times = []
  174.     for T_initial in T_initial_values:
  175.         _, _, relaxation_time = euler_method_with_delay(T_initial, T_ambient, r, dt, num_iterations_dt)
  176.         relaxation_times.append(relaxation_time)
  177.     plt.plot(T_initial_values, relaxation_times, linestyle='-', marker='o', label=f'Час релаксації(r={r})')
  178. plt.xlabel('Початкова температура, градуси')
  179. plt.ylabel('Час релаксації, хв')
  180. plt.title('Залежність часу релаксації від початкової температури')
  181. plt.grid()
  182. plt.legend()
  183. plt.show()
  184.  
  185. T_ambient_values = np.linspace(0, 50, 11)
  186. plt.figure(figsize=(10, 5))
  187. for r in [0.038, 0.05, 0.03]:
  188.     relaxation_times = []
  189.     for T_ambient in T_ambient_values:
  190.         _, _, relaxation_time = euler_method_with_delay(T_initial, T_ambient, r, dt, num_iterations_dt)
  191.         relaxation_times.append(relaxation_time)
  192.     plt.plot(T_ambient_values, relaxation_times, linestyle='-', marker='o', label=f'Час релаксації(r={r})')
  193.  
  194.  
  195. plt.xlabel('Температура навколишнього середовища, градуси')
  196. plt.ylabel('Час релаксації, хв')
  197. plt.title('Залежність часу релаксації від температури навколишнього середовища')
  198. plt.grid()
  199. plt.legend()
  200. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement