2011-10-17 6 views
2

NMinimize 함수를 사용하여 다음 함수의 전역 최소값을 찾으려고했습니다.Mathematica의 NMinimize 함수

f = {s1 - Log[1000/{Norm[{2.83, 0, 2} - {u, v, w}]}^3]}^2 + {s2 - 
     Log[1000/{Norm[{0, 2.83, -2} - {u, v, w}]}^3]}^2 + {s3 - 
     Log[1000/{Norm[{-2.83, 0, 2} - {u, v, w}]}^3]}^2 + {s4 - 
     Log[1000/{Norm[{0, -2.83, -2} - {u, v, w}]}^3]}^2; 
NMinimize[f, {u, v, w}, Method -> {"DifferentialEvolution"}]. 

최적화는 제한되지 않은 최적화입니다. 다음은 내가 실행할 때마다받는 오류입니다.

"NMinimize :: nnum"함수 값 2.67476 {{}}하지 {U, V, W} = {} 0.673558,0.659492,0.0861047에서 숫자 "

I 내가 잘못 가고 있는지 잘 모르겠다.이 종류의 오류가있을 때 NMinimize 출력에서 ​​값을 추출하고 중지 규칙을 설정하는 방법이있다. 이 코드를 디버깅 할 때 도와주세요. 감사합니다. 도움을 위해 사전에 님

+0

@rcollyer - 당신이 정말로 구문 강조에 있어요, 내가 그림 : – Verbeia

+0

@Verbeia 참조 어쨌든 편집 중이라면 더 읽기 쉽게 만들 수 있습니다. 그것은 완벽하지는 않지만 충분히 효과적입니다. – rcollyer

답변

5

중괄호는 Mathem atica, 그래서 당신의 함수는 스칼라가 아닌 단일 원소 행렬을 출력합니다. 그룹화에 사용하는 {} 쌍을 일반 괄호로 변경하십시오. 이중 중괄호를 사용한다는 사실은 변환 할 중괄호가 두 가지 수준임을 보여줍니다. 입력의 나머지 기계 정밀도 실수이기 때문에

f = (s1 - Log[1000./(Norm[{2.83, 0, 2} - {u, v, w}])^3])^2 + (s2 - 
     Log[1000./(Norm[{0, 2.83, -2} - {u, v, w}])^3])^2 + (s3 - 
     Log[1000./(Norm[{-2.83, 0, 2} - {u, v, w}])^3])^2 + (s4 - 
     Log[1000./(Norm[{0, -2.83, -2} - {u, v, w}])^3])^2; 

다른 비로서, I는 실수 (1000.)에 Integer 값 (1000)를 변경할 것이다. 브렛 (Brett)이 의견에서 언급했듯이 출력은 전혀 다르지 않지만 반복 계산을 많이한다면 작은 성능 향상이 눈치 챌 수도 있고 더 원할 경우 더 쉽게 Compile 함수를 사용할 수 있습니다 성능 향상.

(. 나는 그것이 1 * 1 매트릭스 출력이 아닌 벡터 출력했다 깨달았을 때 편집)

+3

'1000' 대'1000.'은 여기에 차이를 두어서는 안됩니다. 어쨌든 기계 정밀도를 강요 받게 될 것입니다. –

+1

@BrettChampion - 당신은 출력이 똑같을 것이 틀림 없다. 그러나 작은 성능 향상이있을 것이다. 그것은 내가 의미하는 바이지만 편집에서 제외 할 수있다. 나는 대답에서 그것을 더 명확하게 만들 것이다. – Verbeia

+2

'1000' 대신'1000.'을 사용하면 내 컴퓨터에서 약 0.2 %의 속도가 빨라집니다 (s1, s2, s3, s4의 임의 값 사용). 반면에'h = Simplify [f , Element [u | v | w, Reals]]'규범과 관련 절대 값을 없애기 위해 (제곱을 버림으로써 ....) –

관련 문제