4 回答

TA貢獻1810條經驗 獲得超4個贊
好吧,您需要編寫一個函數來計算參數化的超高斯函數,并使用它來對數據進行建模,例如.作為LMFIT(https://lmfit.github.io/lmfit-py/)的主要作者,它提供了一個高級接口來擬合和曲線擬合,我建議嘗試該庫。使用這種方法,超高斯和用于擬合數據的模型函數可能如下所示:scipy.optimize.curve_fit
import numpy as np
from lmfit import Model
def super_gaussian(x, amplitude=1.0, center=0.0, sigma=1.0, expon=2.0):
"""super-Gaussian distribution
super_gaussian(x, amplitude, center, sigma, expon) =
(amplitude/(sqrt(2*pi)*sigma)) * exp(-abs(x-center)**expon / (2*sigma**expon))
"""
sigma = max(1.e-15, sigma)
return ((amplitude/(np.sqrt(2*np.pi)*sigma))
* np.exp(-abs(x-center)**expon / 2*sigma**expon))
# generate some test data
x = np.linspace(0, 10, 101)
y = super_gaussian(x, amplitude=7.1, center=4.5, sigma=2.5, expon=1.5)
y += np.random.normal(size=len(x), scale=0.015)
# make Model from the super_gaussian function
model = Model(super_gaussian)
# build a set of Parameters to be adjusted in fit, named from the arguments
# of the model function (super_gaussian), and providing initial values
params = model.make_params(amplitude=1, center=5, sigma=2., expon=2)
# you can place min/max bounds on parameters
params['amplitude'].min = 0
params['sigma'].min = 0
params['expon'].min = 0
params['expon'].max = 100
# note: if you wanted to make this strictly Gaussian, you could set
# expon=2 and prevent it from varying in the fit:
### params['expon'].value = 2.0
### params['expon'].vary = False
# now do the fit
result = model.fit(y, params, x=x)
# print out the fit statistics, best-fit parameter values and uncertainties
print(result.fit_report())
# plot results
import matplotlib.pyplot as plt
plt.plot(x, y, label='data')
plt.plot(x, result.best_fit, label='fit')
plt.legend()
plt.show()
這將打印一個報告,如
[[Model]]
Model(super_gaussian)
[[Fit Statistics]]
# fitting method = leastsq
# function evals = 53
# data points = 101
# variables = 4
chi-square = 0.02110713
reduced chi-square = 2.1760e-04
Akaike info crit = -847.799755
Bayesian info crit = -837.339273
[[Variables]]
amplitude: 6.96892162 +/- 0.09939812 (1.43%) (init = 1)
center: 4.50181661 +/- 0.00217719 (0.05%) (init = 5)
sigma: 2.48339218 +/- 0.02134446 (0.86%) (init = 2)
expon: 3.25148164 +/- 0.08379431 (2.58%) (init = 2)
[[Correlations]] (unreported correlations are < 0.100)
C(amplitude, sigma) = 0.939
C(sigma, expon) = -0.774
C(amplitude, expon) = -0.745
并生成這樣的情節

TA貢獻1858條經驗 獲得超8個贊
紐維爾的答案非常適合我。
但要小心!在函數定義中,括號在指數的商中是模糊的super_gaussian
def super_gaussian(x, amplitude=1.0, center=0.0, sigma=1.0, expon=2.0):
...
return ((amplitude/(np.sqrt(2*np.pi)*sigma))
* np.exp(-abs(x-center)**expon / 2*sigma**expon))
應替換為
def super_gaussian(x, amplitude=1.0, center=0.0, sigma=1.0, expon=2.0):
...
return (amplitude/(np.sqrt(2*np.pi)*sigma))
* np.exp(-abs(x-center)**expon / (2*sigma**expon))
然后是超高斯函數的FWHM,它寫道:
FWHM = 2.*sigma*(2.*np.log(2.))**(1/expon)
經過精心計算,與情節非常一致。
我很抱歉寫這篇文章作為答案。但是我的聲譽得分很低,無法為M Newville帖子添加評論...

TA貢獻2039條經驗 獲得超8個贊
將 y(x)=a *exp(-b *(x-c)**p) 擬合到參數 a,b,c,p 的數據。
下面的數值演算示例顯示了一種非迭代方法,該方法不需要對參數進行初始猜測。
這在應用一般原理中解釋在論文中:https://fr.scribd.com/doc/14674814/Regressions-et-equations-integrales
在本文的當前版本中,超高斯的情況沒有得到明確的處理。沒有必要閱讀論文,因為下面的屏幕副本顯示了整個細節的微積分。
請注意,數值結果 a,b,c,p 可用作回歸的經典迭代測量的初始值。
注意:
考慮的線性方程是:
A,B,C,D是由于線性回歸而要計算的參數。積分的數值S(k)通過從給定數據進行數值積分直接計算(如上例所示)。

TA貢獻1804條經驗 獲得超2個贊
這是超高斯的函數
def super_gaussian(x, amp, x0, sigma):
rank = 2
return amp * ((np.exp(-(2 ** (2 * rank - 1)) * np.log(2) * (((x - x0) ** 2) / ((sigma) ** 2)) ** (rank))) ** 2)
然后你需要用 scipy 優化曲線擬合來調用它,如下所示:
from scipy import optimize
opt, _ = optimize.curve_fit(super_gaussian, x, y)
vals = super_gaussian(x, *opt)
“vals”是你需要繪制的,那就是擬合的超高斯函數。
添加回答
舉報