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

2024-09-28 21:22:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将一个二次多项式拟合到数据中,但要满足这样一个约束:多项式对x>0应该有正导数。在

在没有约束的情况下,以下操作有效:

def poly(x, a, b, c):
    return a + b*x + c*x**2

popt, pcov = curve_fit(poly, x, y)

其中x,y包含要调整的数据。在

x>0时,如何添加b+cx应为正的约束?在


Tags: 数据returndef情况fit导数curvecx
1条回答
网友
1楼 · 发布于 2024-09-28 21:22:26

首先,a + b*x + c*x**2的导数是b + 2*c*x,而不是{}。在

其次,我们需要用“非负”代替“正”,因为优化本质上需要一个允许参数的闭合区域。在

当且仅当b>=0和{}时,表达式b + 2*c*xx>0是非负的。因此,通过在b和c上为curve_fit提供合适的下界来解决该问题,如下所示:

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表示。在

相关问题 更多 >