scipy.optimize.curve_fit 有条件

scipy.optimize.curve_fit with conditions

我正在使用 Python + NumPy + SciPy 根据数据确定方程的系数。等式定义如下:

def func (x, a,b,c,d):
    if x < d:
        return 0
    else:
        return a * ( 1 - np.exp( - b * (x - c) ** d)

根据我的发现,函数的传统表示根据 this discussion 将不起作用,必须替换为:

def func (x, a,b,c,d):
    return np.where ( x < c,
        0 ,
        a * ( 1 - np.exp( - b * (x - c) ** d) )
    )

这一个引发错误 RuntimeWarning: invalid value encountered in power a * ( 1 - np.exp( - b * (x - c) ** d)

据我了解,这是因为尝试创建 2 个数字数组(在本例中):

然后,根据这两个的条件选择创建结果数组。 在间隔 x < c 中与 d 的分数值的某种组合中创建第二个数组会导致从负数求根。这导致了问题。

我的解决方法是:

def func (x, a,b,c,d):
    return np.where ( x < c,
        0 ,
        a * ( 1 - np.exp( - b * np.abs( x - c) ** d) )
    )

它工作正常,因为 x < c 的值范围由条件定义, 但是有更好的方法吗?

理想情况下,这甚至会阻止计算 a * ( 1 - np.exp( - b * (x - c) ** d) if x < c 和 unversal,make 是否适用于更多条件?

这样就彻底解决了问题: https://docs.scipy.org/doc/numpy/reference/generated/numpy.piecewise.html