2014-05-20 3 views
0

---- ANSWERED ----Использование scipy.optimize's curve_fit

Приносим извинения, если этот вопрос слишком просто ответил. Я очень новичок в кодировании Python и сейчас занимаюсь сложным проектом. Любая помощь приветствуется; Я был бы рад разъяснить путаницу для тех, кто хочет помочь.

Я был в состоянии успешно поместилась свои данные с помощью этой функции, но модель привязки была неточной (термодинамические величины Образовавшееся были неправильными):

#defining function of the binding model 
def binding_model(molar_ratio,Ka,n,dH): 
    return (dH*molar_ratio**n)/(molar_ratio**n+Ka**n) 

#fitting molar enthalpy vs. molar ratio data with binding model 
initial_paramaters=array([1,0,0]) 
parameters,cov=curve_fit(binding_model,molar_ratio,peak_areas,initial_paramaters) 
n=parameters[0] 
Ka=parameters[1] 
dH=parameters[2] 
Ffit=binding_model(molar_ratio,n,Ka,dH) 

Я исправил модель привязки (к одноузельной связывания лиганда модель), но я не могу получить функцию curve_fit работать больше:

#defining function of the binding model 
def binding_model(Mt,Xt,Vcell,Ka,n,dH): 
    return (n*Mt*dH*Vcell/2)*(1+(Xt/(Mt*n))+(1/(n*Ka*Mt)))-((1+(Xt/(n*Mt))+(1/(n*Ka*Mt)))**2-(4*Xt/(Mt*n))**.5) 
#fitting molar enthalpy vs. molar ratio data with binding model 
initial_paramaters=array([1,0,0]) 
parameters=curve_fit(binding_model,Mt,Xt,Vcell,peak_areas,initial_paramaters) 
n=parameters[0] 
Ka=parameters[1] 
dH=parameters[2] 
Ffit=binding_model(Mt,Xt,Ka,n,dH,Vcell) 

Он теперь возвращает «curve_fit() принимает не более 5 аргументов (6) дал» ошибку.

molar_ratio, Mt и Xt - три массива, каждый из которых состоит из 41 значения. Vcell - это целое число, извлеченное из данных. Спасибо, что посмотрели!

+0

Сделайте себе одолжение и разделить формулу. Используйте несколько временных переменных, предоставляя им соответствующие условия. Длинная формула, как и сейчас, является магнитом ошибки. – Davidmh

+0

Как вы это понимаете? Единственными переменными являются Mt и Xt (оба списка равного количества массивов) и Vcell (целое число). Я не знаю, могу ли я сделать это более простым. Спасибо за совет! – MrPibbXIX

+0

Пример: 'term1 = n * Mt * dH * Vcell/2; term2 = 1+ (Xt/(Mt * n); ... return term1 * term2 + ... 'И еще лучше, если вы можете дать' term1, term2 ... 'значимые имена (например, кинетический термин ...) – Davidmh

ответ

1

Вы просто не используете его должным образом;

читать, как это работает here

сказать, что я хотел, чтобы соответствовать полином к некоторым данным;

я мог бы что-то вроде этого:

def quad(xdata, a,b,c): 
    return a * xdata**2 + b * xdata + c 

тогда я мог бы иметь некоторые данные;

xdata = np.array([range(10)]) 
ydata = np.array([1 for _ in xdata]) 

, а затем я мог бы назвать curve_fit;

initial_guess = [0,0,0] 
popt, pcov = scipy.optimize.curve_fit(quad, xdata, ydata, p0=initial_guess) 

print popt # [0,0,1] 

вопрос вы имели в том, что вы не надевали вам первоначальную догадку в массив для p0 аргумента (который не является обязательным в любом случае).

Для вашей функции, попробуйте это (я не проверял, я не питона на этой машине):

def binding_model(xdata,Vcell,Ka,n,dH): 
    Mt = xdata[0] 
    Xt = xdata[1] 
    return (n*Mt*dH*Vcell/2)*(1+(Xt/(Mt*n))+(1/(n*Ka*Mt)))-((1+(Xt/(n*Mt))+(1/(n*Ka*Mt)))**2-(4*Xt/(Mt*n))**.5) 

#fitting molar enthalpy vs. molar ratio data with binding model 

initial_Vcell = 0 
initial_Ka = 0 
initial_n = 0 
initial_dH = 0 

initial_paramaters=array([initial_Vcell, initial_Ka, initial_n, initial_dH]) 
xdata = zip(Mt, Xt) 
parameters, cov = curve_fit(binding_model, xdata, ydata, p0=initial_paramaters) 


Vcell=parameters[0] 
Ka=parameters[1] 
n=parameters[2] 
dH=parameters[3] 

Ffit=binding_model(xdata, Vcell, Ka, n, dH) 
+0

Спасибо за ваш ответ! Не хватает ли строк 5 и 6 в моем коде выше? Кажется, я уже сделал это в форме «initial_parameters». – MrPibbXIX

+0

Вы изменили количество параметров, которые выполняет ваша функция binding_model. Вам нужно добавить их в массив 'initial_parameters'. – will

+0

Процедура' curve_fit', по сути, будет вызывать вашу функцию следующим образом: 'binding_model (xdata, * initial_parameters)', а затем сравнить вывод с 'ydata'. Вам действительно нужно чтобы дать ему вашу функцию, xdata и ydata. – will

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