Привет Я пытаюсь подогнать свои данные с помощью либо полиномиальной, либо экспоненциальной функции, с которой я потерпел неудачу в обоих. Код, я использую выглядит следующим образом:Экспоненциальная подгонка данных (python)
with open('argon.dat','r') as f:
argon=f.readlines()
eng1 = np.array([float(argon[argon.index(i)].split('\n')[0].split(' ')[0])*1000 for i in argon])
II01 = np.array([1-math.exp(-float(argon[argon.index(i)].split('\n')[0].split(' ')[1])*(1.784e-3*6.35)) for i in argon])
with open('copper.dat','r') as f:
copper=f.readlines()
eng2 = [float(copper[copper.index(i)].split('\n')[0].split(' ')[0])*1000 for i in copper]
II02 = [math.exp(-float(copper[copper.index(i)].split('\n')[0].split(' ')[1])*(8.128e-2*8.96)) for i in copper]
fig, ax1 = plt.subplots(figsize=(12,10))
ax2 = ax1.twinx()
ax1.set_yscale('log')
ax2.set_yscale('log')
arg = ax2.plot(eng1, II01, 'b--', label='Argon gas absorption at STP (6.35 cm)')
cop = ax1.plot(eng2, II02, 'r', label='Copper wall transp. (0.81 mm)')
plot = arg+cop
labs = [l.get_label() for l in plot]
ax1.legend(plot,labs,loc='lower right', fontsize=14)
ax1.set_ylim(1e-6,1)
ax2.set_ylim(1e-6,1)
ax1.set_xlim(0,160)
ax1.set_ylabel(r'$\displaystyle I/I_0$', fontsize=18)
ax2.set_ylabel(r'$\displaystyle 1-I/I_0$', fontsize=18)
ax1.set_xlabel('Photon Energy [keV]', fontsize=18)
plt.show()
Что дает мне , что я хочу сделать, это вместо данных чертежа, как это подогнать их к экспоненциальной кривой и умножать эти кривые, чтобы в итоге эффективность детектора (Я пытался умножить элемент за элементом, но у меня недостаточно точек данных, чтобы иметь плавную кривую). Я попытался использовать polyfit, а также попытался определить экспоненциальную функцию, чтобы увидеть ее работу, но в итоге я получил строку в обоих случаях
#def func(x, a, c, d):
# return a*np.exp(-c*x)+d
#
#popt, pcov = curve_fit(func, eng1, II01)
#plt.plot(eng1, func(eng1, *popt), label="Fitted Curve")
и
В случае данных потребности берется из http://www.nist.gov/pml/data/xraycoef/index.cfm Также подобные работы могут быть найдены в Рис.3: http://scitation.aip.org/content/aapt/journal/ajp/83/8/10.1119/1.4923022
Покой eddited после @ ответ Оливера:
Я умножение с использованием существовавших данных :
i = 0
eff1 = []
while i < len(arg):
eff1.append(arg[i]*cop[i])
i += 1
То, что я в конечном итоге это (красный цвет: медь, пунктирная синий: аргон, синий: умножение) Это то, что я предполагаю, чтобы получить, но с помощью функций для Thi кривых (будет комментарий, сделанный при ответе @ oliver относительно того, что неправильно или неправильно понял)
Спасибо за подробное объяснение, Я многому научился. Однако есть некоторые проблемы с парами, которые я понял, когда пытался сделать то же самое, что и синяя кривая в вашем заговоре. Я считаю, что подходит для аргона, однако аргон предположительно ведет себя как экспоненциальное уменьшение, а красная линия - медь, экспоненциальная однако его линия и зеленый, который является умножением двух, снова являются линией, которая находится ниже сюжета. Позвольте мне изменить мой вопрос, это может сделать его более ясным или, может быть, я не могу понять ваши сюжеты. – jackaraz
@jackaraz Да, синий - график для аргона. Причина, по которой он увеличивается в моем заговоре, заключается в том, что я рисую его * во втором столбце * файла данных (который является моей координатой «x»), тогда как вы рисуете его против * первого *. Эти две колонки имеют обратные тенденции (один идет вверх, другой - вниз). Если вы хотите построить график против первого, я предлагаю вам сопоставить безопасный диапазон, указанный выше, в аналогичном диапазоне в первом столбце. Я отредактирую ответ. –
Мое редактирование должно будет ждать два дня - посадка на межконтинентальный самолет. Пожалуйста, рассмотрите логику, которую вы применяете: это не имеет смысла, потому что отношение между μ/ρ и энергией для меди и аргона НЕ то же самое.Однако я сделал быстрое редактирование, потому что я не учитывал, что такое 'new_limits': он основан на значениях во втором столбце, а не в первом. –