Main Content

solve

최적화 문제 또는 방정식 문제 풀기

설명

solve를 사용하여 최적화 문제 또는 방정식 문제의 해를 구합니다.

전체 워크플로는 문제 기반 최적화 워크플로 또는 방정식 풀이를 위한 문제 기반 워크플로 항목을 참조하십시오.

예제

sol = solve(prob)는 최적화 문제 또는 방정식 문제 prob를 풉니다.

예제

sol = solve(prob,x0)은 점 또는 값 집합 x0에서 시작하여 prob를 풉니다.

예제

sol = solve(prob,x0,ms)는 복수 시작점 솔버 ms 를 사용하여 prob를 풉니다. ms 인수를 사용하지 않았을 때 얻은 해보다 더 나은 해를 찾으려면 이 구문을 사용하십시오.

예제

sol = solve(___,Name,Value)는 위에 열거된 구문의 입력 인수 외에 하나 이상의 이름-값 쌍 인수를 사용하여 풀이 과정을 수정합니다.

[sol,fval] = solve(___)는 위에 열거된 구문에 나와 있는 입력 인수를 사용하여 해에서 계산된 목적 함수 값을 반환합니다.

예제

[sol,fval,exitflag,output,lambda] = solve(___)는 종료 상태를 설명하는 종료 플래그, 풀이 과정에 대한 추가 정보 output 구조체, 그리고 정수가 아닌 최적화 문제에 대한 라그랑주 승수 구조체도 반환합니다.

예제

모두 축소

최적화 문제로 정의된 선형 계획법 문제를 풉니다.

x = optimvar('x');
y = optimvar('y');
prob = optimproblem;
prob.Objective = -x - y/3;
prob.Constraints.cons1 = x + y <= 2;
prob.Constraints.cons2 = x + y/4 <= 1;
prob.Constraints.cons3 = x - y <= 2;
prob.Constraints.cons4 = x/4 + y >= -1;
prob.Constraints.cons5 = x + y >= 1;
prob.Constraints.cons6 = -x + y <= 2;

sol = solve(prob)
Solving problem using linprog.

Optimal solution found.
sol = struct with fields:
    x: 0.6667
    y: 1.3333

MATLAB®에 포함되어 있는 peaks 함수의 최솟값을 영역 x2+y24에서 구합니다. 이를 위해 최적화 변수 xy를 생성합니다.

x = optimvar('x');
y = optimvar('y');

peaks를 목적 함수로 갖는 최적화 문제를 만듭니다.

prob = optimproblem("Objective",peaks(x,y));

제약 조건을 최적화 변수에 부등식으로 포함시킵니다.

prob.Constraints = x^2 + y^2 <= 4;

초기점을 x는 1로, y는 –1로 설정하고 문제를 풉니다.

x0.x = 1;
x0.y = -1;
sol = solve(prob,x0)
Solving problem using fmincon.

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
sol = struct with fields:
    x: 0.2283
    y: -1.6255

지원되지 않는 함수는 fcn2optimexpr을 필요로 함

목적 함수 또는 비선형 제약 조건 함수가 기본 함수로 완전히 구성되지 않은 경우 fcn2optimexpr을 사용하여 함수를 최적화 표현식으로 변환해야 합니다. Convert Nonlinear Function to Optimization Expression 항목과 Supported Operations for Optimization Variables and Expressions 항목을 참조하십시오.

현재 예제를 변환하기 위해 다음을 수행합니다.

convpeaks = fcn2optimexpr(@peaks,x,y);
prob.Objective = convpeaks;
sol2 = solve(prob,x0)
Solving problem using fmincon.

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
sol2 = struct with fields:
    x: 0.2283
    y: -1.6255

Copyright 2018–2020 The MathWorks, Inc.

초기 실현가능점을 사용하는 경우와 사용하지 않는 경우에 정수 계획법 문제를 푸는 데 실행되는 스텝의 개수를 비교합니다. 이 문제에는 8개의 정수 변수와 4개의 선형 등식 제약 조건이 있고, 모든 변수가 양수로 제한됩니다.

prob = optimproblem;
x = optimvar('x',8,1,'LowerBound',0,'Type','integer');

4개의 선형 등식 제약 조건을 만들어 문제에 포함합니다.

Aeq = [22    13    26    33    21     3    14    26
    39    16    22    28    26    30    23    24
    18    14    29    27    30    38    26    26
    41    26    28    36    18    38    16    26];
beq = [ 7872
       10466
       11322
       12058];
cons = Aeq*x == beq;
prob.Constraints.cons = cons;

목적 함수를 만들어 문제에 포함합니다.

f = [2    10    13    17     7     5     7     3];
prob.Objective = f*x;

초기점을 사용하지 않고 문제를 푼 후 표시 내용을 검토하여 분기한정 노드의 개수를 확인합니다.

[x1,fval1,exitflag1,output1] = solve(prob);
Solving problem using intlinprog.
LP:                Optimal objective value is 1554.047531.                                          

Cut Generation:    Applied 8 strong CG cuts.                                                        
                   Lower bound is 1591.000000.                                                      

Branch and Bound:

   nodes     total   num int        integer       relative                                          
explored  time (s)  solution           fval        gap (%)                                         
   10000      0.41         0              -              -                                          
   14739      0.58         1   2.154000e+03   2.593968e+01                                          
   18258      0.73         2   1.854000e+03   1.180593e+01                                          
   18673      0.75         2   1.854000e+03   1.563342e+00                                          
   18829      0.76         2   1.854000e+03   0.000000e+00                                          

Optimal solution found.

Intlinprog stopped because the objective value is within a gap tolerance of the optimal value, options.AbsoluteGapTolerance = 0. The intcon variables are integer within tolerance, options.IntegerTolerance = 1e-05.

비교를 위해 초기 실현가능점을 사용하여 해를 구합니다.

x0.x = [8 62 23 103 53 84 46 34]';
[x2,fval2,exitflag2,output2] = solve(prob,x0);
Solving problem using intlinprog.
LP:                Optimal objective value is 1554.047531.                                          

Cut Generation:    Applied 8 strong CG cuts.                                                        
                   Lower bound is 1591.000000.                                                      
                   Relative gap is 59.20%.                                                         

Branch and Bound:

   nodes     total   num int        integer       relative                                          
explored  time (s)  solution           fval        gap (%)                                         
    3627      0.22         2   2.154000e+03   2.593968e+01                                          
    5844      0.31         3   1.854000e+03   1.180593e+01                                          
    6204      0.33         3   1.854000e+03   1.455526e+00                                          
    6400      0.34         3   1.854000e+03   0.000000e+00                                          

Optimal solution found.

Intlinprog stopped because the objective value is within a gap tolerance of the optimal value, options.AbsoluteGapTolerance = 0. The intcon variables are integer within tolerance, options.IntegerTolerance = 1e-05.
fprintf('Without an initial point, solve took %d steps.\nWith an initial point, solve took %d steps.',output1.numnodes,output2.numnodes)
Without an initial point, solve took 18829 steps.
With an initial point, solve took 6400 steps.

초기점을 제공한다고 해서 항상 문제가 개선되는 것은 아닙니다. 이 문제에서는 초기점을 사용함으로써 시간과 계산 스텝을 절약할 수 있습니다. 그러나, 일부 문제에서는 초기점으로 인해 solve가 더 많은 스텝을 실행하게 될 수 있습니다.

일부 솔버의 경우, 목적 함수 값과 제약 조건 함수 값(있는 경우)을 x0 인수의 solve에 전달할 수 있습니다. 이 경우 솔버에서 시간을 절약할 수 있습니다. OptimizationValues 객체로 구성된 벡터를 전달합니다. 이 벡터는 optimvalues 함수를 사용하여 만듭니다.

목적 함수 값을 사용할 수 있는 솔버는 다음과 같습니다.

  • ga

  • gamultiobj

  • paretosearch

  • surrogateopt

비선형 제약 조건 함수 값을 사용할 수 있는 솔버는 다음과 같습니다.

  • paretosearch

  • surrogateopt

예를 들어, surrogateopt를 사용해서 초기점 그리드의 값에서 시작하여 peaks 함수를 최소화합니다. x 변수에 -10부터 10까지의 그리드를 만들고, y 변수에 간격이 1/2이고 –5/2부터 5/2까지인 그리드를 만듭니다. 초기점에서 목적 함수 값을 계산합니다.

x = optimvar("x",LowerBound=-10,UpperBound=10);
y = optimvar("y",LowerBound=-5/2,UpperBound=5/2);
prob = optimproblem("Objective",peaks(x,y));
xval = -10:10;
yval = (-5:5)/2;
[x0x,x0y] = meshgrid(xval,yval);
peaksvals = peaks(x0x,x0y);

optimvalues를 사용하여 x0 인수에 값을 전달합니다. 그러면 solve가 값을 계산할 필요가 없기 때문에 solve의 시간이 절약됩니다. 값을 행 벡터로 전달합니다.

x0 = optimvalues(prob,'x',x0x(:)','y',x0y(:)',...
    "Objective",peaksvals(:)');

surrogateopt를 초기값과 함께 사용하여 문제를 풉니다.

[sol,fval,eflag,output] = solve(prob,x0,Solver="surrogateopt")
Solving problem using surrogateopt.

Figure Optimization Plot Function contains an axes object. The axes object with title Best Function Value: -6.55113, xlabel Iteration, ylabel Function value contains an object of type scatter. This object represents Best function value.

surrogateopt stopped because it exceeded the function evaluation limit set by 
'options.MaxFunctionEvaluations'.
sol = struct with fields:
    x: 0.2283
    y: -1.6256

fval = -6.5511
eflag = 
    SolverLimitExceeded

output = struct with fields:
        elapsedtime: 23.4953
          funccount: 200
    constrviolation: 0
               ineq: [1x1 struct]
           rngstate: [1x1 struct]
            message: 'surrogateopt stopped because it exceeded the function evaluation limit set by ...'
             solver: 'surrogateopt'

[–1,2]에서 시작하여 범위 -5x,y5에서 peaks 함수의 국소 최솟값을 구합니다.

x = optimvar("x",LowerBound=-5,UpperBound=5);
y = optimvar("y",LowerBound=-5,UpperBound=5);
x0.x = -1;
x0.y = 2;
prob = optimproblem(Objective=peaks(x,y));
opts = optimoptions("fmincon",Display="none");
[sol,fval] = solve(prob,x0,Options=opts)
sol = struct with fields:
    x: -3.3867
    y: 3.6341

fval = 1.1224e-07

GlobalSearch 솔버를 사용하여 더 나은 해를 구해 봅니다. 이 솔버는 fmincon을 여러 번 실행하므로 더 나은 해를 얻을 수 있습니다.

ms = GlobalSearch;
[sol2,fval2] = solve(prob,x0,ms)
Solving problem using GlobalSearch.

GlobalSearch stopped because it analyzed all the trial points.

All 15 local solver runs converged with a positive local solver exit flag.
sol2 = struct with fields:
    x: 0.2283
    y: -1.6255

fval2 = -6.5511

GlobalSearch는 더 나은(더 낮은) 목적 함수 값을 갖는 해를 구합니다. 종료 메시지가 로컬 솔버 fmincon이 15번 실행된다는 것을 보여줍니다. 반환된 해는 약 –6.5511인 목적 함수 값을 가지며, 이 값은 첫 번째 해에서의 값인 1.1224e–07보다 낮습니다.

다음 문제를 풀어 보겠습니다.

minx(-3x1-2x2-x3)subjectto{x3binaryx1,x20x1+x2+x374x1+2x2+x3=12

이때 반복 과정은 표시하지 않습니다.

x = optimvar('x',2,1,'LowerBound',0);
x3 = optimvar('x3','Type','integer','LowerBound',0,'UpperBound',1);
prob = optimproblem;
prob.Objective = -3*x(1) - 2*x(2) - x3;
prob.Constraints.cons1 = x(1) + x(2) + x3 <= 7;
prob.Constraints.cons2 = 4*x(1) + 2*x(2) + x3 == 12;

options = optimoptions('intlinprog','Display','off');

sol = solve(prob,'Options',options)
sol = struct with fields:
     x: [2x1 double]
    x3: 1

해를 검토합니다.

sol.x
ans = 2×1

         0
    5.5000

sol.x3
ans = 1

solve가 선형 계획법 문제에 대한 솔버로 intlinprog를 사용하도록 강제 설정합니다.

x = optimvar('x');
y = optimvar('y');
prob = optimproblem;
prob.Objective = -x - y/3;
prob.Constraints.cons1 = x + y <= 2;
prob.Constraints.cons2 = x + y/4 <= 1;
prob.Constraints.cons3 = x - y <= 2;
prob.Constraints.cons4 = x/4 + y >= -1;
prob.Constraints.cons5 = x + y >= 1;
prob.Constraints.cons6 = -x + y <= 2;

sol = solve(prob,'Solver', 'intlinprog')
Solving problem using intlinprog.
LP:                Optimal objective value is -1.111111.                                            


Optimal solution found.

No integer variables specified. Intlinprog solved the linear problem.
sol = struct with fields:
    x: 0.6667
    y: 1.3333

디폴트가 아닌 옵션으로 정수 계획법 문제 풀기에 설명되어 있는 혼합 정수 선형 계획법 문제를 풀고 모든 출력 데이터를 검토합니다.

x = optimvar('x',2,1,'LowerBound',0);
x3 = optimvar('x3','Type','integer','LowerBound',0,'UpperBound',1);
prob = optimproblem;
prob.Objective = -3*x(1) - 2*x(2) - x3;
prob.Constraints.cons1 = x(1) + x(2) + x3 <= 7;
prob.Constraints.cons2 = 4*x(1) + 2*x(2) + x3 == 12;

[sol,fval,exitflag,output] = solve(prob)
Solving problem using intlinprog.
LP:                Optimal objective value is -12.000000.                                           


Optimal solution found.

Intlinprog stopped at the root node because the objective value is within a gap tolerance of the optimal value, options.AbsoluteGapTolerance = 0. The intcon variables are integer within tolerance, options.IntegerTolerance = 1e-05.
sol = struct with fields:
     x: [2x1 double]
    x3: 1

fval = -12
exitflag = 
    OptimalSolution

output = struct with fields:
        relativegap: 0
        absolutegap: 0
      numfeaspoints: 1
           numnodes: 0
    constrviolation: 0
            message: 'Optimal solution found....'
             solver: 'intlinprog'

정수 제약 조건이 없는 문제의 경우 비어 있지 않은 라그랑주 승수 구조체를 5번째 출력값으로 얻을 수도 있습니다.

명명된 인덱스 변수를 사용하여 최적화 문제를 만들고 풉니다. 가중 흐름에 대한 제약 조건을 적용하여 수익에 가중치를 두고서 다양한 공항으로 과일의 유통 흐름을 극대화하는 문제입니다.

rng(0) % For reproducibility
p = optimproblem('ObjectiveSense', 'maximize');
flow = optimvar('flow', ...
    {'apples', 'oranges', 'bananas', 'berries'}, {'NYC', 'BOS', 'LAX'}, ...
    'LowerBound',0,'Type','integer');
p.Objective = sum(sum(rand(4,3).*flow));
p.Constraints.NYC = rand(1,4)*flow(:,'NYC') <= 10;
p.Constraints.BOS = rand(1,4)*flow(:,'BOS') <= 12;
p.Constraints.LAX = rand(1,4)*flow(:,'LAX') <= 35;
sol = solve(p);
Solving problem using intlinprog.
LP:                Optimal objective value is 1027.472366.                                          

Heuristics:        Found 1 solution using ZI round.                                                 
                   Lower bound is 1027.233133.                                                      
                   Relative gap is 0.00%.                                                          


Optimal solution found.

Intlinprog stopped at the root node because the objective value is within a gap tolerance of the optimal value, options.AbsoluteGapTolerance = 0. The intcon variables are integer within tolerance, options.IntegerTolerance = 1e-05.

뉴욕과 로스앤젤레스로 향하는 오렌지와 베리의 최적 흐름을 구합니다.

[idxFruit,idxAirports] = findindex(flow, {'oranges','berries'}, {'NYC', 'LAX'})
idxFruit = 1×2

     2     4

idxAirports = 1×2

     1     3

orangeBerries = sol.flow(idxFruit, idxAirports)
orangeBerries = 2×2

     0   980
    70     0

위 결과가 의미하는 바는, NYC로 가는 오렌지가 없지만 70개의 베리가 NYC로 가고, 980개의 오렌지가 LAX로 가지만 LAX로 가는 베리는 없다는 것입니다.

다음의 최적 흐름을 나열합니다.

Fruit Airports

----- --------

Berries NYC

Apples BOS

Oranges LAX

idx = findindex(flow, {'berries', 'apples', 'oranges'}, {'NYC', 'BOS', 'LAX'})
idx = 1×3

     4     5    10

optimalFlow = sol.flow(idx)
optimalFlow = 1×3

    70    28   980

위 결과가 의미하는 바는, 베리 70개가 NYC로, 사과 28개가 BOS로, 오렌지 980개가 LAX로 간다는 것입니다.

문제 기반 접근법을 사용하여 다음과 같은 비선형 연립방정식을 풀려면

exp(-exp(-(x1+x2)))=x2(1+x12)x1cos(x2)+x2sin(x1)=12

먼저 x를 요소를 2개 가진 최적화 변수로 정의합니다.

x = optimvar('x',2);

첫 번째 방정식을 최적화 등식의 표현식으로 생성합니다.

eq1 = exp(-exp(-(x(1) + x(2)))) == x(2)*(1 + x(1)^2);

마찬가지로, 두 번째 방정식을 최적화 등식의 표현식으로 생성합니다.

eq2 = x(1)*cos(x(2)) + x(2)*sin(x(1)) == 1/2;

방정식 문제를 만들고, 방정식을 문제에 배치합니다.

prob = eqnproblem;
prob.Equations.eq1 = eq1;
prob.Equations.eq2 = eq2;

문제를 검토합니다.

show(prob)
  EquationProblem : 

	Solve for:
       x


 eq1:
       exp((-exp((-(x(1) + x(2)))))) == (x(2) .* (1 + x(1).^2))

 eq2:
       ((x(1) .* cos(x(2))) + (x(2) .* sin(x(1)))) == 0.5

[0,0]에서 시작하여 문제를 풉니다. 문제 기반 접근법에서는 초기점을 구조체로 지정하고 변수 이름을 구조체 필드로 사용합니다. 이 문제에는 변수가 x 하나만 있습니다.

x0.x = [0 0];
[sol,fval,exitflag] = solve(prob,x0)
Solving problem using fsolve.

Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.
sol = struct with fields:
    x: [2x1 double]

fval = struct with fields:
    eq1: -2.4070e-07
    eq2: -3.8255e-08

exitflag = 
    EquationSolved

해에 해당하는 점을 봅니다.

disp(sol.x)
    0.3532
    0.6061

지원되지 않는 함수는 fcn2optimexpr을 필요로 함

방정식 함수가 기본 함수로 구성되지 않은 경우 fcn2optimexpr을 사용하여 함수를 최적화 표현식으로 변환해야 합니다. 현재 예제의 경우 다음과 같습니다.

ls1 = fcn2optimexpr(@(x)exp(-exp(-(x(1)+x(2)))),x);
eq1 = ls1 == x(2)*(1 + x(1)^2);
ls2 = fcn2optimexpr(@(x)x(1)*cos(x(2))+x(2)*sin(x(1)),x);
eq2 = ls2 == 1/2;

Supported Operations for Optimization Variables and Expressions 항목과 Convert Nonlinear Function to Optimization Expression 항목을 참조하십시오.

입력 인수

모두 축소

최적화 문제 또는 방정식 문제로, OptimizationProblem 객체 또는 EquationProblem 객체로 지정됩니다. 최적화 문제는 optimproblem을 사용하여 만들고, 방정식 문제는 eqnproblem을 사용하여 만듭니다.

경고

문제 기반 접근법은 목적 함수, 비선형 등식 또는 비선형 부등식에서 복소수 값을 지원하지 않습니다. 함수 계산에 중간값으로라도 복소수 값이 포함될 경우, 최종 결과가 올바르지 않을 수 있습니다.

예: prob = optimproblem; prob.Objective = obj; prob.Constraints.cons1 = cons1;

예: prob = eqnproblem; prob.Equations = eqs;

초기점으로, prob의 변수 이름과 같은 필드 이름을 가진 구조체로 지정됩니다.

일부 Global Optimization Toolbox 솔버의 경우 x0은 여러 초기점을 나타내는 OptimizationValues 객체로 구성된 벡터가 될 수 있습니다. optimvalues 함수를 사용하여 점을 만듭니다. 다음과 같은 솔버가 이에 해당합니다.

  • ga (Global Optimization Toolbox), gamultiobj (Global Optimization Toolbox), paretosearch (Global Optimization Toolbox)particleswarm (Global Optimization Toolbox). 이러한 솔버는 복수의 시작점을 초기 모집단의 구성원으로 허용합니다.

  • MultiStart (Global Optimization Toolbox). 이 솔버는 fmincon과 같은 로컬 솔버에 대해 복수의 초기점을 허용합니다.

  • surrogateopt (Global Optimization Toolbox). 이 솔버는 초기 대리를 생성하는 데 도움이 되도록 복수의 초기점을 허용합니다.

명명된 인덱스 변수가 있는 x0을 사용하는 예제는 Create Initial Point for Optimization with Named Index Variables 항목을 참조하십시오.

예: probxy라는 변수가 있는 경우: x0.x = [3,2,17]; x0.y = [pi/3,2*pi/3].

데이터형: struct

복수 시작점 솔버로, MultiStart (Global Optimization Toolbox) 객체 또는 GlobalSearch (Global Optimization Toolbox) 객체로 지정됩니다. MultiStart 명령이나 GlobalSearch 명령을 사용하여 ms를 만듭니다.

현재, GlobalSearchfmincon 로컬 솔버만 지원하고 MultiStartfmincon, fminunc, lsqnonlin 로컬 솔버만 지원합니다.

예: ms = MultiStart;

예: ms = GlobalSearch(FunctionTolerance=1e-4);

이름-값 인수

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

R2021a 이전 릴리스에서는 쉼표를 사용하여 각 이름과 값을 구분하고 Name을 따옴표로 묶으십시오.

예: solve(prob,'Options',opts)

MultiStart (Global Optimization Toolbox)에 대한 시작점의 최소 개수로, 양의 정수로 지정됩니다. 이 인수는 ms 인수를 사용하여 solve 함수를 호출할 때만 적용됩니다. solve 함수는 x0의 모든 값을 시작점으로 사용합니다. MinNumStartPointsx0에 포함된 값의 개수보다 크면 solve 함수는 문제 범위 내에서 무작위로 균일하게 시작점을 추가로 생성합니다. 성분이 비유계인 경우 solve 함수는 MultiStart의 디폴트 인위적 경계를 사용하여 점을 생성합니다.

예: solve(prob,x0,ms,MinNumStartPoints=50)

데이터형: double

최적화 옵션으로, optimoptions에 의해 생성되는 객체 또는 optimset에 의해 생성되는 것과 같은 options 구조체로 지정됩니다.

내부적으로, solve 함수는 'solver' 인수 부분에 자세히 나와 있는 설명대로 관련 솔버를 호출합니다. options가 솔버와 호환 가능한지 확인하십시오. 예를 들어, intlinprog에서는 옵션이 구조체가 될 수 없고 lsqnonneg에서는 옵션이 객체가 될 수 없습니다.

intlinprog 풀이 또는 풀이 속도를 향상하기 위한 옵션 설정에 관한 팁은 Tuning Integer Linear Programming 항목을 참조하십시오. linprog의 경우 디폴트 'dual-simplex' 알고리즘은 일반적으로 메모리를 효율적으로 사용하고 속도가 빠릅니다. 때로는 Algorithm 옵션이 'interior-point'일 때 linprog가 대규모 문제를 더 빠르게 풉니다. 비선형 문제의 해를 개선하기 위한 옵션 설정에 대한 제안 사항은 Optimization Options in Common Use: Tuning and Troubleshooting결과 향상시키기 항목을 참조하십시오.

예: options = optimoptions('intlinprog','Display','none')

최적화 솔버로, 아래 나열된 솔버의 이름으로 지정됩니다. 최적화 문제에 대해 다음 표에서는 Global Optimization Toolbox의 솔버를 비롯하여 각 최적화 문제 유형에서 사용 가능한 솔버를 보여줍니다 방정식 문제의 세부 정보는 최적화 솔버 세부 정보 아래 표시됩니다.

비선형 문제를 prob2struct를 사용하여 정수 제약 조건으로 변환하는 경우 결과 문제 구조체는 선택한 솔버에 따라 달라질 수 있습니다. Global Optimization Toolbox 라이선스가 없으면 솔버를 지정해야 합니다. 비선형 문제 기반 최적화에서의 정수 제약 조건 항목을 참조하십시오.

각 최적화 문제 유형에 관한 디폴트 솔버는 아래 나열되어 있습니다.

문제 유형기본 솔버
선형 계획법(LP)linprog
혼합 정수 선형 계획법(MILP)intlinprog
2차 계획법(QP)quadprog
2차 원뿔 계획법(SOCP)coneprog
선형 최소제곱lsqlin
비선형 최소제곱lsqnonlin
비선형 계획법(NLP)

fminunc(제약 조건이 없는 문제), fmincon(제약 조건이 있는 문제)

혼합 정수 비선형 계획법(MINLP)ga (Global Optimization Toolbox)
다중 목적 함수gamultiobj (Global Optimization Toolbox)

다음 표에서 Yes는 문제 유형에 사용할 수 있는 솔버가 있음을 나타내며 x는 사용할 수 있는 솔버가 없음을 나타냅니다.

문제 유형

LPMILPQPSOCP선형 최소제곱비선형 최소제곱NLPMINLP
솔버
linprog

Yes

xxxxxxx
intlinprog

Yes

Yes

xxxxxx
quadprog

Yes

x

Yes

Yes

Yes

xxx
coneprog

Yes

xx

Yes

xxxx
lsqlinxxxx

Yes

xxx
lsqnonnegxxxx

Yes

xxx
lsqnonlinxxxx

Yes

Yes

xx
fminunc

Yes

x

Yes

x

Yes

Yes

Yes

x
fmincon

Yes

x

Yes

Yes

Yes

Yes

Yes

x
fminbndxxxx

Yes

Yes

Yes

x
fminsearchxxxx

Yes

Yes

Yes

x
patternsearch (Global Optimization Toolbox)

Yes

x

Yes

Yes

Yes

Yes

Yes

x
ga (Global Optimization Toolbox)

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

particleswarm (Global Optimization Toolbox)

Yes

x

Yes

x

Yes

Yes

Yes

x
simulannealbnd (Global Optimization Toolbox)

Yes

x

Yes

x

Yes

Yes

Yes

x
surrogateopt (Global Optimization Toolbox)

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

gamultiobj (Global Optimization Toolbox)

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

paretosearch (Global Optimization Toolbox)

Yes

x

Yes

Yes

Yes

Yes

Yes

x

참고

최소제곱 문제에 대한 솔버로 lsqcurvefit을 선택할 경우 solvelsqnonlin을 사용합니다. lsqcurvefit 솔버와 lsqnonlin 솔버는 solve에 대해 동일합니다.

주의

최대화 문제(prob.ObjectiveSense"max" 또는 "maximize"인 문제)의 경우, 최소제곱 솔버(이름이 lsq로 시작하는 솔버)를 지정하지 마십시오. 이러한 솔버는 최대화할 수 없으므로 이들을 지정하면 solve가 오류를 발생시킵니다.

다음 표에서는 각 방정식 풀이 문제 유형에서 사용 가능한 솔버를 보여줍니다 각 표시의 의미는 다음과 같습니다.

  • *는 해당 문제 유형에 대한 디폴트 솔버를 나타냅니다.

  • Y는 사용 가능한 솔버를 나타냅니다.

  • N은 사용할 수 없는 솔버를 나타냅니다.

방정식에 대해 지원되는 솔버

방정식 유형lsqlinlsqnonnegfzerofsolvelsqnonlin
선형*NY(스칼라만 해당)YY
선형 및 유계*YNNY
스칼라 비선형NN*YY
비선형 시스템NNN*Y
비선형 시스템 및 유계NNNN*

예: 'intlinprog'

데이터형: char | string

비선형 목적 함수에 자동 미분(AD)을 사용한다는 표시로, 'auto'(가능하면 AD 사용), 'auto-forward'(가능하면 순방향 AD 사용), 'auto-reverse'(가능하면 역방향 AD 사용) 또는 'finite-differences'(AD 사용 안 함)로 지정됩니다. 문제를 풀 때 auto를 포함하여 선택하면 Supported Operations for Optimization Variables and Expressions에 설명되어 있는 것처럼, 목적 함수가 지원되는 경우 기본 솔버가 기울기 정보를 사용하게 됩니다. 예제는 Effect of Automatic Differentiation in Problem-Based Optimization 항목을 참조하십시오.

솔버는 기본적으로 다음 유형의 AD를 선택합니다.

  • 일반적인 비선형 목적 함수의 경우 fmincon은 기본적으로 목적 함수에 대해 역방향 AD를 사용합니다. 비선형 제약 조건의 개수가 변수의 개수보다 작은 경우 fmincon은 기본적으로 비선형 제약 조건 함수에 대해 역방향 AD를 사용합니다. 그렇지 않은 경우 fmincon은 기본적으로 비선형 제약 조건 함수에 대해 순방향 AD를 사용합니다.

  • 일반적인 비선형 목적 함수의 경우 fminunc는 기본적으로 역방향 AD를 사용합니다.

  • 최소제곱 목적 함수의 경우 fminconfminunc는 기본적으로 목적 함수에 대해 순방향 AD를 사용합니다. 문제 기반 최소제곱 목적 함수의 정의를 보려면 Write Objective Function for Problem-Based Least Squares 항목을 참조하십시오.

  • 목적 벡터의 요소 개수가 변수의 개수보다 크거나 같은 경우 lsqnonlin은 기본적으로 순방향 AD를 사용합니다. 그렇지 않은 경우 lsqnonlin은 기본적으로 역방향 AD를 사용합니다.

  • 방정식의 개수가 변수의 개수보다 크거나 같은 경우 fsolve는 기본적으로 순방향 AD를 사용합니다. 그렇지 않은 경우 fsolve는 기본적으로 역방향 AD를 사용합니다.

예: 'finite-differences'

데이터형: char | string

비선형 제약 조건 함수에 자동 미분(AD)을 사용한다는 표시로, 'auto'(가능하면 AD 사용), 'auto-forward'(가능하면 순방향 AD 사용), 'auto-reverse'(가능하면 역방향 AD 사용) 또는 'finite-differences'(AD 사용 안 함)로 지정됩니다. 문제를 풀 때 auto를 포함하여 선택하면 Supported Operations for Optimization Variables and Expressions에 설명되어 있는 것처럼, 제약 조건 함수가 지원되는 경우 기본 솔버가 기울기 정보를 사용하게 됩니다. 예제는 Effect of Automatic Differentiation in Problem-Based Optimization 항목을 참조하십시오.

솔버는 기본적으로 다음 유형의 AD를 선택합니다.

  • 일반적인 비선형 목적 함수의 경우 fmincon은 기본적으로 목적 함수에 대해 역방향 AD를 사용합니다. 비선형 제약 조건의 개수가 변수의 개수보다 작은 경우 fmincon은 기본적으로 비선형 제약 조건 함수에 대해 역방향 AD를 사용합니다. 그렇지 않은 경우 fmincon은 기본적으로 비선형 제약 조건 함수에 대해 순방향 AD를 사용합니다.

  • 일반적인 비선형 목적 함수의 경우 fminunc는 기본적으로 역방향 AD를 사용합니다.

  • 최소제곱 목적 함수의 경우 fminconfminunc는 기본적으로 목적 함수에 대해 순방향 AD를 사용합니다. 문제 기반 최소제곱 목적 함수의 정의를 보려면 Write Objective Function for Problem-Based Least Squares 항목을 참조하십시오.

  • 목적 벡터의 요소 개수가 변수의 개수보다 크거나 같은 경우 lsqnonlin은 기본적으로 순방향 AD를 사용합니다. 그렇지 않은 경우 lsqnonlin은 기본적으로 역방향 AD를 사용합니다.

  • 방정식의 개수가 변수의 개수보다 크거나 같은 경우 fsolve는 기본적으로 순방향 AD를 사용합니다. 그렇지 않은 경우 fsolve는 기본적으로 역방향 AD를 사용합니다.

예: 'finite-differences'

데이터형: char | string

비선형 제약 조건 함수에 자동 미분(AD)을 사용한다는 표시로, 'auto'(가능하면 AD 사용), 'auto-forward'(가능하면 순방향 AD 사용), 'auto-reverse'(가능하면 역방향 AD 사용) 또는 'finite-differences'(AD 사용 안 함)로 지정됩니다. 문제를 풀 때 auto를 포함하여 선택하면 Supported Operations for Optimization Variables and Expressions에 설명되어 있는 것처럼, 방정식 함수가 지원되는 경우 기본 솔버가 기울기 정보를 사용하게 됩니다. 예제는 Effect of Automatic Differentiation in Problem-Based Optimization 항목을 참조하십시오.

솔버는 기본적으로 다음 유형의 AD를 선택합니다.

  • 일반적인 비선형 목적 함수의 경우 fmincon은 기본적으로 목적 함수에 대해 역방향 AD를 사용합니다. 비선형 제약 조건의 개수가 변수의 개수보다 작은 경우 fmincon은 기본적으로 비선형 제약 조건 함수에 대해 역방향 AD를 사용합니다. 그렇지 않은 경우 fmincon은 기본적으로 비선형 제약 조건 함수에 대해 순방향 AD를 사용합니다.

  • 일반적인 비선형 목적 함수의 경우 fminunc는 기본적으로 역방향 AD를 사용합니다.

  • 최소제곱 목적 함수의 경우 fminconfminunc는 기본적으로 목적 함수에 대해 순방향 AD를 사용합니다. 문제 기반 최소제곱 목적 함수의 정의를 보려면 Write Objective Function for Problem-Based Least Squares 항목을 참조하십시오.

  • 목적 벡터의 요소 개수가 변수의 개수보다 크거나 같은 경우 lsqnonlin은 기본적으로 순방향 AD를 사용합니다. 그렇지 않은 경우 lsqnonlin은 기본적으로 역방향 AD를 사용합니다.

  • 방정식의 개수가 변수의 개수보다 크거나 같은 경우 fsolve는 기본적으로 순방향 AD를 사용합니다. 그렇지 않은 경우 fsolve는 기본적으로 역방향 AD를 사용합니다.

예: 'finite-differences'

데이터형: char | string

출력 인수

모두 축소

해로, 구조체 또는 OptimizationValues 벡터로 반환됩니다. 문제가 다중 목적 함수일 때 solOptimizationValues 벡터가 됩니다. 단일 목적 함수 문제의 경우, 반환된 구조체의 필드는 문제에 있는 최적화 변수의 이름입니다. optimvar을 참조하십시오.

해에서 계산된 목적 함수 값으로, 다음 중 하나로 반환됩니다.

문제 유형반환 값
스칼라 목적 함수 f(x) 최적화실수 f(sol)
최소제곱실수로, 해에서의 잔차의 제곱합입니다.
방정식 풀기prob.Equations가 단일 요소인 경우, 해에서의 함수 값의 실수 벡터로, 방정식의 좌변에서 우변을 뺀 값입니다.
prob.Equations에 이름이 지정된 필드가 여러 개 있는 경우, prob.Equations와 같은 이름을 가진 구조체로, 여기서 각 필드 값은 명명된 방정식의 좌변에서 우변을 뺀 값입니다.
다중 목적 함수한 행이 각 목적 함수 성분이고, 한 열이 각 해에 해당하는 점인 행렬.

최적화 표현식 또는 방정식으로 정의된 목적 함수의 fval을 사전에 지정하지 않았다면 다음을 사용하여 계산할 수 있습니다.

fval = evaluate(prob.Objective,sol)

목적 함수가 하나의 필드만 있는 구조체로 정의된 경우, 다음과 같습니다.

fval = evaluate(prob.Objective.ObjectiveName,sol)

목적 함수가 여러 필드를 가진 구조체로 정의된 경우, 루프를 작성합니다.

fnames = fields(prob.Equations);
for i = 1:length(fnames)
    fval.(fnames{i}) = evaluate(prob.Equations.(fnames{i}),sol);
end

솔버가 중지된 이유로, 열거형 변수로 반환됩니다. exitflagdouble(exitflag)를 사용하여 상응하는 숫자로 변환할 수 있고 string(exitflag)를 사용하여 상응하는 문자열로 변환할 수 있습니다.

다음 표에서는 intlinprog 솔버에 대한 종료 플래그를 설명합니다.

intlinprog의 종료 플래그상응하는 숫자의미
OptimalWithPoorFeasibility3

이 해는 상대 ConstraintTolerance 허용오차를 기준으로는 실현 가능하지만, 절대 허용오차를 기준으로는 실현 불가능합니다.

IntegerFeasible2intlinprog가 중도에 중지되었고 정수 실현가능점을 찾았습니다.
OptimalSolution

1

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

SolverLimitExceeded

0

intlinprog가 다음 허용오차 중 하나를 초과합니다.

  • LPMaxIterations

  • MaxNodes

  • MaxTime

  • RootLPMaxIterations

허용오차와 중지 기준 항목을 참조하십시오. solve는 또한 루트 노드에서 메모리가 부족할 때 이 종료 플래그를 반환합니다.

OutputFcnStop-1intlinprog가 출력 함수나 플롯 함수에 의해 중지되었습니다.
NoFeasiblePointFound

-2

실현가능점을 찾지 못했습니다.

Unbounded

-3

문제가 비유계입니다.

FeasibilityLost

-9

솔버가 실현가능성을 잃었습니다.

종료 플래그 3-9는 실현불가능성이 큰 해와 관계가 있습니다. 이런 종료 플래그는 보통 큰 조건수를 갖는 선형 제약 조건 행렬이나 큰 해 성분이 있는 문제에서 비롯됩니다. 이런 문제를 해결하려면 계수 행렬을 스케일링하거나 중복된 선형 제약 조건을 제거하거나 변수에 대해 더 엄밀한 범위를 지정해 보십시오.

다음 표에서는 linprog 솔버에 대한 종료 플래그를 설명합니다.

linprog의 종료 플래그상응하는 숫자의미
OptimalWithPoorFeasibility3

이 해는 상대 ConstraintTolerance 허용오차를 기준으로는 실현 가능하지만, 절대 허용오차를 기준으로는 실현 불가능합니다.

OptimalSolution1

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

SolverLimitExceeded0

반복 횟수가 options.MaxIterations를 초과합니다.

NoFeasiblePointFound-2

실현가능점을 찾지 못했습니다.

Unbounded-3

문제가 비유계입니다.

FoundNaN-4

알고리즘 실행 도중 NaN 값이 발견되었습니다.

PrimalDualInfeasible-5

원문제(Primal)와 쌍대 문제(Dual) 모두 실현 가능하지 않습니다.

DirectionTooSmall-7

탐색 방향이 너무 작습니다. 더 이상 진행할 수 없습니다.

FeasibilityLost-9

솔버가 실현가능성을 잃었습니다.

종료 플래그 3-9는 실현불가능성이 큰 해와 관계가 있습니다. 이런 종료 플래그는 보통 큰 조건수를 갖는 선형 제약 조건 행렬이나 큰 해 성분이 있는 문제에서 비롯됩니다. 이런 문제를 해결하려면 계수 행렬을 스케일링하거나 중복된 선형 제약 조건을 제거하거나 변수에 대해 더 엄밀한 범위를 지정해 보십시오.

다음 표에서는 lsqlin 솔버에 대한 종료 플래그를 설명합니다.

lsqlin의 종료 플래그상응하는 숫자의미
FunctionChangeBelowTolerance3

잔차의 변화량이 지정된 허용오차 options.FunctionTolerance보다 작습니다. (trust-region-reflective 알고리즘)

StepSizeBelowTolerance

2

스텝 크기가 options.StepTolerance보다 작으며, 제약 조건이 충족되었습니다(interior-point 알고리즘).

OptimalSolution1

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

SolverLimitExceeded0

반복 횟수가 options.MaxIterations를 초과합니다.

NoFeasiblePointFound-2

최적화 문제의 경우 문제가 실현 가능하지 않습니다. 또는, interior-point 알고리즘의 경우, 스텝 크기가 options.StepTolerance보다 작지만 제약 조건이 충족되지 않았습니다.

방정식 문제의 경우 구해진 해가 없습니다.

IllConditioned-4

조건이 나빠 최적화가 더 이상 진행되지 않습니다.

NoDescentDirectionFound-8

탐색 방향이 너무 작습니다. 더 이상 진행할 수 없습니다. (interior-point 알고리즘)

다음 표에서는 quadprog 솔버에 대한 종료 플래그를 설명합니다.

quadprog의 종료 플래그상응하는 숫자의미
LocalMinimumFound4

국소 최솟값을 찾았거나, 최솟값이 고유하지 않습니다.

FunctionChangeBelowTolerance3

목적 함수 값의 변화량이 지정된 허용오차 options.FunctionTolerance보다 작습니다. (trust-region-reflective 알고리즘)

StepSizeBelowTolerance

2

스텝 크기가 options.StepTolerance보다 작으며, 제약 조건이 충족되었습니다(interior-point-convex 알고리즘).

OptimalSolution1

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

SolverLimitExceeded0

반복 횟수가 options.MaxIterations를 초과합니다.

NoFeasiblePointFound-2

문제가 실현 불가능한지 여부. 또는, interior-point 알고리즘의 경우, 스텝 크기가 options.StepTolerance보다 작지만 제약 조건이 충족되지 않았습니다.

IllConditioned-4

조건이 나빠 최적화가 더 이상 진행되지 않습니다.

Nonconvex

-6

비볼록 문제가 감지되었습니다. (interior-point-convex 알고리즘)

NoDescentDirectionFound-8

스텝 방향을 계산할 수 없습니다. (interior-point-convex 알고리즘)

다음 표에서는 coneprog 솔버에 대한 종료 플래그를 설명합니다.

coneprog의 종료 플래그상응하는 숫자의미
OptimalSolution1

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

SolverLimitExceeded0

반복 횟수가 options.MaxIterations를 초과하거나 풀이 시간(단위: 초)이 options.MaxTime을 초과했습니다.

NoFeasiblePointFound-2

문제가 실현 불가능한지 여부.

Unbounded-3

문제가 비유계입니다.

DirectionTooSmall

-7

탐색 방향이 너무 작아졌습니다. 더 이상 진행할 수 없습니다.

Unstable-10

문제가 수치적으로 불안정합니다.

다음 표에서는 lsqcurvefit 또는 lsqnonlin 솔버에 대한 종료 플래그를 설명합니다.

lsqnonlin의 종료 플래그상응하는 숫자의미
SearchDirectionTooSmall 4

탐색 방향의 크기가 options.StepTolerance보다 작습니다.

FunctionChangeBelowTolerance3

잔차의 변화량이 options.FunctionTolerance보다 작습니다.

StepSizeBelowTolerance

2

스텝 크기가 options.StepTolerance보다 작습니다.

OptimalSolution1

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

SolverLimitExceeded0

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

OutputFcnStop-1

출력 함수나 플롯 함수에 의해 중지되었습니다.

NoFeasiblePointFound-2

최적화 문제의 경우 문제가 실현 가능하지 않습니다. 범위 lbub에 모순이 있습니다.

방정식 문제의 경우 구해진 해가 없습니다.

다음 표에서는 fminunc 솔버에 대한 종료 플래그를 설명합니다.

fminunc의 종료 플래그상응하는 숫자의미
NoDecreaseAlongSearchDirection5

목적 함수의 예측된 감소량이 options.FunctionTolerance 허용오차보다 작습니다.

FunctionChangeBelowTolerance3

목적 함수 값의 변화량이 options.FunctionTolerance 허용오차보다 작습니다.

StepSizeBelowTolerance

2

x의 변화량이 options.StepTolerance 허용오차보다 작습니다.

OptimalSolution1

기울기 크기가 options.OptimalityTolerance 허용오차보다 작습니다.

SolverLimitExceeded0

반복 횟수가 options.MaxIterations를 초과하거나, 함수 실행 횟수가 options.MaxFunctionEvaluations를 초과합니다.

OutputFcnStop-1

출력 함수나 플롯 함수에 의해 중지되었습니다.

Unbounded-3

현재 반복에서 목적 함수가 options.ObjectiveLimit 미만입니다.

다음 표에서는 fmincon 솔버에 대한 종료 플래그를 설명합니다.

fmincon의 종료 플래그상응하는 숫자의미
NoDecreaseAlongSearchDirection5

탐색 방향에서 방향 도함수의 크기가 2*options.OptimalityTolerance보다 작고 최대 제약 조건 위반 값이 options.ConstraintTolerance보다 작습니다.

SearchDirectionTooSmall4

탐색 방향의 크기가 2*options.StepTolerance보다 작고 최대 제약 조건 위반 값이 options.ConstraintTolerance보다 작습니다.

FunctionChangeBelowTolerance3

목적 함수 값의 변화량이 options.FunctionTolerance보다 작고 최대 제약 조건 위반 값이 options.ConstraintTolerance보다 작습니다.

StepSizeBelowTolerance

2

x의 변화량이 options.StepTolerance보다 작고 최대 제약 조건 위반 값이 options.ConstraintTolerance보다 작습니다.

OptimalSolution1

1차 최적성 측정값이 options.OptimalityTolerance보다 작고 최대 제약 조건 위반 값이 options.ConstraintTolerance보다 작습니다.

SolverLimitExceeded0

반복 횟수가 options.MaxIterations를 초과하거나, 함수 실행 횟수가 options.MaxFunctionEvaluations를 초과합니다.

OutputFcnStop-1

출력 함수나 플롯 함수에 의해 중지되었습니다.

NoFeasiblePointFound-2

실현가능점을 찾지 못했습니다.

Unbounded-3

현재 반복에서 목적 함수가 options.ObjectiveLimit보다 작고 최대 제약 조건 위반 값이 options.ConstraintTolerance보다 작습니다.

다음 표에서는 fsolve 솔버에 대한 종료 플래그를 설명합니다.

fsolve의 종료 플래그상응하는 숫자의미
SearchDirectionTooSmall4

탐색 방향의 크기가 options.StepTolerance보다 작습니다. 방정식을 풀었습니다.

FunctionChangeBelowTolerance3

목적 함수 값의 변화량이 options.FunctionTolerance보다 작습니다. 방정식을 풀었습니다.

StepSizeBelowTolerance

2

x의 변화량이 options.StepTolerance보다 작습니다. 방정식을 풀었습니다.

OptimalSolution1

1차 최적성 측정값이 options.OptimalityTolerance보다 작습니다. 방정식을 풀었습니다.

SolverLimitExceeded0

반복 횟수가 options.MaxIterations를 초과하거나, 함수 실행 횟수가 options.MaxFunctionEvaluations를 초과합니다.

OutputFcnStop-1

출력 함수나 플롯 함수에 의해 중지되었습니다.

NoFeasiblePointFound-2

근이 아닌 점으로 수렴되었습니다.

TrustRegionRadiusTooSmall-3

방정식을 풀지 못했습니다. 신뢰 영역 반지름이 너무 작아졌습니다(trust-region-dogleg 알고리즘).

다음 표에서는 fzero 솔버에 대한 종료 플래그를 설명합니다.

fzero의 종료 플래그상응하는 숫자의미
OptimalSolution1

방정식을 풀었습니다.

OutputFcnStop-1

출력 함수나 플롯 함수에 의해 중지되었습니다.

FoundNaNInfOrComplex-4

부호 변경이 포함된 구간을 탐색하는 중 NaN, Inf 또는 복소수 값이 발견되었습니다.

SingularPoint-5

특이점으로 수렴되었을 수 있습니다.

CannotDetectSignChange-6함수 값에 대해 반대 부호를 갖는 두 점을 찾지 못했습니다.

다음 표에서는 patternsearch 솔버에 대한 종료 플래그를 설명합니다.

patternsearch의 종료 플래그상응하는 숫자의미
SearchDirectionTooSmall4

스텝의 크기가 기계 정밀도보다 작고 제약 조건 위반 값이 ConstraintTolerance보다 작습니다.

FunctionChangeBelowTolerance3

fval의 변화량과 메시 크기 모두 지정된 허용오차보다 작고 제약 조건 위반 값이 ConstraintTolerance보다 작습니다.

StepSizeBelowTolerance

2

x의 변화량과 메시 크기가 모두 StepTolerance보다 작고 제약 조건 위반 값이 ConstraintTolerance보다 작습니다.

SolverConvergedSuccessfully1

비선형 제약 조건 없음 — 메시 크기가 지정된 허용오차보다 작고 제약 조건 위반 값이 ConstraintTolerance보다 작습니다.

비선형 제약 조건 있음상보성 측정값의 크기(이 표 다음에 정의됨)가 sqrt(ConstraintTolerance)보다 작습니다. 하위 문제는 MeshTolerance보다 세밀한 메시를 사용하여 풀리고, 제약 조건 위반 값은 ConstraintTolerance보다 작습니다.

SolverLimitExceeded0

함수 실행 또는 반복이 최대 횟수에 도달했습니다.

OutputFcnStop-1

출력 함수나 플롯 함수에 의해 중지되었습니다.

NoFeasiblePointFound-2

실현가능점을 찾지 못했습니다.

비선형 제약 조건 솔버에서 상보성 측정값은 요소가 ciλi인 벡터의 노름입니다. 여기서 ci는 비선형 부등식 제약 조건 위반 값이며 λi는 이에 대응하는 라그랑주 승수입니다.

다음 표에서는 ga 솔버에 대한 종료 플래그를 설명합니다.

ga의 종료 플래그상응하는 숫자의미
MinimumFitnessLimitReached5

최소 적합도 제한 FitnessLimit에 도달했고 제약 조건 위반 값이 ConstraintTolerance보다 작습니다.

SearchDirectionTooSmall4

스텝의 크기가 기계 정밀도보다 작고 제약 조건 위반 값이 ConstraintTolerance보다 작습니다.

FunctionChangeBelowTolerance3

적합도 함수의 값이 MaxStallGenerations 생성에서 변경되지 않았고 제약 조건 위반 값이 ConstraintTolerance보다 작습니다.

SolverConvergedSuccessfully1

비선형 제약 조건 없음MaxStallGenerations 생성에 대한 적합도 함수 값의 평균 누적 변화량이 FunctionTolerance보다 작고 제약 조건 위반 값이 ConstraintTolerance보다 작습니다.

비선형 제약 조건 있음 — 상보성 측정값의 크기(상보성 측정값 (Global Optimization Toolbox) 참조)는 sqrt(ConstraintTolerance)보다 작으며, 하위 문제는 FunctionTolerance보다 작은 허용오차를 사용하여 풀리고 제약 조건 위반 값은 ConstraintTolerance보다 작습니다.

SolverLimitExceeded0

최대 생성 횟수인 MaxGenerations를 초과했습니다.

OutputFcnStop-1

출력 함수나 플롯 함수에 의해 중지되었습니다.

NoFeasiblePointFound-2

실현가능점을 찾지 못했습니다.

StallTimeLimitExceeded-4

정체 시간 제한인 MaxStallTime을 초과했습니다.

TimeLimitExceeded-5

시간 제한인 MaxTime을 초과했습니다.

다음 표에서는 particleswarm 솔버에 대한 종료 플래그를 설명합니다.

particleswarm의 종료 플래그상응하는 숫자의미
SolverConvergedSuccessfully1

마지막 options.MaxStallIterations 반복에 대한 목적 함수 값의 상대 변화량이 options.FunctionTolerance보다 작습니다.

SolverLimitExceeded0

반복 횟수가 options.MaxIterations를 초과했습니다.

OutputFcnStop-1

출력 함수나 플롯 함수에 의해 반복이 중지되었습니다.

NoFeasiblePointFound-2

범위에 모순이 있습니다. 일부 i에 대해 lb(i) > ub(i)입니다.

Unbounded-3

최상의 목적 함수 값이 options.ObjectiveLimit 미만입니다.

StallTimeLimitExceeded-4

최상의 목적 함수 값이 options.MaxStallTime(단위: 초) 내에서 변경되지 않았습니다.

TimeLimitExceeded-5

실행 시간이 options.MaxTime(단위: 초)을 초과했습니다.

다음 표에서는 simulannealbnd 솔버에 대한 종료 플래그를 설명합니다.

simulannealbnd의 종료 플래그상응하는 숫자의미
ObjectiveValueBelowLimit5

목적 함수 값이 options.ObjectiveLimit보다 작습니다.

SolverConvergedSuccessfully1

options.MaxStallIterations 반복 동안 목적 함수 값의 평균 변화량이 options.FunctionTolerance보다 작습니다.

SolverLimitExceeded0

최대 생성 횟수인 MaxGenerations를 초과했습니다.

OutputFcnStop-1

출력 함수나 플롯 함수에 의해 최적화가 종료되었습니다.

NoFeasiblePointFound-2

실현가능점을 찾지 못했습니다.

TimeLimitExceeded-5

시간 제한을 초과했습니다.

다음 표에서는 surrogateopt 솔버에 대한 종료 플래그를 설명합니다.

surrogateopt의 종료 플래그상응하는 숫자의미
BoundsEqual10

다음 중 하나로 인해 문제가 고유한 실현 가능한 해를 갖습니다.

  • 모든 상한값 ub (Global Optimization Toolbox)가 하한값 lb (Global Optimization Toolbox)와 같습니다.

  • 선형 등식 제약 조건 Aeq*x = beq와 범위가 유일한 해에 해당하는 점을 갖습니다.

surrogateopt가 최적화를 수행하지 않고 실현가능점과 함수 값을 반환합니다.

FeasiblePointFound3실현가능점을 찾았습니다. 새로 찾은 실현가능점이 너무 적어서 계속할 수 없으므로 솔버가 중지되었습니다.
ObjectiveLimitAttained1

목적 함수 값이 options.ObjectiveLimit보다 작습니다. 이 종료 플래그와 종료 플래그 10을 모두 적용하면 이 종료 플래그가 우선합니다.

SolverLimitExceeded0

함수 실행 횟수가 options.MaxFunctionEvaluations를 초과하거나 경과 시간이 options.MaxTime을 초과합니다. 문제에 비선형 부등식이 있으면 해가 실현 가능한 것입니다.

OutputFcnStop-1

출력 함수나 플롯 함수에 의해 최적화가 종료되었습니다.

NoFeasiblePointFound-2

다음 중 하나로 인해 실현가능점을 찾지 못했습니다.

  • 하한 lb(i)가 이에 대응하는 상한 ub(i)를 초과합니다. 또는 하나 이상의 ceil(lb(i))intcon (Global Optimization Toolbox)의 i에 대해 대응하는 floor(ub(i))를 초과합니다. 이 경우, solve 함수는 x = []fval = []을 반환합니다.

  • lb = ub이고 점 lb가 실현 가능하지 않습니다. 이 경우, x = lb이고 fval = objconstr(x).Fval입니다.

  • 선형 제약 조건과 정수 제약 조건(있는 경우)이 범위와 함께 실현 가능하지 않습니다. 이 경우, solve 함수는 x = []fval = []을 반환합니다.

  • 범위 제약 조건, 정수 제약 조건 및 선형 제약 조건이 실현 가능하지만, 비선형 제약 조건을 가진 실현 가능한 해는 찾지 못했습니다. 이 경우 x는 비선형 제약 조건의 가장 작은 최대 실현불가능점이며 fval = objconstr(x).Fval입니다.

다음 표에서는 MultiStartGlobalSearch 솔버에 대한 종료 플래그를 설명합니다.

MultiStart 또는 GlobalSearch의 종료 플래그상응하는 숫자의미
LocalMinimumFoundSomeConverged2최소 하나의 국소 최솟값을 찾았습니다. 로컬 솔버의 일부 실행이 수렴되었습니다.
LocalMinimumFoundAllConverged1최소 하나의 국소 최솟값을 찾았습니다. 로컬 솔버의 모든 실행이 수렴되었습니다.
SolverLimitExceeded0국소 최솟값을 찾지 못했습니다. 로컬 솔버가 적어도 한 번 호출되었고, 로컬 솔버 호출이 적어도 한 번 반복을 모두 마쳤습니다.
OutputFcnStop–1출력 함수나 플롯 함수에 의해 중지되었습니다.
NoFeasibleLocalMinimumFound–2실현 가능한 국소 최솟값을 찾지 못했습니다.
TimeLimitExceeded–5MaxTime 제한을 초과했습니다.
NoSolutionFound–8해를 찾지 못했습니다. 모든 실행의 로컬 솔버 종료 플래그가 –2 또는 그보다 작은 숫자였으며, 이 중 일부는 –2가 아닙니다.
FailureInSuppliedFcn–10목적 함수 또는 비선형 제약 조건 함수에서 오류를 발견했습니다.

다음 표에서는 paretosearch 솔버에 대한 종료 플래그를 설명합니다.

paretosearch의 종료 플래그상응하는 숫자의미
SolverConvergedSuccessfully1

다음 조건 중 하나가 충족되었습니다.

  • 예비후보가 모두 메시 크기가 options.MeshTolerance보다 작고, 제약 조건이 있는 경우 해당 조건이 options.ConstraintTolerance 이내에서 충족되었습니다.

  • 파레토 집합 산포의 상대적 변화가 options.ParetoSetChangeTolerance보다 작고, 제약 조건이 있는 경우 해당 조건이 options.ConstraintTolerance 이내에서 충족되었습니다.

  • 파레토 집합 면적의 상대적 변화가 options.ParetoSetChangeTolerance보다 작고, 제약 조건이 있는 경우 해당 조건이 options.ConstraintTolerance 이내에서 충족되었습니다.

SolverLimitExceeded0반복 횟수가 options.MaxIterations를 초과하거나, 함수 실행 횟수가 options.MaxFunctionEvaluations를 초과합니다.
OutputFcnStop–1출력 함수나 플롯 함수에 의해 중지되었습니다.
NoFeasiblePointFound–2솔버가 모든 제약 조건을 충족하는 점을 찾을 수 없습니다.
TimeLimitExceeded–5최적화 시간이 options.MaxTime을 초과합니다.

다음 표에서는 gamultiobj 솔버에 대한 종료 플래그를 설명합니다.

paretosearch의 종료 플래그상응하는 숫자의미
SolverConvergedSuccessfully1options.MaxStallGenerations번의 생성 동안 산포 값의 상대적 변화의 기하 평균이 options.FunctionTolerance보다 작고, 최종 산포 값이 지난 options.MaxStallGenerations번의 생성 동안의 평균 산포 값보다 작습니다.
SolverLimitExceeded0생성 횟수가 options.MaxGenerations를 초과합니다.
OutputFcnStop–1출력 함수나 플롯 함수에 의해 중지되었습니다.
NoFeasiblePointFound–2솔버가 모든 제약 조건을 충족하는 점을 찾을 수 없습니다.
TimeLimitExceeded–5최적화 시간이 options.MaxTime을 초과합니다.

최적화 과정에 대한 정보로, 구조체로 반환됩니다. 출력 구조체에는 solve가 호출한 솔버에 따라 관련 기본 솔버 출력 필드에 다음 필드가 포함됩니다.

  • 'ga' output (Global Optimization Toolbox)

  • 'gamultiobj' output (Global Optimization Toolbox)

  • 'paretosearch' output (Global Optimization Toolbox)

  • 'particleswarm' output (Global Optimization Toolbox)

  • 'patternsearch' output (Global Optimization Toolbox)

  • 'simulannealbnd' output (Global Optimization Toolbox)

  • 'surrogateopt' output (Global Optimization Toolbox)

  • 'MultiStart''GlobalSearch'는 로컬 솔버의 출력 구조체를 반환합니다. 또한 출력 구조체에는 다음 필드가 포함되어 있습니다.

    • globalSolver'MultiStart' 또는 'GlobalSearch'입니다.

    • objectiveDerivative — 이 섹션의 끝부분에 설명되어 있는 값을 받습니다.

    • constraintDerivative — 이 섹션의 끝부분에 설명되어 있는 값을 받거나, prob에 비선형 제약 조건이 없는 경우 "auto"입니다.

    • solver'fmincon'과 같은 로컬 솔버입니다.

    • local — 최적화에 대한 추가 정보를 포함하는 구조체입니다.

      • sol — 국소해로, OptimizationValues 객체로 구성된 벡터로 반환됩니다.

      • x0 — 로컬 솔버에 대한 초기점으로, 셀형 배열로 반환됩니다.

      • exitflag — 국소해의 종료 플래그로, 정수형 벡터로 반환됩니다.

      • output — 한 행이 각 국소해인 구조체형 배열입니다. 각 행이 국소 출력 구조체로서, 하나의 국소해에 대응합니다.

solve는 사용된 솔버(예: 'intlinprog')를 식별하기 위해 output 구조체에 추가 필드 Solver를 포함합니다.

Solver가 비선형 Optimization Toolbox™ 솔버이면 solve는 도함수 추정 유형을 설명하는 하나 또는 두 개의 추가 필드를 포함합니다. objectivederivative 필드와 constraintderivative 필드(적합한 경우)는 다음 값을 가질 수 있습니다.

  • 역방향 자동 미분의 경우 "reverse-AD"

  • 순방향 자동 미분의 경우 "forward-AD"

  • 유한 차분 추정의 경우 "finite-differences"

  • 선형 함수 또는 2차 함수의 경우 "closed-form"

자세한 내용은 Automatic Differentiation Background 항목을 참조하십시오.

해에서의 라그랑주 승수로, 구조체로 반환됩니다.

참고

solve는 방정식 풀이 문제에 대해 lambda를 반환하지 않습니다.

intlinprog 솔버와 fminunc 솔버의 경우 lambda는 비어 있습니다([]). 다른 솔버의 경우 lambda는 다음 필드를 가집니다.

  • Variables – 각 문제 변수에 대한 필드를 포함합니다. 각 문제 변수 이름은 다음 2개의 필드를 갖는 구조체입니다.

    • Lower – 변수 LowerBound 속성과 연결된 라그랑주 승수로, 변수와 같은 크기의 배열로 반환됩니다. 0이 아닌 요소는 해가 하한에 있음을 의미합니다. 이러한 승수는 구조체 lambda.Variables.variablename.Lower에 있습니다.

    • Upper – 변수 UpperBound 속성과 연결된 라그랑주 승수로, 변수와 같은 크기의 배열로 반환됩니다. 0이 아닌 요소는 해가 상한에 있음을 의미합니다. 이러한 승수는 구조체 lambda.Variables.variablename.Upper에 있습니다.

  • Constraints – 각 문제 제약 조건에 대한 필드를 포함합니다. 각 문제 제약 조건은 제약 조건의 이름을 구조체의 이름으로 갖고, 제약 조건과 같은 크기의 숫자형 배열을 값으로 갖는 구조체로 구성됩니다. 0이 아닌 요소는 제약 조건이 해에서 활성 상태임을 의미합니다. 이러한 승수는 구조체 lambda.Constraints.constraintname에 있습니다.

    참고

    제약 조건 배열의 요소는 모두 같은 비교 연산자(<=, == 또는 >=)를 가지며 모두 같은 유형(선형, 2차 또는 비선형)입니다.

알고리즘

모두 축소

솔버 형식으로 변환하기

solve 함수는 내부적으로 다음과 같은 솔버를 호출하여 최적화 문제를 풉니다. 문제의 디폴트 솔버와 지원되는 솔버에 대한 설명은 solvers 함수를 참조하십시오. solve를 호출할 때 'solver' 이름-값 쌍 인수를 사용하여 디폴트 값을 재정의할 수 있습니다.

문제를 솔버 형식으로 변환해야 solve가 솔버를 호출할 수 있습니다. 솔버 형식은 solve 또는 일부 다른 연결된 함수 또는 객체입니다. 예를 들어, 이 변환에는 최적화 변수 표현식이 아닌 행렬 표현을 가진 선형 제약 조건이 수반됩니다.

알고리즘의 첫 번째 단계는 문제에 최적화 표현식을 적용하는 것입니다. OptimizationProblem 객체에는 표현식에 사용되는 변수의 내부 목록이 있습니다. 각 변수는 표현식에서 선형 인덱스와 크기를 가집니다. 따라서 문제 변수는 자연스럽게 행렬 형식을 갖게 됩니다. prob2struct 함수가 문제 형식에서 솔버 형식으로의 변환을 수행합니다. 예제는 Convert Problem to Structure 항목을 참조하십시오.

비선형 최적화 문제의 경우, solve자동 미분을 사용하여 목적 함수와 비선형 제약 조건 함수의 기울기를 계산합니다. 이런 도함수는 목적 함수와 제약 조건 함수가 Supported Operations for Optimization Variables and Expressions 항목으로 구성되어 있을 때 적용됩니다. 자동 미분이 적용되지 않으면 솔버는 유한 차분을 사용해 도함수를 추정합니다. 자동 미분에 대한 자세한 내용은 Automatic Differentiation Background 항목을 참조하십시오. solve가 자동 미분에 ObjectiveDerivative 이름-값 인수를 사용하는 방법을 사용자가 제어할 수 있습니다.

intlinprog가 MILP 문제를 푸는 데 사용하는 알고리즘에 대해서는 intlinprog 알고리즘 항목을 참조하십시오. linprog가 선형 계획법 문제를 푸는 데 사용하는 알고리즘에 대해서는 선형 계획법 알고리즘 항목을 참조하십시오. quadprog가 2차 계획법 문제를 푸는 데 사용하는 알고리즘에 대해서는 2차 계획법 알고리즘 항목을 참조하십시오. 선형 또는 비선형 최소제곱 솔버 알고리즘에 대해서는 최소제곱(모델 피팅) 알고리즘 항목을 참조하십시오. 비선형 솔버 알고리즘에 대해서는 제약 조건이 없는 비선형 최적화 알고리즘제약 조건이 있는 비선형 최적화 알고리즘 항목을 참조하십시오. Global Optimization Toolbox 솔버 알고리즘에 대한 내용은 Global Optimization Toolbox 문서를 참조하십시오.

비선형 방정식 풀이의 경우 solve는 내부적으로 각 방정식을 좌변과 우변 사이의 차로 표현합니다. 그런 다음 solve는 방정식 성분의 제곱합을 최소화하려고 시도합니다. 비선형 연립방정식 풀이를 위한 알고리즘에 대해서는 방정식 풀이 알고리즘 항목을 참조하십시오. 문제에 범위도 있는 경우, solve는 방정식 성분의 제곱합을 최소화하기 위해 lsqnonlin을 호출합니다. 최소제곱(모델 피팅) 알고리즘 항목을 참조하십시오.

참고

목적 함수가 제곱합이고 이를 그렇게 인식하도록 solve에 전달하려면 목적 함수를 expr'*expr 또는 다른 형태가 아니라 norm(expr)^2 또는 sum(expr.^2)으로 쓰십시오. 내장 구문 분석기는 노름의 제곱 또는 명시적인 제곱합으로 표현될 때만 제곱합을 인식합니다. 자세한 내용은 Write Objective Function for Problem-Based Least Squares 항목을 참조하십시오. 예제는 Nonnegative Linear Least Squares, Problem-Based 항목을 참조하십시오.

자동 미분

다음 조건 하에 자동 미분(AD)은 solve 함수와 prob2struct 함수에 적용됩니다.

  • Supported Operations for Optimization Variables and Expressions에 설명되어 있는 대로, 목적 함수와 제약 조건 함수가 지원됩니다. 이들 함수에서는 fcn2optimexpr 함수를 사용하지 않아도 됩니다.

  • solve에 의해 호출되는 솔버는 fmincon, fminunc, fsolve 또는 lsqnonlin입니다.

  • 최적화 문제의 경우, solve 또는 prob2struct에 대한 'ObjectiveDerivative''ConstraintDerivative' 이름-값 쌍의 인수는 'auto'(디폴트 값), 'auto-forward' 또는 'auto-reverse'로 설정됩니다.

  • 방정식 문제의 경우, 'EquationDerivative' 옵션은 'auto'(디폴트 값), 'auto-forward' 또는 'auto-reverse'로 설정됩니다.

AD가 적용될 때모든 제약 조건 함수가 지원됨하나 이상의 제약 조건이 지원 안 됨
목적 함수가 지원됨AD가 목적 함수 및 제약 조건에 사용됨AD가 목적 함수에만 사용됨
목적 함수가 지원 안 됨AD가 제약 조건에만 사용됨AD가 사용 안 됨

참고

선형 함수, 2차 목적 함수 또는 제약 조건 함수의 경우, 적용 가능한 솔버는 항상 양함수 기울기를 사용합니다. 이러한 기울기는 AD를 사용하여 생성되지 않습니다. Closed Form 항목을 참조하십시오.

이러한 조건이 충족되지 않으면 solve는 유한 차분으로 기울기를 추정하고, prob2struct는 생성된 함수 파일에서 기울기를 생성하지 않습니다.

솔버는 기본적으로 다음 유형의 AD를 선택합니다.

  • 일반적인 비선형 목적 함수의 경우 fmincon은 기본적으로 목적 함수에 대해 역방향 AD를 사용합니다. 비선형 제약 조건의 개수가 변수의 개수보다 작은 경우 fmincon은 기본적으로 비선형 제약 조건 함수에 대해 역방향 AD를 사용합니다. 그렇지 않은 경우 fmincon은 기본적으로 비선형 제약 조건 함수에 대해 순방향 AD를 사용합니다.

  • 일반적인 비선형 목적 함수의 경우 fminunc는 기본적으로 역방향 AD를 사용합니다.

  • 최소제곱 목적 함수의 경우 fminconfminunc는 기본적으로 목적 함수에 대해 순방향 AD를 사용합니다. 문제 기반 최소제곱 목적 함수의 정의를 보려면 Write Objective Function for Problem-Based Least Squares 항목을 참조하십시오.

  • 목적 벡터의 요소 개수가 변수의 개수보다 크거나 같은 경우 lsqnonlin은 기본적으로 순방향 AD를 사용합니다. 그렇지 않은 경우 lsqnonlin은 기본적으로 역방향 AD를 사용합니다.

  • 방정식의 개수가 변수의 개수보다 크거나 같은 경우 fsolve는 기본적으로 순방향 AD를 사용합니다. 그렇지 않은 경우 fsolve는 기본적으로 역방향 AD를 사용합니다.

참고

prob2struct에 의해 변환된 문제에서 자동 도함수를 사용하려면 이러한 도함수를 지정하는 옵션을 전달하십시오.

options = optimoptions('fmincon','SpecifyObjectiveGradient',true,...
    'SpecifyConstraintGradient',true);
problem.options = options;

현재, AD는 1계 도함수에만 유효하고 2계 또는 그 이상의 도함수에는 적용되지 않습니다. 예를 들어, 해석적 헤세 행렬을 사용해 최적화 속도를 높이고 싶은 경우 solve를 직접 사용할 수는 없고, 그 대신에 Supply Derivatives in Problem-Based Workflow에 설명되어 있는 접근법을 사용해야 합니다.

확장 기능

버전 내역

R2017b에 개발됨

모두 확장