2016-11-25 3 views
0

내 2 차 곡선 피팅 프로세스에서 경계와 구속 조건을 적용하려고합니다. 목표는 계수 a,bc입니다. 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

어떤 오류가 발생합니까?

코드가 작동해야하는 것처럼 보입니다. 그러나 귀하의 메시지에서 cdelta+b+2*a*x으로 제한하고 코드에는 delta-b-2*a*xpara이 필요하다고하셨습니다. 사인 문제가 있습니까?

또한 delta을 5e-2로 초기화하지만 최대 값은 0으로 설정합니다. 실수로 혼동하는 징후와 관련이있을 수 있습니다.

+0

@M Newville, 죄송합니다! 내 실제 데이터로 코드를 수정했습니다. 나는 여기에 체크하고있다 : 변수에'xx'를 추가 할 수 있습니까? 이 커브 피팅 과정에서 'xx'를 나타내는'xpara '는 어떻게? 여기서 xx는 커브 피팅 프로세스에서 사용할 데이터 인 'xip'입니다. 감사합니다! – learnerADV

+0

나는 당신의 질문을 완전히 이해하고 있는지 확신하지 못합니다. 매개 변수에는 배열이 아닌 스칼라가 있습니다. "2 * a * x + b> 0"이라고 말하면, x는 아마도 배열을 의미합니다. 그러나 이것이 변하지 않기 때문에 "2 * a * x_max + b> 0"을 주장 할 수 있고 적합 전에 x_max의 값을 알 수 있습니다. Stackoverflow 주석은 그러한 토론을하기에 좋은 곳이 아닙니다. 적절한 메일 링리스트를 고려하십시오. –

+0

오케이 뉴빌. 최소화 기능을 사용할 수 있습니다. 나머지 ((y-a * x ** 2-b * x-c) ** 2) .sum()은 목적 함수로 사용됩니다. – learnerADV