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 个数字数组(在本例中):
- 第一个填0
- 第二个填充了
a * ( 1 - np.exp( - b * (x - c) ** d) )
的结果
然后,根据这两个的条件选择创建结果数组。
在间隔 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 是否适用于更多条件?
我正在使用 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 个数字数组(在本例中):
- 第一个填0
- 第二个填充了
a * ( 1 - np.exp( - b * (x - c) ** d) )
的结果
然后,根据这两个的条件选择创建结果数组。
在间隔 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 是否适用于更多条件?