python 双高斯拟合
时间: 2023-09-13 14:08:16 浏览: 85
Python中可以使用scipy.optimize.curve_fit函数进行双高斯拟合。具体步骤如下:
1. 导入必要的库:
```python
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
```
2. 定义双高斯函数:
```python
def bimodal(x, amp1, cen1, sig1, amp2, cen2, sig2):
return amp1 * np.exp(-(x - cen1)**2 / (2 * sig1**2)) + amp2 * np.exp(-(x - cen2)**2 / (2 * sig2**2))
```
3. 准备数据:
```python
x_data = np.linspace(0, 10, 1000)
y_data = bimodal(x_data, 1, 5, 1, 0.5, 7, 1.5) + np.random.normal(0, 0.1, 1000)
```
4. 进行拟合:
```python
popt, pcov = curve_fit(bimodal, x_data, y_data, p0=[1, 5, 1, 0.5, 7, 1.5])
```
其中,p0为拟合函数的初始参数值。
5. 绘制拟合曲线:
```python
plt.plot(x_data, y_data, 'b-', label='data')
plt.plot(x_data, bimodal(x_data, *popt), 'r-', label='fit')
plt.legend()
plt.show()
```
其中,*popt表示将popt中的元素拆分成单个参数传递给函数。
完整代码如下:
```python
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
def bimodal(x, amp1, cen1, sig1, amp2, cen2, sig2):
return amp1 * np.exp(-(x - cen1)**2 / (2 * sig1**2)) + amp2 * np.exp(-(x - cen2)**2 / (2 * sig2**2))
x_data = np.linspace(0, 10, 1000)
y_data = bimodal(x_data, 1, 5, 1, 0.5, 7, 1.5) + np.random.normal(0, 0.1, 1000)
popt, pcov = curve_fit(bimodal, x_data, y_data, p0=[1, 5, 1, 0.5, 7, 1.5])
plt.plot(x_data, y_data, 'b-', label='data')
plt.plot(x_data, bimodal(x_data, *popt), 'r-', label='fit')
plt.legend()
plt.show()
```
运行结果如下图所示:
![bimodal_fit](https://img-blog.csdn.net/20180503103825647?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jsb2cxOTk2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/85)
可以看出,拟合结果与原始数据较为吻合。
阅读全文