123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- 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
- # 解冻时间计算函数
- def calculate_defrost_time(w, T_initial):
- # 物理参数
- rho_coal = 1400 # 煤的密度
- rho_ice = 917 # 冰的密度
- C_coal = 1000 # 煤的比热容
- C_ice = 2100
- L = 334000 # 物体长度(米)
- k_coal = 0.3 # 煤的导热系数
- k_ice = 2.2
- h = 10 # 近似导热系数(W/m²·K)
- T_air = 20 # 空气温度(摄氏度)
- T_m = 0 # 熔点温度(摄氏度)
- a, b, c = 13, 2.72, 1.6 # 物体的尺寸(长、宽、高)
- # 计算体积和表面积
- 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
- # 模拟生成数据
- np.random.seed(42)
- n_samples = 500
- # 含水量,范围 10% - 15%
- w = np.random.uniform(0.1, 0.15, n_samples)
- # 初始温度,范围 -10 到 20 摄氏度
- T_initial = np.random.uniform(-10, 20, n_samples)
- # 计算解冻时间
- original_times = []
- for i in range(n_samples):
- original_times.append(calculate_defrost_time(w[i], T_initial[i]))
- # 模拟实际作业时长(实际时长和计算时长有一定随机误差)
- y = np.array(original_times) + np.random.normal(0, 0.2, n_samples)
- # 准备特征
- X = np.column_stack((w, T_initial, original_times))
- # 划分训练集和测试集
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
- # 选择模型并训练
- model = RandomForestRegressor(n_estimators=100, random_state=42)
- model.fit(X_train, y_train)
- # 模型评估
- y_pred = model.predict(X_test)
- mse = mean_squared_error(y_test, y_pred)
- print(f"Mean Squared Error: {mse}")
- # 反推函数
- def reverse_calculate(time):
- def objective_function(vars):
- w, T_initial = vars
- calculated_time = calculate_defrost_time(w, T_initial)
- return abs(calculated_time - time)
- bounds = [(0.1, 0.15), (-10, 20)] # 含水量和初始温度的范围
- num_trials = 5 # 尝试的次数
- best_result = None
- best_error = np.inf
- for _ in range(num_trials):
- # 随机生成初始猜测值
- initial_guess = [np.random.uniform(0.1, 0.15), np.random.uniform(-10, 20)]
- 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], best_result.x[1]
- # 输入实际解冻时间
- try:
- test_time = float(input("请输入实际解冻时间(小时): "))
- w_result, T_result = reverse_calculate(test_time)
- print(f"反推得到的含水量: {w_result}")
- print(f"反推得到的初始温度: {T_result}")
- recalculated_time = calculate_defrost_time(w_result, T_result)
- print(f"重新计算的解冻时间: {recalculated_time}")
- except ValueError:
- print("输入无效,请输入有效的数字。")
-
|