Python中的曲线拟合受具有正导数的约束

时间:2018-08-13 13:36:09

标签: python optimization scipy

我正在尝试将二次多项式拟合到数据,但要遵守多项式应为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+cxx>0应该为正的约束?

1 个答案:

答案 0 :(得分:0)

首先,a + b*x + c*x**2的派生词是b + 2*c*x,而不是b + c*x

第二,我们需要将“正数”替换为“负数”,因为根据其性质进行优化需要一个允许参数的封闭区域。

当且仅当b + 2*c*xx>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

相关问题