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

拟合tanh曲线并估算参数:代码报错与方法正确性咨询

问题解决与拟合函数验证

错误根源与修正

  • TypeError 原因:代码中np.tanh[(x-a)/b]使用了方括号[],但np.tanh是numpy的函数,调用必须用圆括号(),方括号仅用于数组索引,这直接导致了“'numpy.ufunc' object is not subscriptable”错误。
  • 导入错误修正:import matplotlib as plt写法错误,需改为import matplotlib.pyplot as plt,否则无法调用绘图接口。

拟合函数写法确认

你要拟合的公式y = x - a - b*tanh[(x - a)/b]是正确的,对应的Python函数只需修正括号即可,同时建议将输入的x、y转为numpy数组,提升拟合稳定性。

修正后的完整代码

from scipy.optimize import curve_fit
import numpy as np
import matplotlib.pyplot as plt

# 转换为numpy数组,提升拟合兼容性
x = np.array([799.0,872.0,882.0,986.0,722.0,479.0,747.0,510.0,1012.0,1114.0,801.0,662.0,853.0,878.0,779.0,987.0,707.0,756.0,730.0,523.0,802.0,1068.0,780.0,927.0,923.0,790.0,852.0,580.0,730.0,924.0,762.0,662.0,927.0,828.0,866.0,951.0,949.0,740.0,677.0,704.0,798.0,791.0,761.0])
y = np.array([27.64,110.75,139.34,66.02,26.66,5.29,11.75,3.81,64.07,286.23,57.23,43.61,18.68,55.4,65.97,206.51,16.32,19.25,10.98,3.12,15.41,122.89,62.43,112.18,34.86,46.59,48.96,3.69,11.3,49.92,18.96,6.57,32.74,35.76,46.35,115.04,131.46,46.63,26.25,4.55,9.21,36.32,11.47])  

def myfunc(x,a,b):
    # 修正tanh的调用括号
    return x - a - b * np.tanh( (x - a)/b )

# 执行拟合,可添加初始猜测参数优化收敛效果
popt, pcov = curve_fit(myfunc, x, y, p0=[np.mean(x), np.std(x)])
print(f"拟合参数a: {popt[0]:.4f}, 参数b: {popt[1]:.4f}")

# 绘制原始数据与拟合曲线
plt.scatter(x, y, label='原始数据')
plt.plot(np.sort(x), myfunc(np.sort(x), *popt), 'r-', label='拟合曲线')
plt.legend()
plt.show()

额外提示

如果拟合出现收敛失败的情况,传入初始参数猜测p0(比如基于数据均值和标准差)能帮助算法更快定位最优解,代码中已包含该优化选项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:55:16