参考.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import numpy as np
  2. from sklearn.model_selection import train_test_split
  3. from sklearn.ensemble import RandomForestRegressor
  4. from sklearn.metrics import mean_squared_error
  5. from scipy.optimize import minimize
  6. # 解冻时间计算函数
  7. def calculate_defrost_time(w, T_initial):
  8. # 物理参数
  9. rho_coal = 1400 # 煤的密度
  10. rho_ice = 917 # 冰的密度
  11. C_coal = 1000 # 煤的比热容
  12. C_ice = 2100
  13. L = 334000 # 物体长度(米)
  14. k_coal = 0.3 # 煤的导热系数
  15. k_ice = 2.2
  16. h = 10 # 近似导热系数(W/m²·K)
  17. T_air = 20 # 空气温度(摄氏度)
  18. T_m = 0 # 熔点温度(摄氏度)
  19. a, b, c = 13, 2.72, 1.6 # 物体的尺寸(长、宽、高)
  20. # 计算体积和表面积
  21. V = a * b * c
  22. A = 2 * (a * b) + 2 * (b * c) + 2 * (a * c)
  23. # 计算混合密度
  24. rho_mix = (1 - w) * rho_coal + w * rho_ice
  25. # 计算混合比热容
  26. C_mix = (1 - w) * C_coal + w * C_ice
  27. # 计算特征长度
  28. L_char = V / A
  29. # 计算体积分数
  30. phi = (w * rho_coal) / rho_ice
  31. # 计算有效导热系数
  32. k_eff = (k_coal * (2 * k_coal + k_ice - 2 * phi * (k_coal - k_ice)) /
  33. (2 * k_coal + k_ice + phi * (k_coal - k_ice))) + 1.1
  34. # 初步解冻时间 t1(小时)
  35. t1 = ((0.2 * rho_mix * C_mix * L_char ** 2) / k_eff *
  36. ((T_m - T_initial) / (T_air - T_initial))) / 3600
  37. # 进一步解冻时间 t2(小时)
  38. k_char = h # 近似处理 k_char
  39. t2 = ((rho_mix * w * L * L_char * L_char / (k_eff * (T_air - T_m))) *
  40. ((0.5 + k_eff / (k_char * L_char)) / 6)) / 3600
  41. # 总解冻时间
  42. t_total = t1 + t2
  43. return t_total
  44. # 模拟生成数据
  45. np.random.seed(42)
  46. n_samples = 500
  47. # 含水量,范围 10% - 15%
  48. w = np.random.uniform(0.1, 0.15, n_samples)
  49. # 初始温度,范围 -10 到 20 摄氏度
  50. T_initial = np.random.uniform(-10, 20, n_samples)
  51. # 计算解冻时间
  52. original_times = []
  53. for i in range(n_samples):
  54. original_times.append(calculate_defrost_time(w[i], T_initial[i]))
  55. # 模拟实际作业时长(实际时长和计算时长有一定随机误差)
  56. y = np.array(original_times) + np.random.normal(0, 0.2, n_samples)
  57. # 准备特征
  58. X = np.column_stack((w, T_initial, original_times))
  59. # 划分训练集和测试集
  60. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  61. # 选择模型并训练
  62. model = RandomForestRegressor(n_estimators=100, random_state=42)
  63. model.fit(X_train, y_train)
  64. # 模型评估
  65. y_pred = model.predict(X_test)
  66. mse = mean_squared_error(y_test, y_pred)
  67. print(f"Mean Squared Error: {mse}")
  68. # 反推函数
  69. def reverse_calculate(time):
  70. def objective_function(vars):
  71. w, T_initial = vars
  72. calculated_time = calculate_defrost_time(w, T_initial)
  73. return abs(calculated_time - time)
  74. bounds = [(0.1, 0.15), (-10, 20)] # 含水量和初始温度的范围
  75. num_trials = 5 # 尝试的次数
  76. best_result = None
  77. best_error = np.inf
  78. for _ in range(num_trials):
  79. # 随机生成初始猜测值
  80. initial_guess = [np.random.uniform(0.1, 0.15), np.random.uniform(-10, 20)]
  81. result = minimize(objective_function, initial_guess, bounds=bounds)
  82. error = result.fun
  83. if error < best_error:
  84. best_error = error
  85. best_result = result
  86. return best_result.x[0], best_result.x[1]
  87. # 输入实际解冻时间
  88. try:
  89. test_time = float(input("请输入实际解冻时间(小时): "))
  90. w_result, T_result = reverse_calculate(test_time)
  91. print(f"反推得到的含水量: {w_result}")
  92. print(f"反推得到的初始温度: {T_result}")
  93. recalculated_time = calculate_defrost_time(w_result, T_result)
  94. print(f"重新计算的解冻时间: {recalculated_time}")
  95. except ValueError:
  96. print("输入无效,请输入有效的数字。")