이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
fminsearch
비제약 조건 다변수 함수의 최솟값을 도함수 없이 찾기
구문
설명
비선형 계획법 솔버입니다. 다음으로 지정된 문제의 최솟값을 찾습니다.
f(x)는 스칼라를 반환하는 함수이고, x는 벡터나 행렬입니다.
예제
로젠브록 함수(Rosenbrock Function) 최소화하기
로젠브록 함수를 최소화해 보겠습니다. 이 함수는 여러 알고리즘이 풀기 어려워하는 유명한 최적화 문제입니다.
이 함수는 점 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);
목적 함수를 다음 로젠브록 함수로 설정합니다.
이 함수는 점 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
가 있다고 가정하겠습니다.
이 함수는 , 에서 최솟값 0을 가집니다. 예를 들어, 인 경우 익명 함수를 만들어서 목적 함수에 이 파라미터를 포함할 수 있습니다.
추가 파라미터를 추가 인수로 지정하여 목적 함수를 만듭니다.
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 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
— 최소화할 함수
함수 핸들 | 함수 이름
최소화할 함수로, 함수 핸들이나 함수 이름으로 지정됩니다. fun
은 벡터 또는 배열 x
를 받고 실수형 스칼라 f
를 반환하는 함수입니다. 즉, x
에서 계산되는 목적 함수입니다.
fminsearch
함수는 x
를 x0
인수 형태로 목적 함수에 전달합니다. 예를 들어, x0
이 5×3 배열인 경우 fminsearch
함수는 x
를 fun
에 5×3 배열로 전달합니다.
다음과 같이 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
— 초기점
실수형 벡터 | 실수형 배열
초기점으로, 실수형 벡터나 실수형 배열로 지정됩니다. 솔버는 x0
의 요소 개수와 이 인수의 크기를 사용하여 fun
이 받는 변수의 개수와 크기를 확인합니다.
예: x0 = [1,2,3,4]
데이터형: double
options
— 최적화 옵션
optimset
등이 반환하는 구조체
최적화 옵션으로, optimset
등이 반환하는 구조체로 지정됩니다. optimset
을 사용하여 options 구조체에서 다음 필드의 값을 설정하거나 변경할 수 있습니다. 자세한 내용은 최적화 옵션 설정하기 항목을 참조하십시오.
| 표시 수준(최적화 솔버 반복 표시 참조):
|
FunValCheck | 목적 함수 값이 유효한지 여부를 확인합니다. |
| 허용되는 최대 함수 실행 횟수로, 양의 정수입니다. 디폴트 값은 |
| 허용되는 최대 반복 횟수로, 양의 정수입니다. 디폴트 값은 |
OutputFcn | 최적화 함수가, 각 반복마다 함수 핸들 또는 함수 핸들로 구성된 셀형 배열로 호출하는, 하나 이상의 사용자 정의 함수를 지정합니다. 디폴트 값은 없음( |
| 알고리즘이 실행되는 동안 다양한 진행률 측정값을 플로팅합니다. 미리 정의된 플롯에서 선택하거나 사용자가 직접 작성할 수 있습니다. 함수 이름, 함수 핸들 또는 함수 이름이나 함수 핸들로 구성된 셀형 배열을 전달합니다. 디폴트 값은 없음(
사용자 지정 플롯 함수를 작성하는 방법에 대한 자세한 내용은 최적화 솔버 플롯 함수 항목을 참조하십시오. |
| 함수 값에 대한 종료 허용오차로, 양의 스칼라입니다. 디폴트 값은 |
|
|
예: options = optimset('Display','iter')
데이터형: struct
problem
— 문제 구조체
구조체
문제 구조체로, 다음 필드를 가진 구조체로 지정됩니다.
필드 이름 | 항목 |
---|---|
| 목적 함수 |
| x 의 초기점 |
| 'fminsearch' |
| optimset 에서 반환되는 options 구조체 |
데이터형: struct
출력 인수
fval
— 해에서 계산된 목적 함수 값
실수
해에서 계산된 목적 함수 값으로, 실수로 반환됩니다. 일반적으로 fval
= fun(x)
입니다.
exitflag
— fminsearch
가 중지된 이유
정수
fminsearch
가 중지된 이유로, 정수로 반환됩니다.
| 함수가 해 |
| 반복 횟수가 |
| 출력 함수에 의해 알고리즘이 종료되었습니다. |
output
— 최적화 과정에 대한 정보
구조체
최적화 과정에 대한 정보로, 다음 필드를 가진 구조체로 반환됩니다.
iterations | 반복 횟수 |
funcCount | 함수 실행 횟수 |
algorithm |
|
message | 종료 메시지 |
팁
fminsearch
는 실수에 대해서만 최소화합니다. 즉, 벡터 또는 배열 x는 실수로만 구성되어야 하고 f(x)는 실수만 반환해야 합니다. x가 복소수 값을 갖는 경우 x를 실수부와 허수부로 분할하십시오.fminsearch
를 사용하여 미분 불가능한 문제나 불연속이 있는 문제를 푸십시오. 특히 해 근처에서 불연속이 발생하지 않는 경우 권장됩니다.
알고리즘
fminsearch
는 Lagarias 등 [1]의 단체(Simplex) 탐색 메서드를 사용합니다. 이는 fminunc
(Optimization Toolbox)에서처럼 수치 또는 분석 기울기를 사용하지 않는 직접 탐색 메서드입니다. 이 알고리즘에 대한 자세한 내용은 fminsearch 알고리즘 항목을 참조하십시오. 이 알고리즘이 국소 최솟값으로 수렴할 것이라는 보장은 없습니다.
대체 기능
앱
최적화 라이브 편집기 작업은 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.
확장 기능
C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.
C/C++ 코드 생성의 경우:
fminsearch
는Display
옵션을 무시하며 반복 표시 또는 종료 메시지를 제공하지 않습니다. 해의 질을 검사하려면, 종료 플래그를 검토하십시오.출력 구조체에는
algorithm
필드나message
필드가 포함되지 않습니다.fminsearch
는OutputFcn
옵션과PlotFcns
옵션을 무시합니다.
스레드 기반 환경
MATLAB®의 backgroundPool
을 사용해 백그라운드에서 코드를 실행하거나 Parallel Computing Toolbox™의 ThreadPool
을 사용해 코드 실행 속도를 높일 수 있습니다.
이 함수는 스레드 기반 환경을 완전히 지원합니다. 자세한 내용은 스레드 기반 환경에서 MATLAB 함수 실행하기 항목을 참조하십시오.
버전 내역
R2006a 이전에 개발됨
MATLAB 명령
다음 MATLAB 명령에 해당하는 링크를 클릭했습니다.
명령을 실행하려면 MATLAB 명령 창에 입력하십시오. 웹 브라우저는 MATLAB 명령을 지원하지 않습니다.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)