寻找曲线scipy的最大值

ski*_*1z1 6 python matplotlib max scipy

我已经将曲线拟合到一组数据点.我想知道如何找到我的曲线的最大点然后我想注释那一点(我不想使用我的数据中的最大y值来执行此操作).我不能完全编写我的代码,但这是我的代码的基本布局.

import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

x = [1,2,3,4,5]
y = [1,4,16,4,1]

def f(x, p1, p2, p3):
    return p3*(p1/((x-p2)**2 + (p1/2)**2))   

p0 = (8, 16, 0.1) # guess perameters 
plt.plot(x,y,"ro")
popt, pcov = curve_fit(f, x, y, p0)
plt.plot(x, f(x, *popt)) 
Run Code Online (Sandbox Code Playgroud)

还有办法找到峰宽吗?

我错过了一个可以做到这一点的简单内置函数吗?我可以区分功能并找到它为零的点吗?如果是这样的话?

tom*_*m10 5

在您找到最佳参数以最大化您的功能后,您可以使用minimize_scalar(或其他方法之一)找到峰值scipy.optimize.

请注意,在下面,我已经移动,x[2]=3.2以便曲线的峰值不会落在数据点上,我们可以确定我们找到了曲线的峰值,而不是数据.

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit, minimize_scalar

x = [1,2,3.2,4,5]
y = [1,4,16,4,1]

def f(x, p1, p2, p3):
    return p3*(p1/((x-p2)**2 + (p1/2)**2))   

p0 = (8, 16, 0.1) # guess perameters 
plt.plot(x,y,"ro")
popt, pcov = curve_fit(f, x, y, p0)

# find the peak
fm = lambda x: -f(x, *popt)
r = minimize_scalar(fm, bounds=(1, 5))
print "maximum:", r["x"], f(r["x"], *popt)  #maximum: 2.99846874275 18.3928199902

x_curve = np.linspace(1, 5, 100)
plt.plot(x_curve, f(x_curve, *popt))
plt.plot(r['x'], f(r['x'], *popt), 'ko')
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

当然,我们可以只计算一堆x值并得到它,而不是优化函数:

x = np.linspace(1, 5, 10000)
y = f(x, *popt)
imax = np.argmax(y)
print imax, x[imax]     # 4996 2.99859985999
Run Code Online (Sandbox Code Playgroud)