2013-03-21 2 views
1

저는 scipy (scipy.optimize.curve_fit)를 사용하여 파이썬 프로그램을 작성하고 있습니다. 데이터 집합에 여러 개의 커브를 맞추고이를 합계해야합니다. 첫 번째 단계는 모든 최대 값을 찾는 것입니다. 적어도 하나는 있지만 일반적으로 더 많을 것입니다. 나는 다음과 같은 것을 일반화하고 싶다.람다 용 변수 변경

if (len(Maxima) == 1): 
    f = lambda a, b, c : a * exp((b * x) + c) 
else if (len(Maxima) == 2): 
    f = lambda a, b, c, d, e, f : (a * exp((b * x) + c)) + (d * exp((e * x) + f) 

등등. curve_fit은 (3 * Maxima) 매개 변수가 있다는 것을 인식하여 필요할 때 찾을 수 있습니다. 위의 문장을하는 것은 실용적이지 않으므로 20 개 정도의 곡선이있을 수 있습니다.

도움을 주시면 감사하겠습니다.

감사합니다.

편집 : 죄송합니다. 기능이 최대치에 종속되어 있습니다. 실제로 각 맥시마에 집중된 가우스 분포입니다.

e.e. 용어는 실제로

f = (a * (Gamma ** 2)/(((E - Maxima[i])**2) + (b**2))) 

이고 E는 args가 시작해야하는 독립 변수입니다.

len(Maxima) == 2 

인수에 대한 예를 들어

는 내 실수에 대한

E, a0, b0, Maxima[0], a1, b1, Maxima[1] 

죄송 할 것이다.

Edit2가 :

나는 이런 식으로 뭔가를 생각하고 있어요 :

GaussianDistribution = lambda E, E0, I0, Sigma : (I0 * np.exp(-(((E - E0)/Sigma)**2))) 
args = tuple([long] * ((len(Maxima) * 3) + 1)) 
d1, d2 = sc.curve_fit(GaussianDistribution(*args), Data[:, 0], Data[:, 1]) 

답변

0

당신은 arbitrary argument lists을 사용하여 인수의 수를 소요 람다 함수를 만들 수 있습니다. 그런 다음 목록 이해를 사용하여 인수를 한 번에 3 개씩 가져와 작업을 수행 한 다음 결과를 더할 수 있습니다.

f = lambda *args: sum(args[i] * exp((args[i+1]*x)+args[i+2]) for i in range(0, len(args)-3, 3)) 
+0

죄송합니다. 일부 정보를 놓치 셨습니다. 여기에 게시하기에는 너무 길기 때문에 소개에 추가했습니다. – Jacob

0

나는이 올바른 얻을 경우, 당신은 하나의 람다와 함께 작동 할 수 있어야한다 :

f = lambda a, b, c : a * exp((b * x) + c) 

maxima 양식의 경우 다음

result = sum(f(a, b, c) for a, b, c in maxima) 

maxima = [(1, 2, 3), (4, 5, 6), (7, 9, 8)] 

(I gu ess).