我正在尝试将二次多项式拟合到数据,但要遵守多项式应为x>0
具有正导数的约束。
在没有约束的情况下,以下工作有效:
def poly(x, a, b, c):
return a + b*x + c*x**2
popt, pcov = curve_fit(poly, x, y)
其中x,y
包含要适合的数据。
如何添加b+cx
时x>0
应该为正的约束?
答案 0 :(得分:0)
首先,a + b*x + c*x**2
的派生词是b + 2*c*x
,而不是b + c*x
。
第二,我们需要将“正数”替换为“负数”,因为根据其性质进行优化需要一个允许参数的封闭区域。
当且仅当b + 2*c*x
和x>0
时,表达式b>=0
对于c>=0
是非负的。因此,可以通过为curve_fit
在b和c上提供合适的下界来解决该问题,如下所示:
import numpy as np
from scipy.optimize import curve_fit
x_data = [1, 2, 3, 4, 5]
y_data = [2, 1, 2, 5, 9]
def poly(x, a, b, c):
return a + b*x + c*x**2
result = curve_fit(poly, x_data, y_data, bounds=((-np.inf, 0, 0), (np.inf, np.inf, np.inf)))
print(result[0])
结果[2.70588235e-01 1.92685605e-15 3.20855615e-01]
显示b有效为零(正被约束所推),因此拟合度更好地表示为y = 0.271 + 0.321 * x**2
。