비선형 함수 최적화하기
일변수 함수 최소화하기
단일 변수의 수학 함수가 주어진 경우 fminbnd
함수를 사용하여, 지정된 구간에서 함수의 국소 최소점을 구할 수 있습니다. MATLAB®과 함께 제공되는 humps.m
함수를 예로 들어 보겠습니다. 다음 그림은 humps
의 그래프를 보여줍니다.
x = -1:.01:2; y = humps(x); plot(x,y) xlabel('x') ylabel('humps(x)') grid on
범위 (0.3,1)
에서 humps
함수의 최솟값을 구하려면 다음을 사용하십시오.
x = fminbnd(@humps,0.3,1)
x = 0.6370
optimset
를 사용하여 Display
옵션을 'iter'
로 설정하면 풀이 과정을 자세하게 확인할 수 있습니다. 결과 옵션을 fminbnd
로 전달하십시오.
options = optimset('Display','iter'); x = fminbnd(@humps,0.3,1,options)
Func-count x f(x) Procedure 1 0.567376 12.9098 initial 2 0.732624 13.7746 golden 3 0.465248 25.1714 golden 4 0.644416 11.2693 parabolic 5 0.6413 11.2583 parabolic 6 0.637618 11.2529 parabolic 7 0.636985 11.2528 parabolic 8 0.637019 11.2528 parabolic 9 0.637052 11.2528 parabolic Optimization terminated: the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e-04
x = 0.6370
반복 표시는 함수가 실행될 때마다 x
의 현재 값과 f(x)
의 함수 값을 표시합니다. fminbnd
의 경우 함수를 한 번 실행하는 것은 알고리즘을 1회 반복하는 것과 같습니다. 마지막 열은 fminbnd
가 황금분할 탐색과 포물선 보간 중 각 반복에서 어떤 절차를 사용했는지 보여줍니다. 자세한 내용은 최적화 솔버 반복 표시 항목을 참조하십시오.
참고: 최적화 솔버는 실수 값 함수에 적용됩니다. 복소수 값은 최적화할 수 없습니다. 단, 노름과 같은 복소수 값의 실수 값 함수는 예외입니다.
다변수 함수 최소화하기
fminsearch
함수는 다변수의 함수를 처리한다는 점을 제외하고 fminbnd
와 유사합니다. 시작 구간이 아닌 시작 벡터 x0을 지정하십시오. fminsearch
는 이 시작 벡터 근처에 있는, 수학적 함수의 국소 최소점인 벡터 x를 반환하려고 시도합니다.
fminsearch
를 사용해 보기 위해, 먼저 세 개의 변수 x
, y
, z
를 갖는 함수 three_var
를 만들어 보겠습니다.
function b = three_var(v)
x = v(1);
y = v(2);
z = v(3);
b = x.^2 + 2.5*sin(y) - z^2*x^2*y^2;
이제, x = -0.6
, y = -1.2
, z = 0.135
를 시작 값으로 사용하여 이 함수의 최솟값을 구합니다.
v = [-0.6,-1.2,0.135]; a = fminsearch(@three_var,v)
a = 0.0000 -1.5708 0.1803
참고
최적화 솔버는 실수 값 함수에 적용됩니다. 복소수 값은 최적화할 수 없습니다. 단, 노름과 같은 복소수 값의 실수 값 함수는 예외입니다.
함수 최대화하기
fminbnd
솔버와 fminsearch
솔버는 목적 함수를 최소화하려고 시도합니다. 최대화 문제, 즉 다음과 같은 형식의 문제가 있으면
g(x) = –f(x)를 정의하고 g를 최소화하여 문제를 풀 수 있습니다.
예를 들어, x = 5 근처에서 tan(cos(x))의 최댓값을 구하려면 다음을 실행할 수 있습니다.
[x fval] = fminbnd(@(x)-tan(cos(x)),3,8)
x = 6.2832 fval = -1.5574
최댓값은 1.5574(보고된 fval
의 음수 값)이고 x = 6.2832에 나타납니다. 이 답은, 최댓값이 tan(1) = 1.5574(5자리까지)이고 x = 2π = 6.2832에 나타나므로 맞습니다.
fminsearch
알고리즘
fminsearch
는 Lagarias et al. [1]에 설명된 넬더-미드 단체 알고리즘을 사용합니다. 이 알고리즘은 n차원 벡터 x에 대해 n + 1개의 점으로 구성된 단체를 사용합니다. 이 알고리즘은 먼저 초기 추측값 x0을 기준으로 단체를 만듭니다. 즉, x0에 각 성분 x0(i)의 5%를 더합니다. 그런 다음 이 알고리즘은 이러한 n개의 벡터를 x0과 함께 단체의 요소로 사용합니다. (x0(i) = 0이면 0.00025를 성분 i로 사용합니다.) 그런 다음, 이 알고리즘은 다음 절차에 따라 단체를 반복해서 수정합니다.
참고
각 단계의 설명 끝에는 fminsearch
반복 표시의 키워드가 굵게 표시되어 있습니다.
x(i)가 현재 단체 i = 1,...,n + 1의 점 목록을 표시하도록 합니다.
단체의 점을 가장 낮은 함수 값 f(x(1))에서 가장 높은 함수 값 f(x(n + 1)) 순서로 정렬합니다. 반복의 각 단계에서, 알고리즘은 현재 가장 부적합한 점 x(n + 1)을 버리고 다른 점을 단체에 포함시킵니다. 또는, 아래 7단계의 경우 이 알고리즘은 f(x(1))보다 큰 값을 갖는 n개의 점을 모두 바꿉니다.
반사된 점을 생성합니다.
r = 2m – x(n + 1), (1) 여기서
입니다.m = Σx(i)/n이고, i = 1...n (2) 그런 다음 f(r)을 계산합니다.
f(x(1)) ≤ f(r) < f(x(n))이면 r을 받고 이 반복을 중지합니다. 반사(Reflect)
f(r) < f(x(1))이면 확장 점 s를 계산합니다.
s = m + 2(m – x(n + 1)), (3) 그런 다음 f(s)를 계산합니다.
f(s) < f(r)이면 s를 받고 반복을 중지합니다. 확장(Expand)
그렇지 않으면 r을 받고 반복을 중지합니다. 반사(Reflect)
f(r) ≥ f(x(n))이면 m과 x(n + 1) 또는 r 간에(어느 쪽의 목적 함수 값이 더 낮은지에 따라 결정) 수축(Contraction)을 수행합니다.
f(r) < f(x(n + 1))(즉, r이 x(n + 1)보다 더 좋은 값이면) 다음을 계산합니다.
c = m + (r – m)/2 (4) 그런 다음 f(c)를 계산합니다. f(c) < f(r)이면 c를 받고 반복을 중지합니다. 외부로 수축(Contract outside)
그렇지 않으면 7단계(축소(Shrink))를 계속 진행합니다.
f(r) ≥ f(x(n + 1))이면 다음을 계산합니다.
cc = m + (x(n + 1) – m)/2 (5) 그런 다음 f(cc)를 계산합니다. f(cc) < f(x(n + 1))이면 cc를 받고 반복을 중지합니다. 내부로 수축(Contract inside)
그렇지 않으면 7단계(축소(Shrink))를 계속 진행합니다.
n개의 점을 계산합니다.
v(i) = x(1) + (x(i) – x(1))/2 (6) 그런 다음 f(v(i))를 계산합니다(i = 2,...,n + 1). 다음 반복 시 단체는 x(1), v(2),...,v(n + 1)이 됩니다. 축소(Shrink)
다음 그림은 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.
관련 항목
- 최적화 문제 해결과 팁
- 비선형 최적화 (Optimization Toolbox)
- 최적화를 통한 곡선 피팅