使用astropy.modeling拟合具有负振幅的高斯问题

问题描述 投票:0回答:1

我正在尝试使用astropy.modeling软件包使高斯拟合离散电位。尽管我为高斯分配了负振幅,但它会返回空高斯,即,各处振幅均为零:

plot(c[0], pot_x, label='Discrete potential')
plot(c[0], g(c[0]), label='Gaussian fit') 
legend() 

enter image description here

我有以下代码行可以进行拟合:

g_init = models.Gaussian1D(amplitude=-1., mean=0, stddev=1.)
fit_g = fitting.LevMarLSQFitter()
g = fit_g(g_init, c[0], pot_x)

哪里

c[0] = array([13.31381488, 13.31944489, 13.32507491, 13.33070493, 13.33633494,
   13.34196496, 13.34759498, 13.35322499, 13.35885501, 13.36448503,
   13.37011504, 13.37574506, 13.38137507, 13.38700509, 13.39263511,
   13.39826512, 13.40389514, 13.40952516, 13.41515517, 13.42078519])

pot_x = array([ -1.72620157,  -3.71811187,  -6.01282809,  -6.98874144,
    -8.36645166, -14.31787771, -23.3688849 , -26.14679496,
   -18.85970983, -10.73888697,  -7.10763373,  -5.81176637,
    -5.44146953,  -5.37165105,  -4.6454408 ,  -2.90307138,
    -1.66250349,  -1.66096343,  -1.8188269 ,  -1.41980552])

任何人都有意识形态可能是什么问题吗?

已解决:我只需要分配一个域范围内的平均值,例如13.35。

python python-3.x astropy
1个回答
0
投票

由于我不熟悉Astropy,因此我使用了scipy。下面的代码提供以下信息:

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

x = np.asarray([13.31381488, 13.31944489, 13.32507491, 13.33070493, 13.33633494,
   13.34196496, 13.34759498, 13.35322499, 13.35885501, 13.36448503,
   13.37011504, 13.37574506, 13.38137507, 13.38700509, 13.39263511,
   13.39826512, 13.40389514, 13.40952516, 13.41515517, 13.42078519])

y = -np.asarray([ -1.72620157,  -3.71811187,  -6.01282809,  -6.98874144,
    -8.36645166, -14.31787771, -23.3688849 , -26.14679496,
   -18.85970983, -10.73888697,  -7.10763373,  -5.81176637,
    -5.44146953,  -5.37165105,  -4.6454408 ,  -2.90307138,
    -1.66250349,  -1.66096343,  -1.8188269 ,  -1.41980552])

mean = sum(x * y) / sum(y)
sigma = np.sqrt(sum(y * (x - mean)**2) / sum(y))

def Gauss(x, a, x0, sigma):
    return a * np.exp(-(x - x0)**2 / (2 * sigma**2))

popt,pcov = curve_fit(Gauss, x, y, p0=[max(y), mean, sigma])

plt.plot(x, y, 'b+:', label='data')
plt.plot(x, Gauss(x, *popt), 'r-', label='fit')
plt.legend()

Curve fitting

为简单起见,我重用了此answer。我对均值和西格玛定义并不完全确定,因为我不习惯在2D数据集上拟合高斯。但是,这并不重要,因为它仅用于定义用于启动curve_fit算法的近似值。

© www.soinside.com 2019 - 2024. All rights reserved.