Python scipy.optimize失败,初始猜测非常好

Python scipy.optimize失败,初始猜测非常好,python,python-3.x,scipy,Python,Python 3.x,Scipy,我试图将形式为a*tanh(b*x)+c的函数拟合到我的数据中,如下所示: x = [1. , 2., 3., 5., 6., 10., 15., 30.] y = [1., 1.81498639, 2.51864814, 3.54771826, 3.99775936, 5.74444049, 8.06357414, 12.82164541] 我使用的是scipy.optimize.curve\u fit,结果不正确,导致绘制此图: 起初我认为可能我最初的猜测不好/需要

我试图将形式为
a*tanh(b*x)+c
的函数拟合到我的数据中,如下所示:

x = [1. , 2.,  3.,  5.,  6., 10., 15., 30.]
y = [1., 1.81498639,  2.51864814,  3.54771826,  3.99775936,  5.74444049,
     8.06357414, 12.82164541]
我使用的是
scipy.optimize.curve\u fit
,结果不正确,导致绘制此图: 起初我认为可能我最初的猜测不好/需要提供,所以我手动近似了一个好的拟合,然后将这些值作为
p0
arg提供给
curve\u fit()
。这只会导致更糟糕的近似值,即曲线在数据上方y轴上升高约1000个单位

这件衣服怎么会掉这么多?我是否需要为曲线拟合函数指定更多参数以获得合理的结果

错误消息:

优化警告:无法估计参数的协方差 类别=警告

我的代码:

将numpy导入为np
从scipy导入优化
将matplotlib.pyplot作为plt导入
def接头(a、b、c、X):
等式=a*np.tanh(b*X)+c
返回均衡器
def检查图(x,y,lam,tp,mol,x,y):
'''
创建要检查的s_ineff与t_块的绘图
要正确选择块大小
仍然会产生一致的结果。
'''
图,ax=plt.子批次(图尺寸=(7,4))
最大散射(x,y)
ax.plot(X,Y,c='r')
ax.set_ylabel(r'$s_{ineff}$')
ax.set_xlabel(r'$\tau{Block}$')
ax.文本(0.04、0.95、,
“%s\n$\lambda{%s}=%s$'%(摩尔、总磷、拉姆),
水平对齐='左',
垂直对齐='顶部',
transform=ax.变速器)
#plt.savefig(“fitti.png”,bbox_inches=“tight”,dpi=300)
plt.show()
plt.关闭(图)
x=np.数组([1,2,3,5,6,10,15,30.]))
y=np.数组([1,1.81498639,2.51864814,3.54771826,3.99775936,5.74444049,
8.06357414, 12.82164541])
参数,参数=优化曲线拟合(拟合,x,y)
a、 b,c=parms[0],parms[1],parms[2]
#好的初步猜测:p0=[13,0.05,0.6]
十、 Y=X,配合(a,b,c,X)
摩尔,总磷,林='甲苯','电子',0.15
检查图(x,y,lam,tp,mol,x,y)

也绘制初始猜测
曲线拟合
期望调用的形式为
def-fit(X,a,b,c):
。您接受
X
作为最后一个参数,而不是第一个参数。投票表决以打字错误结束。@Mad物理学家看过去的打字错误,事实上有一个问题。试着编辑代码并运行它,你会看到的。该死……我一改变顺序,曲线就毫无意义地捕捉到数据上。没想到我会犯这样的新手错误。非常感谢。补偿可能很重要,这就是我在回答中要解决的问题。您可以小心地拆下或安装它。