이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

fminsearch

비제약 조건 다변수 함수의 최솟값을 도함수 없이 찾기

설명

비선형 계획법 솔버입니다. 다음으로 지정된 문제의 최솟값을 찾습니다.

minxf(x)

f(x)는 스칼라를 반환하는 함수이고, x는 벡터나 행렬입니다.

예제

x = fminsearch(fun,x0)은 점 x0에서 시작하여 fun에 정의된 함수의 국소 최솟값 x를 구하려고 시도합니다.

예제

x = fminsearch(fun,x0,options)는 구조체 options에 지정된 최적화 옵션을 사용하여 최소화합니다. 이 옵션을 설정하려면 optimset을 사용하십시오.

x = fminsearch(problem)problem의 최솟값을 구합니다. 여기서 problem은 구조체입니다.

예제

[x,fval] = fminsearch(___)는 위에 열거된 모든 입력 구문에 대해 목적 함수 fun의 최솟값을 fval로 반환하고, x에는 해가 되는 위치 값을 반환합니다.

[x,fval,exitflag] = fminsearch(___)는 종료 상황을 설명하는 값 exitflag를 추가로 반환합니다.

예제

[x,fval,exitflag,output] = fminsearch(___)는 최적화 과정에 대한 정보가 포함된 구조체 output을 추가로 반환합니다.

예제

모두 축소

로젠브록 함수를 최소화해 보겠습니다. 이 함수는 여러 알고리즘이 풀기 어려워하는 유명한 최적화 문제입니다.

f(x)=100(x2-x12)2+(1-x1)2.

이 함수는 점 x = [1,1]에서 최솟값 0을 가집니다.

시작점을 x0 = [-1.2,1]로 설정하고 fminsearch를 사용하여 로젠브록 함수를 최소화합니다.

fun = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
x0 = [-1.2,1];
x = fminsearch(fun,x0)
x = 1×2

    1.0000    1.0000

fminsearch가 최솟값을 구하려고 시도하는 과정을 모니터링하도록 옵션을 설정합니다.

매 반복 시 목적 함수를 플로팅하도록 옵션을 설정합니다.

options = optimset('PlotFcns',@optimplotfval);

목적 함수를 다음 로젠브록 함수로 설정합니다.

f(x)=100(x2-x12)2+(1-x1)2.

이 함수는 점 x = [1,1]에서 최솟값 0을 가집니다.

시작점을 x0 = [-1.2,1]로 설정하고 fminsearch를 사용하여 로젠브록 함수를 최소화합니다.

fun = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
x0 = [-1.2,1];
x = fminsearch(fun,x0,options)

x = 1×2

    1.0000    1.0000

파일 실행으로 값이 주어지는 목적 함수를 최소화합니다. 함수 파일은 실수형 벡터 x를 받고 목적 함수의 값인 실수형 스칼라를 반환해야 합니다.

다음 코드를 복사한 후 MATLAB® 경로에 objectivefcn1.m이라는 파일로 포함시킵니다.

function f = objectivefcn1(x)
f = 0;
for k = -10:10
    f = f + exp(-(x(1)-x(2))^2 - 2*x(1)^2)*cos(x(2))*sin(2*x(2));
end

x0 = [0.25,-0.25]에서 시작하여 objectivefcn의 최솟값을 찾습니다.

x0 = [0.25,-0.25];
x = fminsearch(@objectivefcn1,x0)
x =

   -0.1696   -0.5086

때때로 목적 함수는 추가 파라미터를 가집니다. 이러한 파라미터는 최적화할 변수가 아니며, 최적화하는 동안 고정될 값입니다. 예를 들어, 다음과 같이 로젠브록 유형의 함수에 파라미터 a가 있다고 가정하겠습니다.

f(x,a)=100(x2-x12)2+(a-x1)2.

이 함수는 x1=a, x2=a2에서 최솟값 0을 가집니다. 예를 들어, a=3인 경우 익명 함수를 만들어서 목적 함수에 이 파라미터를 포함할 수 있습니다.

추가 파라미터를 추가 인수로 지정하여 목적 함수를 만듭니다.

f = @(x,a)100*(x(2) - x(1)^2)^2 + (a-x(1))^2;

이 파라미터를 MATLAB® 작업 공간에 넣습니다.

a = 3;

파라미터의 작업 공간 값을 포함하는 x 단독의 익명 함수를 만듭니다.

fun = @(x)f(x,a);

x0 = [-1,1.9]에서 시작하여 문제를 풉니다.

x0 = [-1,1.9];
x = fminsearch(fun,x0)
x = 1×2

    3.0000    9.0000

목적 함수에 추가 파라미터를 사용하는 방법에 대한 자세한 내용은 함수를 파라미터화하기 항목을 참조하십시오.

fminsearch를 사용하여 목적 함수의 최솟값 위치와 그 최솟값을 모두 구합니다.

변수가 3개인 문제를 위한 익명 목적 함수를 작성합니다.

x0 = [1,2,3];
fun = @(x)-norm(x+x0)^2*exp(-norm(x-x0)^2 + sum(x));

x0에서 시작하여 fun의 최솟값을 갖는 위치를 구합니다. 최솟값도 구합니다.

[x,fval] = fminsearch(fun,x0)
x = 1×3

    1.5359    2.5645    3.5932

fval = -5.9565e+04

최적화가 실행 중일 때와 마친 후에 모두 최적화의 결과를 검사합니다.

반복을 표시하도록 옵션을 설정합니다. 이렇게 하면 솔버 실행에 따른 최적화 정보를 제공받게 됩니다. 또한, 솔버 실행 시 목적 함수 값을 표시하도록 플롯 함수를 설정합니다.

options = optimset('Display','iter','PlotFcns',@optimplotfval);

목적 함수와 시작점을 설정합니다.

function f = objectivefcn1(x)
f = 0;
for k = -10:10
    f = f + exp(-(x(1)-x(2))^2 - 2*x(1)^2)*cos(x(2))*sin(2*x(2));
end

objectivefcn1에 대한 코드를 MATLAB® 경로에 파일로 포함시킵니다.

x0 = [0.25,-0.25];
fun = @objectivefcn1;

모든 솔버 출력값을 가져옵니다. 솔버가 동작을 마친 후 이러한 출력값을 사용하여 결과를 검사합니다.

[x,fval,exitflag,output] = fminsearch(fun,x0,options)
 
 Iteration   Func-count     min f(x)         Procedure
     0            1         -6.70447         
     1            3         -6.89837         initial simplex
     2            5         -7.34101         expand
     3            7         -7.91894         expand
     4            9         -9.07939         expand
     5           11         -10.5047         expand
     6           13         -12.4957         expand
     7           15         -12.6957         reflect
     8           17         -12.8052         contract outside
     9           19         -12.8052         contract inside
    10           21         -13.0189         expand
    11           23         -13.0189         contract inside
    12           25         -13.0374         reflect
    13           27          -13.122         reflect
    14           28          -13.122         reflect
    15           29          -13.122         reflect
    16           31          -13.122         contract outside
    17           33         -13.1279         contract inside
    18           35         -13.1279         contract inside
    19           37         -13.1296         contract inside
    20           39         -13.1301         contract inside
    21           41         -13.1305         reflect
    22           43         -13.1306         contract inside
    23           45         -13.1309         contract inside
    24           47         -13.1309         contract inside
    25           49          -13.131         reflect
    26           51          -13.131         contract inside
    27           53          -13.131         contract inside
    28           55          -13.131         contract inside
    29           57          -13.131         contract outside
    30           59          -13.131         contract inside
    31           61          -13.131         contract inside
    32           63          -13.131         contract inside
    33           65          -13.131         contract outside
    34           67          -13.131         contract inside
    35           69          -13.131         contract inside
 
Optimization terminated:
 the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e-04 
 and F(X) satisfies the convergence criteria using OPTIONS.TolFun of 1.000000e-04 


x =

   -0.1696   -0.5086


fval =

  -13.1310


exitflag =

     1


output = 

  struct with fields:

    iterations: 35
     funcCount: 69
     algorithm: 'Nelder-Mead simplex direct search'
       message: 'Optimization terminated:...'

exitflag 값이 1이며, 이는 fminsearch가 국소 최솟값으로 수렴될 가능성이 있다는 의미입니다.

output 구조체는 반복 횟수를 표시합니다. 반복 표시와 플롯도 이 정보를 표시합니다. output 구조체는 반복 표시가 보여주는 함수 실행 횟수도 표시하지만, 선택한 플롯 함수는 이를 표시하지 않습니다.

입력 인수

모두 축소

최소화할 함수로, 함수 핸들이나 함수 이름으로 지정됩니다. fun은 벡터 또는 배열 x를 받고 실수형 스칼라 f를 반환하는 함수입니다. 즉, x에서 계산되는 목적 함수입니다.

다음과 같이 fun을 파일에 대한 함수 핸들로 지정합니다.

x = fminsearch(@myfun,x0)

여기서 myfun은 다음과 같은 MATLAB® 함수입니다.

function f = myfun(x)
f = ...            % Compute function value at x

다음과 같이 fun을 익명 함수에 대한 함수 핸들로 지정할 수도 있습니다.

x = fminsearch(@(x)norm(x)^2,x0);

예: fun = @(x)-x*exp(-3*x)

데이터형: char | function_handle | string

초기점으로, 실수형 벡터나 실수형 배열로 지정됩니다. 솔버는 x0의 요소 개수와 이 인수의 크기를 사용하여 fun이 받는 변수의 개수와 크기를 확인합니다.

예: x0 = [1,2,3,4]

데이터형: double

최적화 옵션으로, optimset 등이 반환하는 구조체로 지정됩니다. optimset을 사용하여 options 구조체에서 다음 필드의 값을 설정하거나 변경할 수 있습니다. 자세한 내용은 옵션 설정하기 항목을 참조하십시오.

Display

표시 수준(반복 표시 참조):

  • 'notify'(디폴트 값)는 함수가 수렴하지 않는 경우에만 출력값을 표시합니다.

  • 'final'은 최종 출력값만 표시합니다.

  • 'off' 또는 'none'은 출력값을 표시하지 않습니다.

  • 'iter'은 각 반복마다 출력값을 표시합니다.

FunValCheck

목적 함수 값이 유효한지 여부를 확인합니다. 'on'은 목적 함수가 complex 또는 NaN 값을 반환하는 경우에 오류를 표시합니다. 디폴트 값인 'off'는 오류를 표시하지 않습니다.

MaxFunEvals

허용되는 최대 함수 실행 횟수로, 양의 정수입니다. 디폴트 값은 200*numberOfVariables입니다. 허용오차와 중지 조건 항목을 참조하십시오.

MaxIter

허용되는 최대 반복 횟수로, 양의 정수입니다. 디폴트 값은 200*numberOfVariables입니다. 허용오차와 중지 조건 항목을 참조하십시오.

OutputFcn

최적화 함수가, 각 반복마다 함수 핸들 또는 함수 핸들로 구성된 셀형 배열로 호출하는, 하나 이상의 사용자 정의 함수를 지정합니다. 디폴트 값은 없음([])입니다. 출력 함수 항목을 참조하십시오.

PlotFcns

알고리즘이 실행되는 동안 다양한 진행률 측정값을 플로팅합니다. 미리 정의된 플롯에서 선택하거나 사용자가 직접 작성할 수 있습니다. 함수 핸들 또는 함수 핸들 셀형 배열을 전달합니다. 디폴트 값은 없음([])입니다.

  • @optimplotx는 현재 점을 플로팅합니다.

  • @optimplotfunccount는 함수 실행 횟수를 플로팅합니다.

  • @optimplotfval은 함수 값을 플로팅합니다.

사용자 지정 플롯 함수를 작성하는 방법에 대한 자세한 내용은 플롯 함수 항목을 참조하십시오.

TolFun

함수 값에 대한 종료 허용오차로, 양의 스칼라입니다. 디폴트 값은 1e-4입니다. 허용오차와 중지 조건 항목을 참조하십시오. 다른 솔버와 달리, fminsearchTolFunTolX모두 충족되는 경우 중지됩니다.

TolX

x에 대한 종료 허용오차로, 양의 스칼라입니다. 디폴트 값은 1e-4입니다. 허용오차와 중지 조건 항목을 참조하십시오. 다른 솔버와 달리, fminsearchTolFunTolX모두 충족되는 경우 중지됩니다.

예: options = optimset('Display','iter')

데이터형: struct

문제 구조체로, 다음 필드를 가진 구조체로 지정됩니다.

필드 이름항목

objective

목적 함수

x0

x의 초기점

solver

'fminsearch'

options

optimset에서 반환되는 options 구조체

데이터형: struct

출력 인수

모두 축소

해로, 실수형 벡터나 실수형 배열로 반환됩니다. x의 크기는 x0의 크기와 같습니다. 일반적으로 xexitflag가 양수인 경우 문제에 대한 국소해입니다.

해에서 계산된 목적 함수 값으로, 실수로 반환됩니다. 일반적으로 fval=fun(x)입니다.

fminsearch가 중지된 이유로, 정수로 반환됩니다.

1

함수가 해 x로 수렴되었습니다.

0

반복 횟수가 options.MaxIter를 초과하거나, 함수 실행 횟수가 options.MaxFunEvals를 초과했습니다.

-1

출력 함수에 의해 알고리즘이 종료되었습니다.

최적화 과정에 대한 정보로, 다음 필드를 가진 구조체로 반환됩니다.

iterations

반복 횟수

funcCount

함수 실행 횟수

algorithm

'Nelder-Mead simplex direct search'

message

종료 메시지

  • fminsearch는 실수에 대해서만 최소화합니다. 즉, 벡터 또는 배열 x는 실수로만 구성되어야 하고 f(x)는 실수만 반환해야 합니다. x가 복소수 값을 갖는 경우 x를 실수부와 허수부로 분할하십시오.

  • fminsearch를 사용하여 미분 불가능한 문제나 불연속이 있는 문제를 푸십시오. 특히 해 근처에서 불연속이 발생하지 않는 경우 권장됩니다.

알고리즘

fminsearch는 Lagarias 등 [1]의 단체(Simplex) 탐색 메서드를 사용합니다. 이는 fminunc에서처럼 수치 또는 분석 기울기를 사용하지 않는 직접 탐색 메서드입니다. 이 알고리즘에 대한 자세한 내용은 fminsearch 알고리즘 항목을 참조하십시오. 이 알고리즘이 국소 최솟값으로 수렴할 것이라는 보장은 없습니다.

참고 문헌

[1] Lagarias, J. C., J. A. Reeds, M. H. Wright, and P. E. Wright. “Convergence Properties of the Nelder-Mead Simplex Method in Low Dimensions.” SIAM Journal of Optimization. Vol. 9, Number 1, 1998, pp. 112–147.

확장 기능

R2006a 이전에 개발됨