6

Mathematica에서 "블랙 박스"함수의 수치 최적화를 시도하고 있습니다. 개략적으로는 다음과 같이 진행한다 :Mathematica : 블랙 박스 함수의 수치 최적화시 평가 순서

빗 [X, Y, Z는이 유사하게 정의된다
NMinimize[{comb[x,y,z], x > 0}, {x,y,z}] 

는 :

comb[x_,y_,z_] := Module[{}, 
    Print[x,y,z]; 
    M = FindMaximum[SkewNormal[a,x,y,z], {a,x}] // First; 
    val = f[x,y,z,M]; 
    Return[val]; 
]; 

하지만, I는 시도 최소화 함수의 모든 즉시 제공 할 것 comb [x, y, z]를 수치로 나타내면 PrintMaximum을 x, y, z에 대한 기호 값으로 평가하려고합니다. Print [x, y, z]도 기호 적으로 평가되므로 쉽게 검증됩니다. 따라서 Findmaximum이 실패합니다 (FindMaximum :: nrnum : 함수 값이 실수가 아닙니다). 따라서 최소화가 실패합니다.

빗의 하위 기능이 숫자 값으로 평가되도록 평가 순서를 수정하려면 어떻게해야합니까?

+1

최근 'NMinimize'의 심볼 사전 처리로 인해 다른 문제가 (다른 스레드보다) 해결되었습니다 (http://stackoverflow.com/questions/6971536/nminimize-eats-all-memory- 불필요한 상징적 인 작업/6975501 # 6975501) by Daniel Lichtblau. –

+0

감사합니다. 확인해 보겠습니다. 나는 또한 Mathematica 8에서이 문제가 발생하지 않는다는 것을 발견했다. –

답변

4

어떻게

comb의 정의는 인수가 숫자가있는 경우에만 평가됩니다
comb[x_?NumericQ, y_?NumericQ, z_?NumericQ] := 
Module[{}, Print[x, y, z]; 
M = FindMaximum[SkewNormal[a, x, y, z], {a, x}] // First; 
val = f[x, y, z, M]; 
Return[val];]; 

comb 변경에 대한? FindMinimum, FindMaximum, FindRootFindFit에 대한

+1

Nah는 도움이되지 않습니다. 내 기능은 실제로 이미 그것을했는데, 나는이 질문을하기 위해이 비트들을 제거했다. –

+1

@Ben은'Print'도 기호 값을 가진'comb [x, y, z]'가 내가 준 정의와 일치하지 않기 때문에 상징 값을 보여줄 것이라고 이상합니다. 이걸 실행하기 전에 '빗'을 지우셨습니까? 어쩌면'NumericQ' 비트가없는 정의와 일치 할 수도 있습니다. – acl

+0

@acl 이것은 처음에는 나에게 도움이되지 못했지만 정리 후에 트릭을 수행했습니다. –

5

평가 순서는 tutorial/UnconstrainedOptimizationSymbolicEvaluation 문서 페이지에 설명되어 있습니다. 매우 비슷한 것이 NMinimize 함수에 적용 가능하다고 생각합니다. 내가 여기에 해당 페이지 만 제안 된 솔루션을 인용 있도록 설명은 매우 긴 것입니다 :

함수가 의도 또는 엄청나게 느린 것 같은 상징적 인 평가가 기능을 유지하지 않도록이다

경우 을 정의해야합니다 함수를 사용하여 변수 의 숫자 값만 계산되도록하십시오. 가장 간단한 방법은 f [x_? NumberQ] : = definition 에서처럼 PatternTest (?)를 사용하여 함수 을 정의하는 것입니다.

기호화 된 평가는 단지 이 그것을 방지하기 위해 특별히 정의해야하기 때문에 방해가되는 것처럼 보일 수 있습니다. 그러나 상징적 인 평가가 없다면 Mathematica는 숫자와 기호력의 고유 한 조합 인 을 사용하기가 어렵습니다. 기호 평가는 알고리즘 결정, 파생어 자동 계산, 자동 최적화 및 편집, 구조 분석과 같은 기호 분석에서 오는 이점을 명령이 일관되게 취할 수 있음을 의미합니다.