Python 如何仅拟合曲线直到其最大值?

Python 如何仅拟合曲线直到其最大值?,python,curve-fitting,Python,Curve Fitting,我正在努力寻找一种智能的方法来拟合曲线(我使用curve\u fit,如下所示),直到达到最大值为止,而不必操纵初始数组 def f_singlecomponent(x, f0, a, k): return f0 + a * (1 - np.exp( -k * x )) popt, pcov = curve_fit(f_singlecomponent, coords[n][0], coords[n][1], p0=init_vals) 如我在上面的评论中所提到的,使用一个简单的sigm

我正在努力寻找一种智能的方法来拟合曲线(我使用
curve\u fit
,如下所示),直到达到最大值为止,而不必操纵初始数组

def f_singlecomponent(x, f0, a, k):
    return f0 + a * (1 - np.exp( -k * x ))
popt, pcov = curve_fit(f_singlecomponent, coords[n][0], coords[n][1], p0=init_vals)

如我在上面的评论中所提到的,使用一个简单的sigma掩码会导致

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

def func( x, a, k, y0):
    return a * ( 1- np.exp( -k * x ) ) + y0

def mymask( y ):
    m = np.argmax(y)
    l = len(y)
    return m * [1] + ( l - m )* [ np.infty ]

xlist = np.linspace( 0., 10., 100 )
ylist = np.fromiter( ( func( x, 1.3, .44, 8 ) for x in xlist ), np.float )
ylist2 = np.fromiter( ( func( x, 1.3, .44, 8 ) * ( 0.5 * ( 1 - np.tanh( (x - 7 ) ) ) *.13 + 1-.13 ) for x in xlist ), np.float )

popt_o, _ = curve_fit(func, xlist, ylist, p0=[1.3,.44,8])
popt_w, _ = curve_fit(func, xlist, ylist2, p0=[1.3,.44,8],  maxfev=9000 )
popt_t, _ = curve_fit(func, xlist, ylist, p0=[1.3,.44,8], sigma=mymask( ylist ))

fig = plt.figure()
ax = fig.add_subplot( 1, 1, 1 )
ax.plot( xlist, ylist, linewidth=3 )
ax.plot( xlist, ylist2 )
ax.plot( xlist, np.fromiter( ( func( x,*popt_o ) for x in xlist ), np.float ), ls='--', linewidth=2 )
ax.plot( xlist, np.fromiter( ( func( x,*popt_t ) for x in xlist ), np.float ), ls=':', linewidth=1 )
ax.plot( xlist, np.fromiter( ( func( x,*popt_w ) for x in xlist ), np.float ) )
plt.show()
看起来


这对我来说似乎很好。

我记得,curve_fit()不会更改传递给它的数据。这就是你要问的吗?不,我试图找到一种方法来拟合可以用a*(1-exp(-k*t))来描述的曲线,但是在达到平台后,曲线下降,不应该拟合这个下降。也许你也会传递一个
sigma
-数组,将最大值以下的所有值设置为1,将最大值以上的所有值设置为
numpy.infty
。我没有检查,但可能
曲线拟合
适用于遮罩阵列?这正是我要找的!非常感谢。