拟合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
相关产品推荐
相关产品推荐

