如何用Python生成近似钢筋粘结滑移曲线的拟合曲线?
如何用Python生成近似所有粘结滑移曲线的拟合曲线
你原代码的核心问题是错误地将数据中的全局极值点tmax、smax固定为常数,而实际上这两个值应该和参数a一起作为拟合变量,才能生成贴合所有数据的近似曲线。另外还有一些细节问题导致拟合失效,以下是修正后的完整方案:
修正后的代码
from pandas import read_csv from matplotlib import pyplot from scipy.optimize import curve_fit import numpy as np # 加载数据集 url = 'https://raw.githubusercontent.com/Nikesu977/bond_slip_data/main/bond_slip_data.csv' dataframe = read_csv(url, header=None) data = dataframe.values # 提取输入输出变量,过滤s接近0的点(避免0^a的计算异常) s, t = data[:, 0], data[:, 1] mask = s > 1e-6 s = s[mask] t = t[mask] # 绘制原始散点图 pyplot.scatter(s, t, alpha=0.3, label='原始数据') # 定义拟合目标函数:将tmax、smax、a都作为待拟合参数 def objective(s, tmax, smax, a): return tmax * (s / smax) ** a # 给curve_fit提供初始参数猜测(提升拟合收敛成功率) init_guess = [np.percentile(t, 90), np.percentile(s, 90), 1] # 执行曲线拟合 popt, pcov = curve_fit(objective, s, t, p0=init_guess) tmax_fit, smax_fit, a_fit = popt # 输出拟合得到的公式 print(f'拟合公式:t = {tmax_fit:.5f} * (s / {smax_fit:.5f}) ** {a_fit:.5f}') # 生成平滑的s序列用于绘制拟合曲线 s_line = np.linspace(min(s), max(s), 500) t_line = objective(s_line, tmax_fit, smax_fit, a_fit) # 绘制拟合曲线 pyplot.plot(s_line, t_line, '--', color='red', linewidth=2, label='拟合曲线') pyplot.xlabel('滑移s') pyplot.ylabel('粘结应力t') pyplot.legend() pyplot.show()
关键修正点说明
- 模型参数调整:原代码固定了tmax和smax,这会导致拟合曲线被限制在数据的单个极值点上,无法适配整体分布。修正后将tmax、smax、a全部作为待拟合参数,让模型自主找到最优的整体近似参数。
- 数据预处理:过滤掉s接近0的点,避免计算
0^a时出现数值错误(尤其是当a为负数时)。 - 拟合初始值设置:给
curve_fit提供合理的初始参数猜测,能大幅提升拟合的收敛成功率,避免因初始值不合理导致拟合失败。 - 曲线平滑优化:用
np.linspace代替np.arange生成s序列,保证曲线足够平滑,不会因步长过大出现断层。
内容的提问来源于stack exchange,提问作者Nikesh Mrjn
相关产品推荐
相关产品推荐

