Супер гауссовская подгонка - PullRequest
0 голосов
/ 20 марта 2020

Мне нужно изучить профиль лазерного луча. Для этого мне нужно найти супергауссову кривую, подходящую для моих данных. Супергауссовское уравнение:

I * exp(- 2 * ((x - x0) /sigma)^P)

, где P учитывает характеристики кривой лазерного луча с плоским верхом.

Я начал делать простой гауссовский подбор моей кривой в Python. Подгонка возвращает гауссову кривую, где значения I, x0 и sigma оптимизированы. (Я использовал функцию curve_fit) Уравнение гауссовой кривой:

I * exp(-(x - x0)^2 / (2 * sigma^2))

Теперь я хотел бы сделать шаг вперед. Я бы хотел подгонять супергауссовскую кривую , потому что мне нужно учитывать характеристики луча с плоским верхом. Таким образом, мне нужна подгонка, которая также оптимизирует параметр P.

Кто-нибудь знает, как сделать супергауссову подгонку с Python?

Я знаю, что есть способ сделать супергауссовскую подгонку с помощью wolfram mathematica, которая не является открытым исходным кодом. У меня этого нет. Таким образом, я хотел бы также знать, знает ли кто-нибудь программное обеспечение с открытым исходным кодом, благодаря которому можно выполнить супергауссову подгонку кривой или выполнить wolfram mathematica.

Спасибо

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Подгонка 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 могут использоваться в качестве начальных значений для классических итерационных методов. регрессии.

enter image description here

Примечание:

Рассмотренное линейное уравнение: enter image description here

A, B, C, D - параметры, которые должны быть вычислены благодаря линейной регрессии. Числовые значения S (k) интеграла напрямую рассчитываются путем численного интегрирования по заданным данным (как показано в приведенном выше примере).

0 голосов
/ 21 марта 2020

Ну, вам нужно написать функцию, которая вычисляет параметризованный супергауссов и использовать ее для моделирования данных, скажем, с scipy.optimize.curve_fit. Как ведущий автор LMFIT (https://lmfit.github.io/lmfit-py/), который предоставляет высокоуровневый интерфейс для подгонки и подгонки кривой, я бы порекомендовал попробовать эту библиотеку. При таком подходе ваша модель для функции супергауссова и использования для подгонки данных может выглядеть следующим образом:

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

и создаст график как это

enter image description here

...