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.
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