2024-09-28 21:22:26 发布
网友
我试图将一个二次多项式拟合到数据中,但要满足这样一个约束:多项式对x>0应该有正导数。在
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,y
当x>0时,如何添加b+cx应为正的约束?在
b+cx
首先,a + b*x + c*x**2的导数是b + 2*c*x,而不是{}。在
a + b*x + c*x**2
b + 2*c*x
其次,我们需要用“非负”代替“正”,因为优化本质上需要一个允许参数的闭合区域。在
当且仅当b>=0和{}时,表达式b + 2*c*x对x>0是非负的。因此,通过在b和c上为curve_fit提供合适的下界来解决该问题,如下所示:
b>=0
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表示。在
[2.70588235e-01 1.92685605e-15 3.20855615e-01]
y = 0.271 + 0.321 * x**2
首先,}。在
a + b*x + c*x**2
的导数是b + 2*c*x
,而不是{其次,我们需要用“非负”代替“正”,因为优化本质上需要一个允许参数的闭合区域。在
当且仅当}时,表达式
b>=0
和{b + 2*c*x
对x>0
是非负的。因此,通过在b和c上为curve_fit
提供合适的下界来解决该问题,如下所示:结果
[2.70588235e-01 1.92685605e-15 3.20855615e-01]
表明b实际上是零(它被推到约束之外),因此拟合最好用y = 0.271 + 0.321 * x**2
表示。在相关问题 更多 >
编程相关推荐