Позвольте мне предварить это, сказав, что я совершенно новичок в аппроксимации кривой в python, поэтому я могу что-то делать совершенно и явно неправильно.
У меня есть экспериментальный «необработанный» набор данных, состоящий из температуры (x) против сигнала (y).
Я пытаюсь подогнать уравнение Больцмана к этим данным, используя scipy.curve_fit .Мой сценарий не выдает никаких ошибок, но когда я строю его в matplotlib, он использует значения x от 0 до 600, когда моя область экспериментальных данных охватывает только значения между ~ 308 -> 400. Мало того, кривая, к которой он подходитданные> выглядят <полностью выключенными (смещенными и перекошенными), но их производная выглядит идентично производным необработанных данных ... заставляя меня думать, что где-то применено какое-то преобразование. </p>
#Get the data
file = 'Data/my_excel_file.xlsx'
df = pd.read_excel(file, sheet_name='simplified')
#Define the Boltzmann function for fitting
def BoltzmannFitEquation(T, Fmin, Fmax, Tm, breadth):
return Fmin + ((Fmax - Fmin) / (1 + np.exp((Tm - (T/breadth)))))
#Grabbing the y-values (signal) from the dataframe
signal = df['signal'].tolist()
#Convert my temps from the dataframe from C to K.
for temp in temps_c:
temps_k.append(float(temp) + 273)
#Now lets fit a Boltzmann equation to the smoothed data
p0 = [0.9, 1.2, 347, 1] #initial predictions
c, cov = curve_fit(BoltzmannFitEquation, temps_k, signal, p0)
yp = BoltzmannFitEquation(temps_k, c[0], c[1], c[2], c[3]) #Plot of the prediction with the optimized coefficients
plt.plot(yp)
Я исключил группумоего кода, чтобы упростить вещи - но дайте мне знать, если вы хотите увидеть что-то конкретное, это может помочь выяснить, почему я вижу это.
Синие линии - это «необработанные» данные и производные, оранжевые линии -подогнанная кривая и производная.
Обратите внимание, что точки перегиба не совпадают на верхней диаграмме, но они совпадают на нижней.Почему кривая подходит так плохо?Почему он даже включает значения за пределами домена?