#python #numpy #scipy
#python #numpy #scipy
Вопрос:
Я пытаюсь подогнать свои экспоненциальные данные, но не могу получить достойный ответ. Я использую scipy и следующий код:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import glob
import scipy.optimize
import pylab
def exponential(x, a, k, b):
return a*np.exp(-x/k) b
def main():
filename = 'tek0071ALL.csv'
df = pd.read_csv(filename, skiprows=14)
t = df['TIME']
ch3 = df['CH3']
idx1 = df.index[df['TIME']==-0.32]
idx2 = df.index[df['TIME']==-0.18]
t= t[idx1.values[0]:idx2.values[0]]
data=ch3[idx1.values[0]:idx2.values[0]]
popt_exponential, pcov_exponential = scipy.optimize.curve_fit(exponential, t, data, p0=[1,.1, 0])
# print(popt_exponential,pcov_exponential)
print(popt_exponential[0])
print(popt_exponential[1])
print(popt_exponential[2])
plt.plot(t,data,'.')
plt.plot(t,exponential(t,popt_exponential[0],popt_exponential[1],popt_exponential[2]))
plt.show()
plt.legend(['Data','Fit'])
main()
Вот как выглядит подгонка:
и я думаю, это означает, что это действительно хорошая подгонка. Я думаю, что моя постоянная времени верна, и это то, что я пытаюсь извлечь. Однако амплитуда действительно доставляет мне проблемы — я ожидал, что амплитуда будет около 0,5 при проверке, но вместо этого я получаю следующие значения для уравнения A*exp(-t/K) C
:
A:1.2424893552249658e-07
K:0.0207112474466181
C: 0.010623336832120528
Мне остается только гадать, правильно ли это, и что моя амплитуда действительно должна быть настолько крошечной, чтобы учитывать поведение экспоненты.
Комментарии:
1. Можем ли мы создать резервную копию на секунду? Вы пишете, что ожидали, что амплитуда будет около 0,5. Почему? Не зная, откуда взялось это предположение, возможно, вы сделали неправильный вывод. Этот график действительно выглядит красиво.
2. Вы пытались установить границы
A
для подгонки? Поскольку есть два других параметра, они могут «поглощать» измененияA
. Смотритеbounds=[[A.min, K_min, C_min], [A.max, K_max, C_max]]
в документации