首页 > 其他分享 >实验1 线性拟合 冷却

实验1 线性拟合 冷却

时间:2023-10-04 12:31:47浏览次数:30  
标签:00 01 time np 冷却 拟合 线性 data panel


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

'''实验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 线性拟合 冷却_Time

'''对照样本与拟合结果'''
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 线性拟合 冷却_Time_02

标签:00,01,time,np,冷却,拟合,线性,data,panel
From: https://blog.51cto.com/u_16055028/7703148

相关文章

  • 线性混合模型为什么是多元高斯分布
    如何建立高斯模型,可以看图根据每类数据做一个高斯函数,然后做一个混合高斯密度函数。如果提取目标的话得把目标的概率函数提取出来。 ......
  • 线性方程组求解
    下面是运用MATLAB写的一个代码,可用来求解线性方程组。functionx=ch2_gauss(A,b)n1=size(A,1);n2=size(A,2);n3=length(b);if(n1~=n2)  disp("Aisnotasquarenmatrix");  return;endif(n2~=n3)  disp("dimensionofAandbisnotequal");  returnendn=n1;L=z......
  • 放热公式与牛顿冷却定律的区别
    牛顿冷却定律和放热公式都是物理学中的概念,但是它们的应用场景和公式不同。牛顿冷却定律是指物体所损失的热的速率与物体和其周围环境间的温度差是成比例的。当物体表面与周围存在温度差时,单位时间从单位面积散失的热量与温度差成正比,比例系数称为热传递系数。其公式如下:$$\fra......
  • 【数据结构】线性表
    线性表顺序表链式存储单链表双链表知识目录顺序表概念:用一组地址连续的存储单元依次存储线性表的数据元素,这种存储结构的线性表称为顺序表。特点:逻辑上相邻的数据元素,物理次序也是相邻的。只要确定好了存储线性表的起始位置,线性表中任一数据元素都可以随机存取,所以线性表的顺序存......
  • 线性系统与信号(三):采样、信号、状态空间分析
    连续时间信号分析①周期信号:傅里叶级数  连续时间信号分析②非周期信号:傅里叶积分  采样:从连续到离散的过渡  离散时间信号的傅里叶分析  状态空间分析......
  • 线性系统与信号:MATLAB课时11节
    MATLAB课时B:初步操作  MATLAB课时1:使用函数  MATLAB课时2:M文件  MATLAB课时3:离散时间信号与系统  MATLAB课时4:连续时间滤波器  MATLAB课时5:离散时间IIR滤波器  MATLAB课时6:傅里叶级数应用   MATLAB课时7:傅里叶变换   MATLAB课时8:离散......
  • 拟合不同的冷却方式(分类变量)下,物料温度加入两个分类变量, 物料类型和冷却方式, 给
    在机器学习中,拟合不同冷却方式下物料温度随时间下降的规律可以使用不同的算法和方法。以下是四种常见的方法,它们可以用来生成数据集、拟合模型、解释参数和输出函数方程,以及解释它们的实际意义。线性回归:方法:线性回归是一种用于拟合线性关系的方法,通过寻找最佳拟合直线来预测温度随......
  • 线性求逆元
    线性求逆元时间复杂度:\(O(n)\)问题:求取\(1...n\)关于质数\(p\)的逆元。应用举例:求取组合数\(C_n^m\mod\p\),其中\(1\leqn,m\leq10^7,p=998244353\)。\[C_n^m\equiv\frac{n!}{(n-m)!m!}(mod\p)\]\[C_n^m\equivn!*(n-m)!^{-1}*m!^{-1}(mod\p)\]假设我们......
  • 温度由分类变量和连续变量决定,请用python机器学习三种方法模拟生成数据并拟合
    要模拟生成数据并拟合温度(或任何其他目标变量),通常需要考虑以下步骤:生成特征数据:创建分类变量和连续变量,这些变量将用于预测温度。分类变量可以是例如季节、天气状况(晴天、雨天、多云等),而连续变量可以是例如湿度、风速等。生成目标数据:根据特征数据和某种关系生成目标变量(温度)的数据......
  • 【数据结构】线性表的数组描述和链式描述
    1.线性表抽象类#pragmaoncetemplate<classT>classLinearList{public://线性表是否为空virtualboolempty()const=0;//线性表大小virtualintsize()const=0;//根据ID获取线性表元素virtualT&get(inttheIndex)const=0;......