基于Re值区间的幂曲线批量拟合优化方法问询
分段幂曲线拟合的高效实现方法
问题背景
现有Re与Y的实验数据,需要拟合成幂曲线形式 Y = c1*Re^c2,并且要按Re的数值区间进行分段拟合(比如分成3个区间得到3组系数)。当前手动编写切片代码的方式,在区间数量增加(如10个以上)时效率极低,需要更简洁的实现方式。
原手动实现代码存在的问题:
- 手动切片数据,区间越多代码越冗余
- 存在变量命名错误(如
dict_Coeff_Nu未定义、C_Nu应为C),导致代码无法正常运行
高效实现代码
from scipy.optimize import curve_fit import pandas as pd # 定义幂曲线拟合函数 def power_curve(X, c1, c2): return c1 * (X ** c2) # 实验数据 Re = [8,39,65,117,196,299,331,480,504,554,771,831,957,1180,1181,1472,1515,1558,1571,1709,1863,1931,2010,2127,2222] Y = [435263,85974,52075,28727,18407,13949,13090,10285,9963,9365,8368,8243,8007,7684,7683,7352,7300,7269,7257,7136,7014,6955,6903,6831,6766] # 转换成DataFrame统一处理 df = pd.DataFrame({"Re": Re, "Y": Y}) # 定义区间分界点(示例分成3个区间:<=150, 150<Re<=1200, >1200) # 如需更多区间,只需在列表中添加分界值即可 interval_bins = [-float("inf"), 150, 1200, float("inf")] # 给每个数据点标记所属区间 df["interval"] = pd.cut(df["Re"], bins=interval_bins, labels=["<=150", "150<Re<=1200", ">1200"]) # 存储拟合结果 fit_results = [] # 遍历每个区间分组进行拟合 for interval_name, group in df.groupby("interval"): X_data = group["Re"] Y_data = group["Y"] # 执行曲线拟合 coeffs, _ = curve_fit(power_curve, X_data, Y_data) # 保存当前区间的拟合系数 fit_results.append({ "区间": interval_name, "c1": round(coeffs[0], 2), "c2": round(coeffs[1], 4) }) # 转换成DataFrame展示结构化结果 results_df = pd.DataFrame(fit_results) print("分段拟合系数:") print(results_df)
关键改进点
- 自动区间划分:使用
pd.cut函数,只需定义分界点列表,即可自动给所有数据标记所属区间,区间数量再多也无需编写大量切片代码 - 分组批量处理:通过
groupby按区间分组,循环处理每个分组,逻辑简洁可扩展 - 结果结构化:用列表字典存储结果,最终转换成DataFrame,比原字典形式更直观易读
- 修复原代码错误:修正了变量名不一致的问题,确保代码可正常运行
内容的提问来源于stack exchange,提问作者robi_beginner
相关产品推荐
相关产品推荐

