两个预定义函数的组合(分段)函数
Combination (piecewise) function of two pre-defined functions
我目前正在制作一个自定义函数,我最终会将其输入 scipy.optimize.curve_fit() 以进行自定义曲线拟合。我的曲线拟合将像一个凸起。高斯上升和指数下降,在高斯的最高点拼凑起来。我已经定义了一个高斯函数和一个指数函数,目前正在尝试定义一个 combo() 函数。这是我目前拥有的:
def exp(x, a, b, c):
return a * np.exp((-b * x) + c)
def gauss(x,d,e,f):
return d * np.exp(-((x-e)**2)/(2*(f**2)))
def combo(x,a,b,c,d,e,f):
ex = exp(x,a,b,c)
ga = gauss(x,d,e,f)
num = np.arange(0,1000,1)
test =combo(num,1,2,3,10,4,3)
我尝试在我的组合函数中使用 if 语句 (if x
def combo(x,a,b,c,d,e,f, dtype=np.float64):
def gauss(x,d,e,f):
return d * np.exp(-((x-e)**2)/(2*(f**2)))
def exp(x, a, b, c):
return a * np.exp((-b * x) + c)
result = np.piecewise(
x,
[x <= e,x > e],
[lambda x: gauss(x,d,e,f), lambda x: exp(x,a,b,c)],
)
return result
我认为使用 numpy
执行此操作的最佳方法是使用数组切片。使用平均值 b
来屏蔽 x
中的值,以便仅使用高斯函数计算 b
之前或等于 b
的值,而 x
大于b
用指数函数计算:
def exp(x, a, b, c):
return a * np.exp(-c * (x-b))
def gauss(x, a, b, d):
return a * np.exp(-((x-b)**2)/(2 * (d**2)))
def combo(x, a, b, c, d):
y = np.zeros(x.shape)
y[x <= b] = gauss(x[x <= b], a, b, d)
y[x > b] = exp(x[x > b], a, b, c)
return y
num = np.arange(-50, 50, 0.5)
test = combo(num, 10, 4, 3, 3)
我假设你希望这个函数是连续的,所以我改变了你的参数,使输入到exp
和gauss
的值彼此一致,我改变了arange
参数所以情节更有意义。看起来您发布的解决方案将完成分段部分,而不是连续部分。大概不需要使用 lambda
但不熟悉 np.piecewise
.
输出:
我目前正在制作一个自定义函数,我最终会将其输入 scipy.optimize.curve_fit() 以进行自定义曲线拟合。我的曲线拟合将像一个凸起。高斯上升和指数下降,在高斯的最高点拼凑起来。我已经定义了一个高斯函数和一个指数函数,目前正在尝试定义一个 combo() 函数。这是我目前拥有的:
def exp(x, a, b, c):
return a * np.exp((-b * x) + c)
def gauss(x,d,e,f):
return d * np.exp(-((x-e)**2)/(2*(f**2)))
def combo(x,a,b,c,d,e,f):
ex = exp(x,a,b,c)
ga = gauss(x,d,e,f)
num = np.arange(0,1000,1)
test =combo(num,1,2,3,10,4,3)
我尝试在我的组合函数中使用 if 语句 (if x
def combo(x,a,b,c,d,e,f, dtype=np.float64):
def gauss(x,d,e,f):
return d * np.exp(-((x-e)**2)/(2*(f**2)))
def exp(x, a, b, c):
return a * np.exp((-b * x) + c)
result = np.piecewise(
x,
[x <= e,x > e],
[lambda x: gauss(x,d,e,f), lambda x: exp(x,a,b,c)],
)
return result
我认为使用 numpy
执行此操作的最佳方法是使用数组切片。使用平均值 b
来屏蔽 x
中的值,以便仅使用高斯函数计算 b
之前或等于 b
的值,而 x
大于b
用指数函数计算:
def exp(x, a, b, c):
return a * np.exp(-c * (x-b))
def gauss(x, a, b, d):
return a * np.exp(-((x-b)**2)/(2 * (d**2)))
def combo(x, a, b, c, d):
y = np.zeros(x.shape)
y[x <= b] = gauss(x[x <= b], a, b, d)
y[x > b] = exp(x[x > b], a, b, c)
return y
num = np.arange(-50, 50, 0.5)
test = combo(num, 10, 4, 3, 3)
我假设你希望这个函数是连续的,所以我改变了你的参数,使输入到exp
和gauss
的值彼此一致,我改变了arange
参数所以情节更有意义。看起来您发布的解决方案将完成分段部分,而不是连续部分。大概不需要使用 lambda
但不熟悉 np.piecewise
.
输出: