0
点赞
收藏
分享

微信扫一扫

scipy.optimize.curve_fit函数用法解析

boomwu 2023-10-05 阅读 41

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  # 解决负号显示问题

# 定义指数衰减模型函数
# 初始温度T0, 时间t
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  # 初始温度,t==0时
data.loc[data['Cooling_Method'] == 'Natural', 'Temperature'] = data['Temperature'] * np.exp(-0.1 * data['Time']) + np.random.normal(scale=10)
data.loc[data['Cooling_Method'] == 'Fan1', 'Temperature'] = data['Temperature'] * np.exp(-0.2 * data['Time']) + np.random.normal(scale=10)
data.loc[data['Cooling_Method'] == 'Fan2', 'Temperature'] = data['Temperature'] * np.exp(-0.15 * data['Time']) + np.random.normal(scale=50)

# 拟合指数衰减模型
# 目的是针对不同的冷却方式拟合指数衰减模型,并将拟合的参数存储在一个字典中以供后续分析或可视化使用。
# 拟合是通过 curve_fit 函数完成的,该函数使用初始参数猜测值来拟合模型并返回最优的参数
fit_parameters = {}  # 创建一个空字典,用于存储拟合参数

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

# 示例:
# 如果 data 数据包含不同冷却方式的温度数据和时间数据,fit_parameters 字典将包含每种冷却方式的拟合参数。
# 例如,fit_parameters['Natural'] 将包含冷却方式为 'Natural' 的拟合参数。
# 这些参数描述了指数衰减模型的 T0 和 k 参数,该模型用于拟合该冷却方式下的温度数据。

data.head(2)

Time

Cooling_Method

Temperature

0

0.00000

Natural

509.729799

1

0.10101

Fan1

474.489146

print(fit_parameters)
for key, value in fit_parameters.items():
    print(key, eval(str(value[0])), eval(str(value[-1])))

{'Natural': array([5.09058051e+02, 9.70515648e-02]), 'Fan1': array([4.88989258e+02, 2.14940890e-01]), 'Fan2': array([5.07716533e+02, 1.44589237e-01])}
Natural 509.0580507545348 0.09705156480720636
Fan1 488.9892578468816 0.2149408902873383
Fan2 507.7165328538809 0.14458923732563153

# 绘制拟合曲线
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()

scipy.optimize.curve_fit函数用法解析_拟合

'''scipy.optimize.curve_fit函数用法解析'''

# 需要拟合的数据组
x_group = np.array([3, 6.1, 9.1, 11.9, 14.9])
y_group = np.array([0.0221, 0.0491, 0.0711, 0.0971, 0.1238])


# 需要拟合的函数
def f_1(x, A, B):
    return A * x + B

# 得到返回的[A,B]值 和 协方差矩阵
# [A,B]为残差最小时参数的值
curve_fit(f_1, x_group, y_group)

(array([ 0.00849076, -0.00377682]),
 array([[ 3.12053615e-08, -2.80848259e-07],
        [-2.80848259e-07,  3.07460197e-06]]))

举报

相关推荐

0 条评论