如何使用python实现利用峰位置、峰高、半峰宽进行高斯拟合
时间: 2023-07-10 14:06:30 浏览: 343
使用Python进行高斯拟合的方法有很多,下面我介绍一种基于Scipy库的方法,使用峰位置、峰高、半峰宽进行高斯拟合。
首先,需要导入Scipy库和Numpy库:
```python
import numpy as np
from scipy.optimize import curve_fit
```
然后,定义高斯函数:
```python
def gaussian(x, a, x0, sigma):
return a * np.exp(-(x - x0) ** 2 / (2 * sigma ** 2))
```
其中,a为峰高,x0为峰位置,sigma为半峰宽。
接着,将峰位置、峰高、半峰宽作为初值进行拟合:
```python
p0 = [max(y), x[np.argmax(y)], (max(x) - min(x)) / 10]
coeff, _ = curve_fit(gaussian, x, y, p0=p0)
```
其中,p0为初值,coeff为拟合后得到的参数。
最后,可以将拟合函数绘制出来:
```python
import matplotlib.pyplot as plt
plt.plot(x, y, 'b+:', label='data')
plt.plot(x, gaussian(x, *coeff), 'ro:', label='fit')
plt.legend()
plt.show()
```
完整代码如下:
```python
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
def gaussian(x, a, x0, sigma):
return a * np.exp(-(x - x0) ** 2 / (2 * sigma ** 2))
x = np.linspace(0, 10, 100)
y = gaussian(x, 2.5, 5, 1) + np.random.normal(size=len(x))
p0 = [max(y), x[np.argmax(y)], (max(x) - min(x)) / 10]
coeff, _ = curve_fit(gaussian, x, y, p0=p0)
plt.plot(x, y, 'b+:', label='data')
plt.plot(x, gaussian(x, *coeff), 'ro:', label='fit')
plt.legend()
plt.show()
```
需要注意的是,初值的选择对拟合结果有很大的影响,如果初值选择不好,有可能会导致拟合失败。因此,初值的选择需要根据实际情况进行调整。