实验1 线性拟合 冷却
  X5zJxoD00Cah 2023年11月12日 31 0


'''目标:拟合物料冷却规律
分类变量:物料规格,冷却方式
连续变量:温度,时间
其他因素:车间温度
现实因素:初始温度,初始时间
需求因素:目标温度的时间,目标温度的时长(时间-初始时间),当前时间的温度
不加入分类变量则为单个线性模型'''

'''实验1 只有温度和时间
每个物料的初始温度和初始时间不一样
无分类变量需转为读热编码'''
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

'''
# 生成数据
temperature = np.array([300, 200, 100, 10])
time = np.array([np.datetime64('2023-01-01 00:00:00'), np.datetime64('2023-01-01 07:00:00'), np.datetime64('2023-01-01 12:00:00'), np.datetime64('2023-01-01 20:00:00')])
time_initial = time[0]
temperature_initial = temperature[0]

# 转为与初始时间和初始温度比较,未做归一化(离差标准化),标准化等处理
# 这样, 所有的线性模型的初始自变量和初始因变量都是0,在第四象限大体呈递减状
# 模型拟合完成后,需要预测时,再分别加上初始时间和初始温度即可
x = time - time_initial
Y = temperature - temperature_initial

# 每个物料都有各自的初始时间和初始温度
# 生成数据,转化数据
# array内部长度不一需指定dtype
# 使用pandas生成面板数据以供筛选
'''

# 生成数据,转化数据
panel_data = pd.DataFrame(
    {
        'material': ['material_1']*3 + ['material_2']*4 + ['material_3']*5,
        'time': 
            [np.datetime64('2023-01-01 00:00:00'), np.datetime64('2023-01-01 07:00:00'), np.datetime64('2023-01-01 18:00:00')] +
            [np.datetime64('2023-01-01 00:00:00'), np.datetime64('2023-01-01 07:00:00'), np.datetime64('2023-01-01 12:00:00'), np.datetime64('2023-01-01 20:00:00')] +
            [np.datetime64('2023-01-01 00:00:00'), np.datetime64('2023-01-01 06:00:00'), np.datetime64('2023-01-01 12:00:00'), np.datetime64('2023-01-01 16:00:00'), np.datetime64('2023-01-01 21:00:00')],
        'temperature': [250, 150, 20] + [300, 200, 100, 10] + [310, 200, 90, 50, 5]
    }
)
panel_data.set_index(['material'], inplace=True)  # 若无这一步,下一步会报错
panel_data['time_initial'] = panel_data.groupby(['material']).apply(lambda x: x['time'][0])
panel_data['temperature_initial'] = panel_data.groupby('material').apply(lambda x: x['temperature'][0])
panel_data['x'] = panel_data['time'] - panel_data['time_initial']
panel_data['Y'] = panel_data['temperature'] - panel_data['temperature_initial']
panel_data.set_index([panel_data.index, 'time_initial', 'temperature_initial', 'time'], inplace=True)

# 汇总拟合
# 分组预测

X = panel_data['x'].dt.total_seconds().values.reshape(-1, 1)
Y = panel_data['Y']
linear_model = LinearRegression()
linear_model.fit(X, Y)
Y_pred = linear_model.predict(X)

plt.scatter(X, Y, label='Linear Regression Actual Data')
plt.plot(X, Y_pred, color='red', label='Linear Regression Prediction')
plt.xlabel('Time Difference')
plt.ylabel('Temperature Difference')
plt.title(f"Linear Regression Prediction Formula: Y_pred = {linear_model.coef_[0]:.4f} * X + {linear_model.intercept_:.4f}")
plt.legend()
plt.show()

实验1 线性拟合 冷却_拟合

'''对照样本与拟合结果'''
panel_data['Y_pred'] = linear_model.predict(X)
panel_data['temperature_pred'] = panel_data['Y_pred'].values + panel_data.reset_index()['temperature_initial'].values

'''预测'''
predict_material = 'material_1'
predict_time = np.datetime64('2023-01-01 17:00:00')
target_temperature = 10

# 目标时间的物料温度
predict_X= np.array((predict_time - panel_data.loc['material_1'].reset_index()['time_initial'][0]).total_seconds()).reshape(-1, 1)
result_temperature = linear_model.predict(predict_X) + panel_data.loc['material_1'].reset_index()['temperature_initial'][0]

# 目标温度的时长和时间
target_Y = target_temperature - panel_data.loc['material_1'].reset_index()['temperature_initial'][0]
result_TimeDuration = pd.Timedelta(seconds = (target_Y - linear_model.intercept_) / linear_model.coef_[0])
result_time = np.array([np.datetime64(result_TimeDuration + panel_data.loc['material_1'].reset_index()['time_initial'][0])])
import numpy as np
import pandas as pd
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
# 指定支持中文的字体,例如SimHei或者Microsoft YaHei
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
# 定义指数衰减模型函数
def exponential_decay(t, T0, k):
    return T0 * np.exp(-k * t)
# 生成模拟数据
np.random.seed(0)
n_samples = 100
time = np.linspace(0, 10, n_samples)  # 时间数据
# 创建一个包含时间和冷却方式的DataFrame
data = pd.DataFrame({
    'Time': time,
    'Cooling_Method': np.random.choice(['Natural', 'Fan1', 'Fan2'], size=n_samples)
})
# 根据不同的冷却方式生成温度数据
data['Temperature'] = 500  # 初始温度
data.loc[data['Cooling_Method'] == 'Natural', 'Temperature'] = data['Temperature'] * np.exp(-0.1 * data['Time'])
data.loc[data['Cooling_Method'] == 'Fan1', 'Temperature'] = data['Temperature'] * np.exp(-0.2 * data['Time'])
data.loc[data['Cooling_Method'] == 'Fan2', 'Temperature'] = data['Temperature'] * np.exp(-0.15 * data['Time'])
# 拟合指数衰减模型
# 目的是针对不同的冷却方式拟合指数衰减模型,并将拟合的参数存储在一个字典中以供后续分析或可视化使用。
# 拟合是通过 curve_fit 函数完成的,该函数使用初始参数猜测值来拟合模型并返回最优的参数
fit_parameters = {}  # 创建一个空字典,用于存储拟合参数

# 遍历不同的冷却方式
for method in data['Cooling_Method'].unique():
    subset = data[data['Cooling_Method'] == method]  # 从数据中选择特定冷却方式的子集
    
    # 提供初始参数猜测值
    # 如果你不打算使用某个变量的值,可以使用 _ 来表示它是一个占位符,用来忽略这个值
    # 即curve_fit 函数的返回值中的第二个值,即协方差矩阵
    
    # 例如,对于冷却方式 'Natural',初始参数猜测值是第一个时间点的温度和0.1
    initial_guess = (subset['Temperature'].iloc[0], 0.1)
    
    # 使用 curve_fit 函数来拟合指数衰减模型
    # 这个函数会拟合一个给定的模型函数(这里是 exponential_decay)到数据中,并返回最优的参数
    params, _ = curve_fit(exponential_decay, subset['Time'], subset['Temperature'], p0=initial_guess)
    
    # 将拟合参数存储在字典中,以便稍后使用
    fit_parameters[method] = params

# 示例:
# 如果 data 数据包含不同冷却方式的温度数据和时间数据,fit_parameters 字典将包含每种冷却方式的拟合参数。
# 例如,fit_parameters['Natural'] 将包含冷却方式为 'Natural' 的拟合参数。
# 这些参数描述了指数衰减模型的 T0 和 k 参数,该模型用于拟合该冷却方式下的温度数据。
# 绘制拟合曲线
plt.figure(figsize=(10, 6))
for method, params in fit_parameters.items():
    fit_time = np.linspace(0, 10, 100)
    fit_temperature = exponential_decay(fit_time, *params)
    plt.plot(fit_time, fit_temperature, label=f'{method}拟合')

# 绘制原始数据
for method, subset in data.groupby('Cooling_Method'):
    plt.scatter(subset['Time'], subset['Temperature'], label=method)

plt.xlabel('时间')
plt.ylabel('温度')
plt.legend()
plt.title('不同冷却方式下的温度趋势拟合')
plt.show()

实验1 线性拟合 冷却_数据_02

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
  gBkHYLY8jvYd   2023年12月09日   30   0   0 cii++数据
X5zJxoD00Cah