Python 使用scipy曲线拟合时,是否可以强制范围/相关函数的边界?

Python 使用scipy曲线拟合时,是否可以强制范围/相关函数的边界?,python,scipy,curve-fitting,Python,Scipy,Curve Fitting,我有一个对数函数适合一组点 def log_func(x, a, b): return a * np.log(x) + b popt, pcov = curve_fit(log_func, x, yn) 这将产生如下图- 但是,系统具有范围应固定在0和100之间的限制。我特别在这些边界上传递了点(即x=np.array([3200…其他点…42000])和y=np.array([0…其他点…100]),但显然曲线不一定固定这些值 我已经读到我可以给参数添加边界(所以这里是a和b),但有

我有一个对数函数适合一组点

def log_func(x, a, b):
    return a * np.log(x) + b
popt, pcov = curve_fit(log_func, x, yn)
这将产生如下图-

但是,系统具有范围应固定在0和100之间的限制。我特别在这些边界上传递了点(即
x=np.array([3200…其他点…42000])
y=np.array([0…其他点…100])
,但显然曲线不一定固定这些值


我已经读到我可以给参数添加边界(所以这里是
a
b
),但有没有一种方法可以通过特别强制曲线通过两个端点来约束输出。或者,我是否必须对函数引入某种极端惩罚,以生成将强制结果介于0和100之间的参数?

您可以将曲线拟合问题表述为约束优化问题问题并使用
scipy.optimize.minimize
来解决它。考虑到最优
a
应为正的数据集,因此对拟合函数范围的要求相当于约束
a*np.log(3200)+b>=0
a*np.log(42000)+b您可以将曲线拟合问题表述为一个约束优化问题,并使用
scipy.optimize.minimize
来解决它。考虑到最优
a
应为正值的数据集,因此对拟合函数范围的要求相当于约束
a*np.log(3200)+b> =0和
a*np.log(42000)+b
from scipy.optimize import minimize


x = np.array([3200, 14500, 42000])
yn = np.array([0, 78, 100])

def LS_obj(p):
    a, b = p
    return ((log_func(x, a, b) - yn)**2).sum()

cons = ({'type': 'ineq', 'fun': lambda p: p[0] * np.log(3200) + p[1]},
        {'type': 'ineq', 'fun': lambda p: 100 -p[0] * np.log(42000) - p[1]})

p0 = [10,-100] #initial estimate 
sol = minimize(LS_obj,p0 ,constraints=cons)
print(sol.x)  #optimal parameters