2016-11-23 4 views
3

Это довольно конкретная проблема. Я надеялся, что сообщество сможет мне помочь. Заранее спасибо.Фиксация кривых с большим количеством точек данных

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

Вот код:

%matplotlib notebook 
import numpy as np 
import matplotlib.pyplot as plt 
import scipy.stats as spys 
from scipy.optimize import curve_fit 

time = [60,220,520,1840] 
Moment = [0.64227262,0.468318916,0.197100772,0.104512508] 

Temperature = 25        # Bake temperature in degrees C 
Nb = len(Moment)           # Number of bake measurements 
Baketime_a = time     #[s] 
N_Device = 10000         # No. of devices considered in the array 
T_ambient = 273 + Temperature 
kt = 0.0256*(T_ambient/298)       # In units of eV 
f0 = 1e9           # Attempt frequency 


def Ebfit(x,a,b): 
    Eb_mean = a*(0.0256/kt)      # Eb at bake temperature 
    Eb_sigma = b*Eb_mean 
    Foursigma = 4*Eb_sigma 
    Eb_a = np.linspace(Eb_mean-Foursigma,Eb_mean+Foursigma,N_Device) 
    dEb = Eb_a[1] - Eb_a[0] 
    pdfEb_a = spys.norm.pdf(Eb_a,Eb_mean,Eb_sigma) 

    ## Retention Time 

    DMom = np.zeros(len(x),float) 
    tau = (1/f0)*np.exp(Eb_a) 
    for bb in range(len(x)): 
     DMom[bb]= (1 - 2*(sum(pdfEb_a*(1 - np.exp(np.divide(-x[bb],tau))))*dEb)) 
    return DMom 

a = 30 
b = 0.10 

params,extras = curve_fit(Ebfit,time,Moment) 

x_new = list(range(0,2000,1)) 
y_new = Ebfit(x_new,params[0],params[1]) 

plt.plot(time,Moment, 'o', label = 'data points') 
plt.plot(x_new,y_new, label = 'fitted curve') 
plt.legend() 

Основная проблема, которую я имею, что подгонка данных в функции не работает, когда я использую большое количество очков. В приведенном выше коде Когда я использую 4 точки (время & момент), этот код работает нормально.

Я получаю следующие значения для a и b.

массив ([+29,11832766, 0,13918353])

Ожидаемые значения для это (23-50) и Ь (0,06 - 0,15). Таким образом, эти значения находятся в допустимом диапазоне. Это соответствующий график: Plot 1

Однако, когда я использую свои фактические экспериментальные нормализованные данные с примерно 500 точками.

EDIT: Эти данные:

нормализованных данных

https://www.dropbox.com/s/64zke4wckxc1r75/Normalized%20Data.csv?dl=0

необработанных данных

https://www.dropbox.com/s/ojgse5ibp59r8nw/Data1.csv?dl=0

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

массив ([- +13,76687781, -12,90494196]) Plot 2

Я знаю, что эти значения являются неправильными, и если бы я сделать это вручную (медленно регулируя значения получить надлежащую подгонку) было бы около a = 30,1 и b = 0,09. И когда график выглядит так: Plot 3

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

. . . .

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

Модель Я пытаюсь подобрать данные, которые вытекает из следующего уравнения: Equation

где Dmom = 1 - 2 * PSW

в - значение Eb, а b - значение Sigma, где Eb имеет диапазон значений b y функция плотности вероятности и 4 раза значений сигмы (т. Foursigma). Затем это распределение суммируется для использования для окончательного уравнения.

+0

Ваша ссылка Google Drive, кажется, ограничено. Это намеренно? –

+0

@ ВласСоколов эй извините за это. Я обновил ссылку. Пожалуйста, попробуйте еще раз. – xplodnow

+0

Данные момента в файле варьируются от -3e-5 до 1.65e-5, но в соответствии с вашим набором данных с 500 точками диапазоны приближаются к одному. Это объясняет несоответствие соответствия? Нормализуете ли вы данные где-то между их установкой и их отображением на экране? –

ответ

2

Похоже, вам нужно поиграть с начальными предположениями для a и b в конце концов. Возможно, функция, которую вы устраиваете, не очень хорошо себя ведет, поэтому она настолько подвержена неудачам для интуитивных догадок от глобального минимума. Это, как говорится, вот рабочий пример того, как в соответствии с данными:

import pandas as pd 
data_df = pd.read_csv('data.csv') 
time = data_df['Time since start, Time [s]'].values 
moment = data_df['Signal X direction, Moment [emu]'].values 

params, extras = curve_fit(Ebfit, time, moment, p0=[40, 0.3]) 

Урожайность значения a и b из:

In [6]: params 
Out[6]: array([ 30.47553689, 0.08839412]) 

что приводит к хорошо выровненной приступе функции.

x_big = np.linspace(1, 1800, 2000) 
y_big = Ebfit(x_big, params[0], params[1]) 

plt.plot(time, moment, 'o', alpha=0.5, label='all points') 
plt.plot(x_big, y_big, label = 'fitted curve') 
plt.legend() 
plt.show() 

fits

Смежные вопросы