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

使用Scipy curve_fit拟合双曲正切函数仅返回两个值的问题排查

问题解决:Scipy curve_fit 返回值处理错误

你的核心问题不是自定义tanh函数的问题,而是完全误解了curve_fit的返回结构:

curve_fit返回的是一个包含两个元素的元组:

  • 第一个元素popt:形状为(N,)的数组,N是你拟合函数的参数个数(这里是4个),也就是你需要的A、B、C、To的拟合值
  • 第二个元素pcov:形状为(N,N)的协方差矩阵,用于评估拟合参数的不确定性

你之前的所有错误都是直接把整个元组当成参数数组来拆分或索引,导致取到的是协方差矩阵或者错误的元素。

正确代码写法

基础版本(无初始猜测)

import numpy as np
from scipy.optimize import curve_fit

def tanh(x, A, B, C, To):
    y = ((A+B)/2) + ((A-B)/2)*np.tanh((x - To)/C)
    return y

# 执行拟合,拆分返回值
popt, pcov = curve_fit(tanh, df5.iloc[:,0], df5.iloc[:,1])
# 从popt中提取四个参数
Afit, Bfit, Cfit, Tofit = popt

带初始猜测的版本

import numpy as np
from scipy.optimize import curve_fit

def tanh(x, A, B, C, To):
    y = ((A+B)/2) + ((A-B)/2)*np.tanh((x - To)/C)
    return y

# 初始猜测值(根据你的数据范围合理设置)
initialguess = [intA, intB, intC, intTo]
# 拆分返回值
popt, pcov = curve_fit(tanh, df5.iloc[:,0], df5.iloc[:,1], p0=initialguess)
Afit, Bfit, Cfit, Tofit = popt

额外说明

  • 你的自定义tanh函数形式完全正确,这是用于拟合S型曲线的标准带参数tanh表达式,无需修改。
  • 如果拟合仍然失败(比如popt值不合理),需要确保initialguess的数值接近真实参数范围,tanh拟合对初始值比较敏感,尤其是C(斜率相关参数)和To(拐点位置)。
  • 可以通过打印popt和pcov来验证拟合结果:print("拟合参数:", popt),协方差矩阵对角线元素的平方根是参数的标准差。

内容的提问来源于stack exchange,提问作者Caleb Minasian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:55:07