如何拟合始终低于数据点的分段阶跃函数?
阶跃函数拟合问题:约束函数位于数据点下方及数组判断报错解决
我有一个生成阶跃曲线的自定义函数,需要优化拟合其中的5个参数(m1、m2、FL1、FL2、FL3),函数定义如下:
def steps(x, FL1, m1, FL2, m2, FL3): if x > m1: return FL1 if x > m2: return FL2 else: return FL3
我的核心需求是:拟合后的函数必须始终位于所有数据点的下方。简化示例为阶跃曲线完全处于数据点下方,实际数据的阶跃形态更复杂。
我认为scipy.optimize.curve_fit不适用,因为它基于最小二乘法,会让拟合曲线围绕数据点居中,无法满足“函数在数据点下方”的约束。
我尝试了以下代码:
from scipy.optimize import curve_fit def steps(m, FL1, m1, FL2, m2, FL3): if m > m1: return FL1 if mass > m2: # 注:此处存在变量名错误,应为m而非mass return FL2 else: return FL3 x_data = [8000, 7000, 6000, 5000] y_data = [300, 350, 400, 450] popt, _ = curve_fit(steps, x_data, y_data)
运行后报错:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
显然是函数中的if语句无法处理数组输入导致的问题。
请问:我可以使用什么方法来实现这种带约束(函数位于数据点下方)的阶跃函数拟合?
内容的提问来源于stack exchange,提问作者Hu gePanic
相关产品推荐
相关产品推荐

