Как подобрать данные по экспоненциальной кривой

62
3

Я получаю небольшую проблему с моим проектом, потому что у меня есть набор данных, я рисую его, чтобы получить 2 кривые, и я хотел бы подгонять эти графики по экспоненциальной кривой.

Я смотрел этот пост: подгонка экспоненциального затухания без первоначального угадывания. Но мой пример отличается от других.

Это то, что я получаю с данными:

enter image description here

Мой сценарий выглядит следующим образом:

mask_G = np.bitwise_and( tbdata['G'] < 99.99, tbdata['GERR'] < 0.2)
mask_R = np.bitwise_and( tbdata['R'] < 99.99, tbdata['RERR'] < 0.2)

G_corrected = tbdata[mask_G]
R_corrected = tbdata[mask_R]

fig13 = plt.gcf()
fig13.set_size_inches(16, 9)

fig13, (ax1,ax2) = plt.subplots(1,2)

fig_error_g = ax1.plot(G_corrected['G'], G_corrected['GERR'], '.')
ax1.set_xlabel('G')
ax1.set_ylabel('GERR')
ax1.set_title('Evolution de GERR en fonction de G')

fig_error_r = ax2.plot(R_corrected['R'], R_corrected['RERR'], '.')
ax2.set_xlabel('R')
ax2.set_ylabel('RERR')
ax2.set_title('Evolution de RERR en fonction de R')

fig13.tight_layout()

plt.savefig('graphique.png')

plt.show()

Я попытался написать это, основанное на scipy doc:

def exponential(x,a,b,c) :
return a * np.exp(-b * x) + c

xdata = G_corrected['G']
y = G_corrected['GERR']
ydata = y + 0.2 * np.random.normal(size=len(xdata))

popt, pcov = curve_fit(exponential, xdata, ydata)

но я получаю:

/home/user/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/scipy/optimize/minpack.py:601: Оптимизация Предупреждение: ковариация параметров не может быть оценена
категория = OptimizeWarning)

Есть ли у вас какие-либо идеи о том, как я могу обработать?

Огромное спасибо ;)

РЕДАКТИРОВАТЬ :

Я пытался подойти к моему заговору так:

mask_G = np.bitwise_and( tbdata['G'] < 99.99, tbdata['GERR'] < 0.2)
mask_R = np.bitwise_and( tbdata['R'] < 99.99, tbdata['RERR'] < 0.2)

G_corrected = tbdata[mask_G]
R_corrected = tbdata[mask_R]

params = np.polyfit(G_corrected['G'], np.log(G_corrected['GERR']),1)
a = params[0]
A = np.exp(params[1])

fig13 = plt.gcf()
fig13.set_size_inches(16, 9)

fig13, (ax1,ax2) = plt.subplots(1,2)

fig_error_g = ax1.plot(G_corrected['G'], (G_corrected['GERR']), '.')
fig_error_g = ax1.plot(G_corrected['G'], (A*np.exp(a*G_corrected['G'])),'.')

ax1.set_xlabel('G')
ax1.set_ylabel('GERR')
ax1.set_title('Evolution de GERR en fonction de G')

fig_error_r = ax2.plot(R_corrected['R'], np.log(R_corrected['RERR']), '.')
ax2.set_xlabel('R')
ax2.set_ylabel('RERR')
ax2.set_title('Evolution de RERR en fonction de R')

fig13.tight_layout()

plt.savefig('graphique.png')

plt.show()

и я получаю:

enter image description here

Что вы думаете о результатах?

спросил(а) 2021-01-25T13:27:50+03:00 4 месяца, 3 недели назад
1
Решение
90

Самый простой способ - применить логарифмическое масштабирование к вашему сюжету. Поскольку вы, безусловно, знаете log (exp (x)) = x, т.е. если вы примените log() к вашим значениям y и заговорите, вы должны получить линейный график. После этого вы можете поместить его с помощью линейного инструментария (метод Gaussian Leest Square). Результирующий наклон представляет собой префактор в exp (ax), который вы пытаетесь получить.

Если у вас есть другая зависимость от оси x, может быть полезно сделать лог-лог-график ваших данных, чтобы выяснить все зависимости.

ответил(а) 2021-01-25T13:27:50+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема