ROOT 데이터 분석 프레임 워크의 일부인 Minuit2 최소화기를 사용하여 물리적 한계가있는 매개 변수의 윤곽 플롯을 생성하려고합니다.매개 변수 한계가있는 루트 minuit2 윤곽
>>> from minuit2 import Minuit2
>>> def f(x,y):
... if x < 0 or y < 0:
... print 'x = %.2f, y = %.2f' % (x,y)
... raise Exception
... return x**2 + y**2
...
>>> m = Minuit2(f)
>>> m.limits['x'] = 0, 10
>>> m.limits['y'] = 0, 10
>>> m.migrad()
>>> xy = m.contour('x','y',3)
Info in <Minuit2>: MnMinos UP value has changed, need to update FunctionMinimum class
x = -9.95, y = 0.00
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in f
Exception
누군가 다른 사람이 또는 유사한 문제를 다루었 다 : 불행하게도, Minuit2 내가 윤곽 플롯을 생성 할 때 한계 이외의 지역으로 매개 변수를 표류에 대한 의도를 보인다? 해결 방법이 있습니까?
나는이 질문을 이미 ROOT forums에 요청했지만이 문제 나 비슷한 문제를 처리 한 스택 오버플로 사용자가있을 수도 있다고 생각했습니다.
단순히 예외를 발생시키지 않을 수 없습니다. 매개 변수 한계는 물리적 경계를 나타내며이 한계를 벗어나는 chi^2를 평가할 수 없습니다. 나는 당신이 제안한 것처럼 큰 숫자를 단순히 반환하려고 시도했지만 Minuit는 내가 준 간단한 예제보다 더 복잡한 시나리오에서 죽습니다. 예를 들어,'f (x, y, z)'를 시도하고'x'와'y'에 한계를 설정 만합니다. Minuit *가 내가 설정 한 한계를 존중해서는 안되는 이유를 이해할 수 없습니다. 내 기능이 정의되지 않은 물리적 한계입니다. – user545424
Minuit.migrad()를 매개 변수 한계와 함께 실행하면 Minuit는 [Minuit 사용자 안내서] (http://seal.web.cern.ch/seal/documents/minuit)의 1.3.1 절에 설명 된 매개 변수 변환을 수행합니다 /mnusersguide.pdf). 'Minuit.contour()'가 매개 변수 변환없이 실행된다고 가정합니다 (코드를 보거나 CONTOUR 구현에 대한 설명을 찾으려면 복잡한 경우 Minuit에서 윤곽을 가져올 방법이 없습니다) . – Christoph
예를 들어 다른 패키지를 사용할 수 있습니다. [lmfit-py] (http://newville.github.com/lmfit-py) 또는'(x, y)'점의 그리드에서 비용 함수를 계산하거나 Minuit.migrad를 실행하여 등고선을 계산하십시오)''(x, y)'그리드에서 더 많은 매개 변수를 갖고있는 경우'x'와'y'를 고정시킨 다음 예를 들어 matplotlib를 사용하여 등고선을 계산합니까? 물론 이것은 느리지 만 실제 작업을 더 많이 수행하기 때문에 더 많은 제어가 가능하며 복잡한 경우에도 작동 할 수 있습니다. 이 제안이 이상하게 들릴 경우 코드 스 니펫을 제공 할 수 있습니다. – Christoph