주요 콘텐츠

fminunc를 사용한 제약 조건이 없는 최소화

이 예제에서는 fminunc를 사용하여 비선형 최소화 문제를 푸는 방법을 보여줍니다.

minxf(x)=ex1(4x12+2x22+4x1x2+2x2+1).

이 2차원 문제를 풀기 위해, f(x)를 반환하는 함수를 작성합니다. 그런 다음 초기점 x0 = [-1,1]에서부터 시작하여 제약 조건이 없는 최소화 루틴 fminunc를 불러옵니다.

이 예제의 마지막 부분에 있는 헬퍼 함수 objfunf(x)를 계산합니다.

f(x)의 최솟값을 구하기 위해 초기점을 설정하고 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

참고 항목

도움말 항목