You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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()

关键修正点说明

  1. 模型参数调整:原代码固定了tmax和smax,这会导致拟合曲线被限制在数据的单个极值点上,无法适配整体分布。修正后将tmax、smax、a全部作为待拟合参数,让模型自主找到最优的整体近似参数。
  2. 数据预处理:过滤掉s接近0的点,避免计算0^a时出现数值错误(尤其是当a为负数时)。
  3. 拟合初始值设置:给curve_fit提供合理的初始参数猜测,能大幅提升拟合的收敛成功率,避免因初始值不合理导致拟合失败。
  4. 曲线平滑优化:用np.linspace代替np.arange生成s序列,保证曲线足够平滑,不会因步长过大出现断层。

内容的提问来源于stack exchange,提问作者Nikesh Mrjn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 13:30:12