|
@@ -0,0 +1,112 @@
|
|
|
+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("输入无效,请输入有效的数字。")
|
|
|
+
|
|
|
+
|