Main Content

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.

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

관련 예제

세부 정보