Точки построения Python и matplotlib за пределами области, с плохой подгонкой кривой - PullRequest
0 голосов
/ 29 января 2019

Позвольте мне предварить это, сказав, что я совершенно новичок в аппроксимации кривой в 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)

Я исключил группумоего кода, чтобы упростить вещи - но дайте мне знать, если вы хотите увидеть что-то конкретное, это может помочь выяснить, почему я вижу это.

Синие линии - это «необработанные» данные и производные, оранжевые линии -подогнанная кривая и производная.

enter image description here

Обратите внимание, что точки перегиба не совпадают на верхней диаграмме, но они совпадают на нижней.Почему кривая подходит так плохо?Почему он даже включает значения за пределами домена?

1 Ответ

0 голосов
/ 30 января 2019

Когда я пытаюсь использовать следующий код, мне кажется, что он подходит.

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

file = 'Data/my_excel_file.xlsx'
#file = '/home/zunzun/temp/temp.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 data from the dataframe
signal = np.array(df['signal'].tolist())
temps_c = np.array(df['temperature'].tolist())

#Convert my temps from the dataframe from C to K.
temps_k = temps_c + 273.0

#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

print("Fitted paraneters:", c)

plt.plot(temps_k, signal) # data
plt.plot(temps_k, yp) # fit
plt.show()

plots

...