fminunc
를 사용한 제약 조건이 없는 최소화
이 예제에서는 fminunc
를 사용하여 비선형 최소화 문제를 푸는 방법을 보여줍니다.
이 2차원 문제를 풀기 위해, 를 반환하는 함수를 작성합니다. 그런 다음 초기점 x0 = [-1,1]
에서부터 시작하여 제약 조건이 없는 최소화 루틴 fminunc
를 불러옵니다.
이 예제의 마지막 부분에 있는 헬퍼 함수 objfun
이 를 계산합니다.
의 최솟값을 구하기 위해 초기점을 설정하고 fminunc
를 호출합니다.
x0 = [-1,1]; [x,fval,exitflag,output] = fminunc(@objfun,x0);
Local minimum found. Optimization completed because the size of the gradient is less than the value of the optimality tolerance. <stopping criteria details>
output
구조체에 저장된 1차 최적성 측정값을 비롯하여 결과값을 봅니다.
disp(x)
0.5000 -1.0000
disp(fval)
3.6609e-15
disp(exitflag)
1
disp(output.firstorderopt)
1.2284e-07
exitflag
출력값은 알고리즘이 수렴되었는지 여부를 표시합니다. exitflag
= 1은 fminunc
가 국소 최솟값을 발견했음을 의미합니다.
output
구조체는 최적화에 대한 더욱 상세한 정보를 제공합니다. fminunc
의 output 구조체에는 다음이 포함됩니다.
output.iterations
- 반복 횟수output.funcCount
- 함수 실행 횟수output.stepsize
- 최종 스텝 크기output.firstorderopt
- 1차 최적성 측정값(이 솔버처럼 제약 조건이 없는 경우에는 해에서의 기울기의 무한대 노름임)output.algorithm
- 사용된 알고리즘의 유형output.message
- 알고리즘이 중지된 이유
헬퍼 함수
다음 코드는 objfun
헬퍼 함수를 생성합니다.
function f = objfun(x) f = exp(x(1)) * (4*x(1)^2 + 2*x(2)^2 + 4*x(1)*x(2) + 2*x(2) + 1); end