2016-11-25 3 views
0

Я пытаюсь наложить ограничения и ограничения в моем процессе построения квадратичной кривой. Цель состоит в том, чтобы найти коэффициенты a,b и c. Наложение ограничений на b: delta-2*a*x - мое сомнение. Как добавить переменную x в мои ограничения. Рабочий код:Ограничения на параметры подгонки кривой

from lmfit import Model, Parameters 

#create x and y data to be used for curve fitting 
xip=[ 0.02237461, 0.0983837 , 0.25707382, 0.56959641, 1.33419197, 4.95835927] 
yip=[0.20085822, 0.23583258, 0.28996988, 0.36350284, 0.47981232, 0.67602165] 

#function to fit data: a,b,c needs to be found 
def f(xx, a, b, c): 
    # constraints: c <=0, a>0 and 2*a*x+b >= 0 
    return a*xx**2 + b*xx + c 

fmodel = Model(f) 
params = Parameters() 

params.add('a', value=-1e-2, vary=True, min = -1e10, max = 0) 
params.add('c', value=-4e-2, vary=True, min = -1e10, max =0) 
params.add('delta', value=5e-2, vary=True, min=0, max=1e10) 
params.add('xpara', value=5, vary=True) 
params.add('b', expr = 'delta-2*a*xpara') 

result = fmodel.fit(yip, params, xx=xip) 
print(result.fit_report()) 


import matplotlib.pyplot as plt 
op = plt.subplot(1,1,1) 
op.scatter(xip,yip) 
plt.plot(xip, result.init_fit, 'k--') 
#plt.plot(xip, result.best_fit, 'r-') 

Спасибо!

Редактировать: Я изменил переменные, чтобы эта программа работала. Но не уверен, что это правильный способ применения ограничений.

Редактировать 2: добавлены необходимые ограничения: c < = 0, a> 0 и 2 * a * x + b> = 0;

ответ

0

Какая ошибка у вас возникла?

Мне кажется, что код должен работать. Но в своем сообщении вы сказали, что хотите ограничить c, чтобы быть delta+b+2*a*x, а в вашем коде у вас есть delta-b-2*a*xpara. Есть ли проблема с знаками?

Вы также инициализируете delta до 5e-2, но устанавливаете его максимальное значение равным 0. Это похоже на ошибку, возможно, связанную с запутанными знаками.

+0

@M Newville, Извините! Я изменил свой код с моими фактическими данными. Я здесь, чтобы проверить: можно ли добавлять переменные 'xx' в ограничения? Как 'xpara' представляет' xx' в этом процессе подгонки кривой. где xx - не что иное, как 'xip', данные, которые будут использоваться в процессе подгонки кривой. Спасибо! – learnerADV

+0

Я не уверен, что полностью понимаю ваш вопрос. Параметры имеют скаляры, а не массивы. Когда вы говорите «2 * a * x + b> 0», x, вероятно, должен быть массивом. Но так как это не меняется, вы можете утверждать, что «2 * a * x_max + b> 0» и знать значение для x_max перед посадкой. Комментарии Stackoverflow не являются отличным местом для такого обсуждения. Пожалуйста, рассмотрите соответствующие списки рассылки. –

+0

Okay Newville. Я мог бы использовать функцию минимизации. В качестве целевой функции используется остаток '((y-a * x ** 2-b * x-c) ** 2) .sum()'. – learnerADV

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