123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- import numpy as np
- from sklearn.model_selection import train_test_split
- from sklearn.ensemble import RandomForestRegressor
- from sklearn.metrics import mean_squared_error
- from scipy.optimize import minimize
- from flask import Flask, request, jsonify
- app = Flask(__name__)
- # 解冻时间计算函数
- def calculate_defrost_time(w, data):
- # 物理参数1
- rho_ice = data['rho_ice'] # 冰的密度
- C_ice = data['C_ice'] # 冰的比热容
- L = data['L'] # 冰的潜热
- k_ice = data['k_coal'] # 冰的导热系数
- T_m = data['T_m'] # 熔点温度(摄氏度)
- rho_coal = data['rho_coal'] # 物料的密度
- C_coal = data['C_coal'] # 物料的比热容
- k_coal = data['k_coal'] # 物料的导热系数
- h = data['h'] # 对流换热系数
- T_air = data['T_air'] # 空气温度(摄氏度)
- T_initial = data['T_initial'] # 物料初始温度
- a, b, c = data['a'], data['b'], data['c'] # 车厢的尺寸(长、宽、高)
- # 计算体积和表面积
- V = a * b * c
- A = 2 * (a * b) + 2 * (b * c) + 2 * (a * c)
- # 计算混合密度
- rho_mix = (1 - w) * rho_coal + w * rho_ice
- # 计算混合比热容
- C_mix = (1 - w) * C_coal + w * C_ice
- # 计算特征长度
- L_char = V / A
- # 计算体积分数
- phi = (w * rho_coal) / rho_ice
- # 计算有效导热系数
- k_eff = (k_coal * (2 * k_coal + k_ice - 2 * phi * (k_coal - k_ice)) /
- (2 * k_coal + k_ice + phi * (k_coal - k_ice))) + 1.1
- # 初步解冻时间 t1(小时)
- t1 = ((0.2 * rho_mix * C_mix * L_char ** 2) / k_eff *
- ((T_m - T_initial) / (T_air - T_initial))) / 3600
- # 进一步解冻时间 t2(小时)
- k_char = h # 近似处理 k_char
- t2 = ((rho_mix * w * L * L_char * L_char / (k_eff * (T_air - T_m))) *
- ((0.5 + k_eff / (k_char * L_char)) / 6)) / 3600
- # 总解冻时间
- t_total = t1 + t2
- return t_total
- def calculate_jt_time(w, data):
- # 提取参数
- m_ice = data.get("m_coal") * w # 冰的质量 (kg)
- c_ice = data.get("C_ice") # 冰的比热容 (J/kg·K)
- delta_T_initial = data.get("delta_T_initial") # 初始温差 (K)
- L = data.get("L") # 冰的熔化潜热 (J/kg)
- m_coke = data.get("m_coal") - m_ice # 焦炭质量 (kg)
- c_coke = data.get("C_coal") # 焦炭的比热容 (J/kg·K)
- h = data.get("h") # 对流换热系数 (W/m²·K)
- a, b, c = data['a'], data['b'], data['c'] # 车厢的尺寸(长、宽、高)
- A = 2 * (a * b) + 2 * (b * c) + 2 * (a * c) # 有效传热面积 (m²)
- delta_T_heat = data.get("delta_T_heat") # 热风温差 (K)
- # 计算总热量需求
- Q_ice = m_ice * (c_ice * delta_T_initial + L)
- Q_coke = m_coke * c_coke * delta_T_initial
- Q_total = Q_ice + Q_coke
- # 计算总热传递能力
- Q_transfer = h * A * delta_T_heat
- # 计算时间 (秒)
- t_seconds = Q_total / Q_transfer
- # 转换为小时
- t_hours = t_seconds / 3600
- return t_hours
- # 反推函数
- def reverse_calculate(time, data):
- def objective_function(vars):
- w = vars
- if data.get("meterial_type") == 1:
- calculated_time = calculate_defrost_time(w, data)
- else:
- calculated_time = calculate_jt_time(w, data)
- return abs(calculated_time - time)
- bounds = [(0.1, 0.5)] # 含水量和初始温度的范围
- num_trials = 10 # 尝试的次数
- best_result = None
- best_error = np.inf
- for _ in range(num_trials):
- # 随机生成初始猜测值
- initial_guess = [np.random.uniform(0.1, 0.15)]
- result = minimize(objective_function, initial_guess, bounds=bounds)
- error = result.fun
- if error < best_error:
- best_error = error
- best_result = result
- return best_result.x[0]
- # API 入口
- @app.route('/reverse_calculate', methods=['POST'])
- def handle_request():
- try:
- data = request.get_json()
- qq = data.get("meterial_type");
- print(f"算法区分{qq}")
- time = float(data['realThawTime'])
- w_result = reverse_calculate(time, data)
- print(f"实际用时{time}")
- print(f"含水量{round(w_result * 100, 2)}")
- return jsonify({
- "water_content": round(w_result * 100, 2)
- })
- except Exception as e:
- return jsonify({"error": str(e)}), 400
- if __name__ == '__main__':
- app.run(host='127.0.0.1', port=9993, debug=True)
|