反推含水量.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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. from flask import Flask, request, jsonify
  7. app = Flask(__name__)
  8. # 解冻时间计算函数
  9. def calculate_defrost_time(w, data):
  10. # 物理参数1
  11. rho_ice = data['rho_ice'] # 冰的密度
  12. C_ice = data['C_ice'] # 冰的比热容
  13. L = data['L'] # 冰的潜热
  14. k_ice = data['k_coal'] # 冰的导热系数
  15. T_m = data['T_m'] # 熔点温度(摄氏度)
  16. rho_coal = data['rho_coal'] # 物料的密度
  17. C_coal = data['C_coal'] # 物料的比热容
  18. k_coal = data['k_coal'] # 物料的导热系数
  19. h = data['h'] # 对流换热系数
  20. T_air = data['T_air'] # 空气温度(摄氏度)
  21. T_initial = data['T_initial'] # 物料初始温度
  22. a, b, c = data['a'], data['b'], data['c'] # 车厢的尺寸(长、宽、高)
  23. # 计算体积和表面积
  24. V = a * b * c
  25. A = 2 * (a * b) + 2 * (b * c) + 2 * (a * c)
  26. # 计算混合密度
  27. rho_mix = (1 - w) * rho_coal + w * rho_ice
  28. # 计算混合比热容
  29. C_mix = (1 - w) * C_coal + w * C_ice
  30. # 计算特征长度
  31. L_char = V / A
  32. # 计算体积分数
  33. phi = (w * rho_coal) / rho_ice
  34. # 计算有效导热系数
  35. k_eff = (k_coal * (2 * k_coal + k_ice - 2 * phi * (k_coal - k_ice)) /
  36. (2 * k_coal + k_ice + phi * (k_coal - k_ice))) + 1.1
  37. # 初步解冻时间 t1(小时)
  38. t1 = ((0.2 * rho_mix * C_mix * L_char ** 2) / k_eff *
  39. ((T_m - T_initial) / (T_air - T_initial))) / 3600
  40. # 进一步解冻时间 t2(小时)
  41. k_char = h # 近似处理 k_char
  42. t2 = ((rho_mix * w * L * L_char * L_char / (k_eff * (T_air - T_m))) *
  43. ((0.5 + k_eff / (k_char * L_char)) / 6)) / 3600
  44. # 总解冻时间
  45. t_total = t1 + t2
  46. return t_total
  47. def calculate_jt_time(w, data):
  48. # 提取参数
  49. m_ice = data.get("m_coal") * w # 冰的质量 (kg)
  50. c_ice = data.get("C_ice") # 冰的比热容 (J/kg·K)
  51. delta_T_initial = data.get("delta_T_initial") # 初始温差 (K)
  52. L = data.get("L") # 冰的熔化潜热 (J/kg)
  53. m_coke = data.get("m_coal") - m_ice # 焦炭质量 (kg)
  54. c_coke = data.get("C_coal") # 焦炭的比热容 (J/kg·K)
  55. h = data.get("h") # 对流换热系数 (W/m²·K)
  56. a, b, c = data['a'], data['b'], data['c'] # 车厢的尺寸(长、宽、高)
  57. A = 2 * (a * b) + 2 * (b * c) + 2 * (a * c) # 有效传热面积 (m²)
  58. delta_T_heat = data.get("delta_T_heat") # 热风温差 (K)
  59. # 计算总热量需求
  60. Q_ice = m_ice * (c_ice * delta_T_initial + L)
  61. Q_coke = m_coke * c_coke * delta_T_initial
  62. Q_total = Q_ice + Q_coke
  63. # 计算总热传递能力
  64. Q_transfer = h * A * delta_T_heat
  65. # 计算时间 (秒)
  66. t_seconds = Q_total / Q_transfer
  67. # 转换为小时
  68. t_hours = t_seconds / 3600
  69. return t_hours
  70. # 反推函数
  71. def reverse_calculate(time, data):
  72. def objective_function(vars):
  73. w = vars
  74. if data.get("meterial_type") == 1:
  75. calculated_time = calculate_defrost_time(w, data)
  76. else:
  77. calculated_time = calculate_jt_time(w, data)
  78. return abs(calculated_time - time)
  79. bounds = [(0.1, 0.5)] # 含水量和初始温度的范围
  80. num_trials = 10 # 尝试的次数
  81. best_result = None
  82. best_error = np.inf
  83. for _ in range(num_trials):
  84. # 随机生成初始猜测值
  85. initial_guess = [np.random.uniform(0.1, 0.15)]
  86. result = minimize(objective_function, initial_guess, bounds=bounds)
  87. error = result.fun
  88. if error < best_error:
  89. best_error = error
  90. best_result = result
  91. return best_result.x[0]
  92. # API 入口
  93. @app.route('/reverse_calculate', methods=['POST'])
  94. def handle_request():
  95. try:
  96. data = request.get_json()
  97. qq = data.get("meterial_type");
  98. print(f"算法区分{qq}")
  99. time = float(data['realThawTime'])
  100. w_result = reverse_calculate(time, data)
  101. print(f"实际用时{time}")
  102. print(f"含水量{round(w_result * 100, 2)}")
  103. return jsonify({
  104. "water_content": round(w_result * 100, 2)
  105. })
  106. except Exception as e:
  107. return jsonify({"error": str(e)}), 400
  108. if __name__ == '__main__':
  109. app.run(host='127.0.0.1', port=9993, debug=True)