이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
solve
최적화 문제 또는 방정식 문제 풀기
구문
설명
solve
를 사용하여 최적화 문제 또는 방정식 문제의 해를 구합니다.
팁
전체 워크플로는 문제 기반 최적화 워크플로 또는 방정식 풀이를 위한 문제 기반 워크플로 항목을 참조하십시오.
예제
선형 계획법 문제 풀기
최적화 문제로 정의된 선형 계획법 문제를 풉니다.
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
함수의 최솟값을 영역 에서 구합니다. 이를 위해 최적화 변수 x
와 y
를 생성합니다.
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. Running HiGHS 1.6.0: Copyright (c) 2023 HiGHS under MIT licence terms Presolving model 4 rows, 8 cols, 32 nonzeros 4 rows, 8 cols, 27 nonzeros Objective function is integral with scale 1 Solving MIP model with: 4 rows 8 cols (0 binary, 8 integer, 0 implied int., 0 continuous) 27 nonzeros Nodes | B&B Tree | Objective Bounds | Dynamic Constraints | Work Proc. InQueue | Leaves Expl. | BestBound BestSol Gap | Cuts InLp Confl. | LpIters Time 0 0 0 0.00% 0 inf inf 0 0 0 0 0.0s 0 0 0 0.00% 1554.047531 inf inf 0 0 4 4 0.0s T 20753 210 8189 98.04% 1783.696925 1854 3.79% 30 8 9884 19222 4.8s Solving report Status Optimal Primal bound 1854 Dual bound 1854 Gap 0% (tolerance: 0.01%) Solution status feasible 1854 (objective) 0 (bound viol.) 9.63673585375e-14 (int. viol.) 0 (row viol.) Timing 4.93 (total) 0.01 (presolve) 0.00 (postsolve) Nodes 21163 LP iterations 19608 (total) 223 (strong br.) 76 (separation) 1018 (heuristics) Optimal solution found. Intlinprog stopped because the objective value is within a gap tolerance of the optimal value, options.AbsoluteGapTolerance = 1e-06. The intcon variables are integer within tolerance, options.ConstraintTolerance = 1e-06.
비교를 위해 초기 실현가능점을 사용하여 해를 구합니다.
x0.x = [8 62 23 103 53 84 46 34]'; [x2,fval2,exitflag2,output2] = solve(prob,x0);
Solving problem using intlinprog. Running HiGHS 1.6.0: Copyright (c) 2023 HiGHS under MIT licence terms Solution has num max sum Col infeasibilities 0 0 0 Integer infeasibilities 0 0 0 Row infeasibilities 0 0 0 Row residuals 0 0 0 Presolving model 4 rows, 8 cols, 32 nonzeros 4 rows, 8 cols, 27 nonzeros MIP start solution is feasible, objective value is 3901 Objective function is integral with scale 1 Solving MIP model with: 4 rows 8 cols (0 binary, 8 integer, 0 implied int., 0 continuous) 27 nonzeros Nodes | B&B Tree | Objective Bounds | Dynamic Constraints | Work Proc. InQueue | Leaves Expl. | BestBound BestSol Gap | Cuts InLp Confl. | LpIters Time 0 0 0 0.00% 0 3901 100.00% 0 0 0 0 0.0s 0 0 0 0.00% 1554.047531 3901 60.16% 0 0 4 4 0.0s T 6266 708 2644 73.61% 1662.791423 3301 49.63% 20 6 9746 10699 2.5s T 9340 919 3970 80.72% 1692.410008 2687 37.01% 29 6 9995 16120 3.8s 20602 1769 9007 94.23% 1784.306189 2687 33.59% 17 6 9984 38182 8.8s T 21750 192 9514 96.83% 1791.542628 1854 3.37% 20 6 9984 40278 9.2s Solving report Status Optimal Primal bound 1854 Dual bound 1854 Gap 0% (tolerance: 0.01%) Solution status feasible 1854 (objective) 0 (bound viol.) 1.42108547152e-13 (int. viol.) 0 (row viol.) Timing 9.35 (total) 0.00 (presolve) 0.00 (postsolve) Nodes 22163 LP iterations 40863 (total) 538 (strong br.) 64 (separation) 2782 (heuristics) Optimal solution found. Intlinprog stopped because the objective value is within a gap tolerance of the optimal value, options.AbsoluteGapTolerance = 1e-06. The intcon variables are integer within tolerance, options.ConstraintTolerance = 1e-06.
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 21163 steps. With an initial point, solve took 22163 steps.
초기점을 제공한다고 해서 항상 문제가 개선되는 것은 아닙니다. 이 문제에서는 초기점을 사용함으로써 시간과 계산 스텝을 절약할 수 있습니다. 그러나, 일부 문제에서는 초기점으로 인해 solve
가 더 많은 스텝을 실행하게 될 수 있습니다.
surrogateopt
에 대한 시작점 및 값 지정하기, 문제 기반
일부 솔버의 경우, 목적 함수 값과 제약 조건 함수 값(있는 경우)을 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.
surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
sol = struct with fields:
x: 0.2279
y: -1.6258
fval = -6.5511
eflag = SolverLimitExceeded
output = struct with fields:
elapsedtime: 40.3154
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]
에서 시작하여 범위 에서 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보다 낮습니다.
디폴트가 아닌 옵션으로 정수 계획법 문제 풀기
다음 문제를 풀어 보겠습니다.
이때 반복 과정은 표시하지 않습니다.
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: 0
해를 검토합니다.
sol.x
ans = 2×1
0
6
sol.x3
ans = 0
intlinprog
를 사용하여 선형 계획법 풀기
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. Running HiGHS 1.6.0: Copyright (c) 2023 HiGHS under MIT licence terms Presolving model 6 rows, 2 cols, 12 nonzeros 4 rows, 2 cols, 8 nonzeros 4 rows, 2 cols, 8 nonzeros Presolve : Reductions: rows 4(-2); columns 2(-0); elements 8(-4) Solving the presolved LP Using EKK dual simplex solver - serial Iteration Objective Infeasibilities num(sum) 0 -1.3333333333e+03 Ph1: 3(4499); Du: 2(1.33333) 0s 3 -1.1111111111e+00 Pr: 0(0) 0s Solving the original LP from the solution after postsolve Model status : Optimal Simplex iterations: 3 Objective value : -1.1111111111e+00 HiGHS run time : 0.01 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. Running HiGHS 1.6.0: Copyright (c) 2023 HiGHS under MIT licence terms Presolving model 2 rows, 3 cols, 6 nonzeros 0 rows, 0 cols, 0 nonzeros Presolve: Optimal Solving report Status Optimal Primal bound -12 Dual bound -12 Gap 0% (tolerance: 0.01%) Solution status feasible -12 (objective) 0 (bound viol.) 0 (int. viol.) 0 (row viol.) Timing 0.00 (total) 0.00 (presolve) 0.00 (postsolve) Nodes 0 LP iterations 0 (total) 0 (strong br.) 0 (separation) 0 (heuristics) Optimal solution found. Intlinprog stopped at the root node because the objective value is within a gap tolerance of the optimal value, options.AbsoluteGapTolerance = 1e-06. The intcon variables are integer within tolerance, options.ConstraintTolerance = 1e-06.
sol = struct with fields:
x: [2x1 double]
x3: 0
fval = -12
exitflag = OptimalSolution
output = struct with fields:
relativegap: 0
absolutegap: 0
numfeaspoints: []
numnodes: 0
constrviolation: 0
algorithm: 'highs'
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. Running HiGHS 1.6.0: Copyright (c) 2023 HiGHS under MIT licence terms Presolving model 3 rows, 12 cols, 12 nonzeros 3 rows, 12 cols, 12 nonzeros Solving MIP model with: 3 rows 12 cols (0 binary, 12 integer, 0 implied int., 0 continuous) 12 nonzeros Nodes | B&B Tree | Objective Bounds | Dynamic Constraints | Work Proc. InQueue | Leaves Expl. | BestBound BestSol Gap | Cuts InLp Confl. | LpIters Time 0 0 0 0.00% 1160.150059 -inf inf 0 0 0 0 0.0s S 0 0 0 0.00% 1160.150059 1027.233133 12.94% 0 0 0 0 0.0s Solving report Status Optimal Primal bound 1027.23313332 Dual bound 1027.23313332 Gap 0% (tolerance: 0.01%) Solution status feasible 1027.23313332 (objective) 0 (bound viol.) 0 (int. viol.) 0 (row viol.) Timing 0.02 (total) 0.01 (presolve) 0.00 (postsolve) Nodes 1 LP iterations 3 (total) 0 (strong br.) 0 (separation) 0 (heuristics) Optimal solution found. Intlinprog stopped at the root node because the objective value is within a gap tolerance of the optimal value, options.AbsoluteGapTolerance = 1e-06. The intcon variables are integer within tolerance, options.ConstraintTolerance = 1e-06.
뉴욕과 로스앤젤레스로 향하는 오렌지와 베리의 최적 흐름을 구합니다.
[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
로 간다는 것입니다.
문제 기반 접근법을 사용하여 비선형 연립방정식 풀기
문제 기반 접근법을 사용하여 다음과 같은 비선형 연립방정식을 풀려면
먼저 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 항목을 참조하십시오.
입력 인수
prob
— 최적화 문제 또는 방정식 문제
OptimizationProblem
객체 | EquationProblem
객체
최적화 문제 또는 방정식 문제로, OptimizationProblem
객체 또는 EquationProblem
객체로 지정됩니다. 최적화 문제는 optimproblem
을 사용하여 만들고, 방정식 문제는 eqnproblem
을 사용하여 만듭니다.
경고
문제 기반 접근법은 목적 함수, 비선형 등식, 비선형 부등식에서 복소수 값을 지원하지 않습니다. 함수 계산에 중간값으로라도 복소수 값이 포함될 경우, 최종 결과가 올바르지 않을 수 있습니다.
예: prob = optimproblem; prob.Objective = obj; prob.Constraints.cons1 = cons1;
예: prob = eqnproblem; prob.Equations = eqs;
x0
— 초기점
구조체 | OptimizationValues
객체로 구성된 벡터
초기점으로, 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 항목을 참조하십시오.
예: prob
에 x
와 y
라는 변수가 있는 경우: x0.x = [3,2,17]; x0.y = [pi/3,2*pi/3]
.
데이터형: struct
ms
— 복수 시작점 솔버
MultiStart
객체 | GlobalSearch
객체
복수 시작점 솔버로, MultiStart
(Global Optimization Toolbox) 객체 또는 GlobalSearch
(Global Optimization Toolbox) 객체로 지정됩니다. MultiStart
명령이나 GlobalSearch
명령을 사용하여 ms
를 만듭니다.
현재, GlobalSearch
는 fmincon
로컬 솔버만 지원하고 MultiStart
는 fmincon
, fminunc
, lsqnonlin
로컬 솔버만 지원합니다.
예: ms = MultiStart;
예: ms = GlobalSearch(FunctionTolerance=1e-4);
이름-값 인수
선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN
으로 지정합니다. 여기서 Name
은 인수 이름이고 Value
는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.
R2021a 이전 릴리스에서는 쉼표를 사용하여 각 이름과 값을 구분하고 Name
을 따옴표로 묶으십시오.
예: solve(prob,'Options',opts)
MinNumStartPoints
— MultiStart
에 대한 시작점의 최소 개수
20 (디폴트 값) | 양의 정수
MultiStart
(Global Optimization Toolbox)에 대한 시작점의 최소 개수로, 양의 정수로 지정됩니다. 이 인수는 ms
인수를 사용하여 solve
함수를 호출할 때만 적용됩니다. solve
함수는 x0
의 모든 값을 시작점으로 사용합니다. MinNumStartPoints
가 x0
에 포함된 값의 개수보다 크면 solve
함수는 문제 범위 내에서 무작위로 균일하게 시작점을 추가로 생성합니다. 성분이 비유계인 경우 solve
함수는 MultiStart
의 디폴트 인위적 경계를 사용하여 점을 생성합니다.
예: solve(prob,x0,ms,MinNumStartPoints=50)
데이터형: double
Options
— 최적화 옵션
optimoptions
에 의해 생성되는 객체 | options 구조체
최적화 옵션으로, 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')
Solver
— 최적화 솔버
'intlinprog'
| 'linprog'
| 'lsqlin'
| 'lsqcurvefit'
| 'lsqnonlin'
| 'lsqnonneg'
| 'quadprog'
| 'fminbnd'
| 'fminunc'
| 'fmincon'
| 'fminsearch'
| 'fzero'
| 'fsolve'
| 'coneprog'
| 'ga'
| 'gamultiobj'
| 'paretosearch'
| 'patternsearch'
| 'particleswarm'
| 'surrogateopt'
| 'simulannealbnd'
최적화 솔버로, 아래 나열된 솔버의 이름으로 지정됩니다. 최적화 문제에 대해 다음 표에서는 Global Optimization Toolbox의 솔버를 비롯하여 각 최적화 문제 유형에서 사용 가능한 솔버를 보여줍니다 방정식 문제의 세부 정보는 최적화 솔버 세부 정보 아래 표시됩니다.
비선형 문제를 prob2struct
를 사용하여 정수 제약 조건으로 변환하는 경우 결과 문제 구조체는 선택한 솔버에 따라 달라질 수 있습니다. Global Optimization Toolbox 라이선스가 없으면 솔버를 지정해야 합니다. 비선형 문제 기반 최적화에서의 정수 제약 조건 항목을 참조하십시오.
각 최적화 문제 유형에 관한 디폴트 솔버는 아래 나열되어 있습니다.
문제 유형 | 기본 솔버 |
---|---|
선형 계획법(LP) | linprog |
혼합 정수 선형 계획법(MILP) | intlinprog |
2차 계획법(QP) | quadprog |
2차 원뿔 계획법(SOCP) | coneprog |
선형 최소제곱 | lsqlin |
비선형 최소제곱 | lsqnonlin |
비선형 계획법(NLP) | |
혼합 정수 비선형 계획법(MINLP) | ga (Global Optimization Toolbox) |
다중 목적 함수 | gamultiobj (Global Optimization Toolbox) |
다음 표에서 는 문제 유형에 사용할 수 있는 솔버가 있음을 나타내며 x는 사용할 수 있는 솔버가 없음을 나타냅니다.
문제 유형 | LP | MILP | QP | SOCP | 선형 최소제곱 | 비선형 최소제곱 | NLP | MINLP |
---|---|---|---|---|---|---|---|---|
솔버 | ||||||||
linprog | | x | x | x | x | x | x | x |
intlinprog | | | x | x | x | x | x | x |
quadprog | | x | | | | x | x | x |
coneprog | | x | x | | x | x | x | x |
lsqlin | x | x | x | x | | x | x | x |
lsqnonneg | x | x | x | x | | x | x | x |
lsqnonlin | x | x | x | x | | | x | x |
fminunc | | x | | x | | | | x |
fmincon | | x | | | | | | x |
fminbnd | x | x | x | x | | | | x |
fminsearch | x | x | x | x | | | | x |
patternsearch (Global Optimization Toolbox) | | x | | | | | | x |
ga (Global Optimization Toolbox) | | | | | | | | |
particleswarm (Global Optimization Toolbox) | | x | | x | | | | x |
simulannealbnd (Global Optimization Toolbox) | | x | | x | | | | x |
surrogateopt (Global Optimization Toolbox) | | | | | | | | |
gamultiobj (Global Optimization Toolbox) | | | | | | | | |
paretosearch (Global Optimization Toolbox) | | x | | | | | | x |
참고
최소제곱 문제에 대한 솔버로 lsqcurvefit
을 선택할 경우 solve
는 lsqnonlin
을 사용합니다. lsqcurvefit
솔버와 lsqnonlin
솔버는 solve
에 대해 동일합니다.
주의
최대화 문제(prob.ObjectiveSense
가 "max"
또는 "maximize"
인 문제)의 경우, 최소제곱 솔버(이름이 lsq
로 시작하는 솔버)를 지정하지 마십시오. 이러한 솔버는 최대화할 수 없으므로 이들을 지정하면 solve
가 오류를 발생시킵니다.
다음 표에서는 각 방정식 풀이 문제 유형에서 사용 가능한 솔버를 보여줍니다 각 표시의 의미는 다음과 같습니다.
*는 해당 문제 유형에 대한 디폴트 솔버를 나타냅니다.
Y는 사용 가능한 솔버를 나타냅니다.
N은 사용할 수 없는 솔버를 나타냅니다.
방정식에 대해 지원되는 솔버
방정식 유형 | lsqlin | lsqnonneg | fzero | fsolve | lsqnonlin |
---|---|---|---|---|---|
선형 | * | N | Y(스칼라만 해당) | Y | Y |
선형 및 유계 | * | Y | N | N | Y |
스칼라 비선형 | N | N | * | Y | Y |
비선형 시스템 | N | N | N | * | Y |
비선형 시스템 및 유계 | N | N | N | N | * |
예: 'intlinprog'
데이터형: char
| string
ObjectiveDerivative
— 목적 함수에 자동 미분을 사용한다는 표시
'auto'
(디폴트 값) | 'auto-forward'
| 'auto-reverse'
| 'finite-differences'
비선형 목적 함수에 자동 미분(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를 사용합니다.최소제곱 목적 함수의 경우
fmincon
과fminunc
는 기본적으로 목적 함수에 대해 순방향 AD를 사용합니다. 문제 기반 최소제곱 목적 함수의 정의를 보려면 Write Objective Function for Problem-Based Least Squares 항목을 참조하십시오.목적 벡터의 요소 개수가 변수의 개수보다 크거나 같은 경우
lsqnonlin
은 기본적으로 순방향 AD를 사용합니다. 그렇지 않은 경우lsqnonlin
은 기본적으로 역방향 AD를 사용합니다.방정식의 개수가 변수의 개수보다 크거나 같은 경우
fsolve
는 기본적으로 순방향 AD를 사용합니다. 그렇지 않은 경우fsolve
는 기본적으로 역방향 AD를 사용합니다.
예: 'finite-differences'
데이터형: char
| string
ConstraintDerivative
— 제약 조건 함수에 자동 미분을 사용한다는 표시
'auto'
(디폴트 값) | 'auto-forward'
| 'auto-reverse'
| 'finite-differences'
비선형 제약 조건 함수에 자동 미분(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를 사용합니다.최소제곱 목적 함수의 경우
fmincon
과fminunc
는 기본적으로 목적 함수에 대해 순방향 AD를 사용합니다. 문제 기반 최소제곱 목적 함수의 정의를 보려면 Write Objective Function for Problem-Based Least Squares 항목을 참조하십시오.목적 벡터의 요소 개수가 변수의 개수보다 크거나 같은 경우
lsqnonlin
은 기본적으로 순방향 AD를 사용합니다. 그렇지 않은 경우lsqnonlin
은 기본적으로 역방향 AD를 사용합니다.방정식의 개수가 변수의 개수보다 크거나 같은 경우
fsolve
는 기본적으로 순방향 AD를 사용합니다. 그렇지 않은 경우fsolve
는 기본적으로 역방향 AD를 사용합니다.
예: 'finite-differences'
데이터형: char
| string
EquationDerivative
— 방정식에 자동 미분을 사용한다는 표시
'auto'
(디폴트 값) | 'auto-forward'
| 'auto-reverse'
| 'finite-differences'
비선형 제약 조건 함수에 자동 미분(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를 사용합니다.최소제곱 목적 함수의 경우
fmincon
과fminunc
는 기본적으로 목적 함수에 대해 순방향 AD를 사용합니다. 문제 기반 최소제곱 목적 함수의 정의를 보려면 Write Objective Function for Problem-Based Least Squares 항목을 참조하십시오.목적 벡터의 요소 개수가 변수의 개수보다 크거나 같은 경우
lsqnonlin
은 기본적으로 순방향 AD를 사용합니다. 그렇지 않은 경우lsqnonlin
은 기본적으로 역방향 AD를 사용합니다.방정식의 개수가 변수의 개수보다 크거나 같은 경우
fsolve
는 기본적으로 순방향 AD를 사용합니다. 그렇지 않은 경우fsolve
는 기본적으로 역방향 AD를 사용합니다.
예: 'finite-differences'
데이터형: char
| string
출력 인수
sol
— 해(Solution)
구조체 | OptimizationValues
벡터
해로, 구조체 또는 OptimizationValues
벡터로 반환됩니다. 문제가 다중 목적 함수일 때 sol
은 OptimizationValues
벡터가 됩니다. 단일 목적 함수 문제의 경우, 반환된 구조체의 필드는 문제에 있는 최적화 변수의 이름입니다. optimvar
을 참조하십시오.
fval
— 해에서 계산된 목적 함수 값
실수 | 실수형 벡터 | 실수 행렬 | 구조체
해에서 계산된 목적 함수 값으로, 다음 중 하나로 반환됩니다.
문제 유형 | 반환 값 |
---|---|
스칼라 목적 함수 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
exitflag
— 솔버가 중지된 이유
열거형 변수
솔버가 중지된 이유로, 열거형 변수로 반환됩니다. exitflag
는 double(exitflag)
를 사용하여 상응하는 숫자로 변환할 수 있고 string(exitflag)
를 사용하여 상응하는 문자열로 변환할 수 있습니다.
다음 표에서는 intlinprog
솔버에 대한 종료 플래그를 설명합니다.
intlinprog 의 종료 플래그 | 상응하는 숫자 | 의미 |
---|---|---|
OptimalWithPoorFeasibility | 3 | 이 해는 상대 |
IntegerFeasible | 2 | intlinprog 가 중도에 중지되었고 정수 실현가능점을 찾았습니다. |
OptimalSolution |
| 솔버가 해 |
SolverLimitExceeded |
|
허용오차와 중지 기준 항목을 참조하십시오. |
OutputFcnStop | -1 | intlinprog 가 출력 함수나 플롯 함수에 의해 중지되었습니다. |
NoFeasiblePointFound |
| 실현가능점을 찾지 못했습니다. |
Unbounded |
| 문제가 비유계입니다. |
FeasibilityLost |
| 솔버가 실현가능성을 잃었습니다. |
종료 플래그 3
과 -9
는 실현불가능성이 큰 해와 관계가 있습니다. 이런 종료 플래그는 보통 큰 조건수를 갖는 선형 제약 조건 행렬이나 큰 해 성분이 있는 문제에서 비롯됩니다. 이런 문제를 해결하려면 계수 행렬을 스케일링하거나 중복된 선형 제약 조건을 제거하거나 변수에 대해 더 엄밀한 범위를 지정해 보십시오.
다음 표에서는 linprog
솔버에 대한 종료 플래그를 설명합니다.
linprog 의 종료 플래그 | 상응하는 숫자 | 의미 |
---|---|---|
OptimalWithPoorFeasibility | 3 | 이 해는 상대 |
OptimalSolution | 1 | 솔버가 해 |
SolverLimitExceeded | 0 | 반복 횟수가 |
NoFeasiblePointFound | -2 | 실현가능점을 찾지 못했습니다. |
Unbounded | -3 | 문제가 비유계입니다. |
FoundNaN | -4 | 알고리즘 실행 도중 |
PrimalDualInfeasible | -5 | 원문제(Primal)와 쌍대 문제(Dual) 모두 실현 가능하지 않습니다. |
DirectionTooSmall | -7 | 탐색 방향이 너무 작습니다. 더 이상 진행할 수 없습니다. |
FeasibilityLost | -9 | 솔버가 실현가능성을 잃었습니다. |
종료 플래그 3
과 -9
는 실현불가능성이 큰 해와 관계가 있습니다. 이런 종료 플래그는 보통 큰 조건수를 갖는 선형 제약 조건 행렬이나 큰 해 성분이 있는 문제에서 비롯됩니다. 이런 문제를 해결하려면 계수 행렬을 스케일링하거나 중복된 선형 제약 조건을 제거하거나 변수에 대해 더 엄밀한 범위를 지정해 보십시오.
다음 표에서는 lsqlin
솔버에 대한 종료 플래그를 설명합니다.
lsqlin 의 종료 플래그 | 상응하는 숫자 | 의미 |
---|---|---|
FunctionChangeBelowTolerance | 3 | 잔차의 변화량이 지정된 허용오차 |
StepSizeBelowTolerance |
| 스텝 크기가 |
OptimalSolution | 1 | 솔버가 해 |
SolverLimitExceeded | 0 | 반복 횟수가 |
NoFeasiblePointFound | -2 | 최적화 문제의 경우 문제가 실현 가능하지 않습니다. 또는, 방정식 문제의 경우 구해진 해가 없습니다. |
IllConditioned | -4 | 조건이 나빠 최적화가 더 이상 진행되지 않습니다. |
NoDescentDirectionFound | -8 | 탐색 방향이 너무 작습니다. 더 이상 진행할 수 없습니다. ( |
다음 표에서는 quadprog
솔버에 대한 종료 플래그를 설명합니다.
quadprog 의 종료 플래그 | 상응하는 숫자 | 의미 |
---|---|---|
LocalMinimumFound | 4 | 국소 최솟값을 찾았거나, 최솟값이 고유하지 않습니다. |
FunctionChangeBelowTolerance | 3 | 목적 함수 값의 변화량이 지정된 허용오차 |
StepSizeBelowTolerance |
| 스텝 크기가 |
OptimalSolution | 1 | 솔버가 해 |
SolverLimitExceeded | 0 | 반복 횟수가 |
NoFeasiblePointFound | -2 | 문제가 실현 불가능한지 여부. 또는, |
IllConditioned | -4 | 조건이 나빠 최적화가 더 이상 진행되지 않습니다. |
Nonconvex |
| 비볼록 문제가 감지되었습니다. ( |
NoDescentDirectionFound | -8 | 스텝 방향을 계산할 수 없습니다. ( |
다음 표에서는 coneprog
솔버에 대한 종료 플래그를 설명합니다.
coneprog 의 종료 플래그 | 상응하는 숫자 | 의미 |
---|---|---|
OptimalSolution | 1 | 솔버가 해 |
SolverLimitExceeded | 0 | 반복 횟수가 |
NoFeasiblePointFound | -2 | 문제가 실현 불가능한지 여부. |
Unbounded | -3 | 문제가 비유계입니다. |
DirectionTooSmall |
| 탐색 방향이 너무 작아졌습니다. 더 이상 진행할 수 없습니다. |
Unstable | -10 | 문제가 수치적으로 불안정합니다. |
다음 표에서는 lsqcurvefit
또는 lsqnonlin
솔버에 대한 종료 플래그를 설명합니다.
lsqnonlin 의 종료 플래그 | 상응하는 숫자 | 의미 |
---|---|---|
SearchDirectionTooSmall | 4 | 탐색 방향의 크기가 |
FunctionChangeBelowTolerance | 3 | 잔차의 변화량이 |
StepSizeBelowTolerance |
| 스텝 크기가 |
OptimalSolution | 1 | 솔버가 해 |
SolverLimitExceeded | 0 | 반복 횟수가 |
OutputFcnStop | -1 | 출력 함수나 플롯 함수에 의해 중지되었습니다. |
NoFeasiblePointFound | -2 | 최적화 문제의 경우 문제가 실현 가능하지 않습니다. 범위 방정식 문제의 경우 구해진 해가 없습니다. |
다음 표에서는 fminunc
솔버에 대한 종료 플래그를 설명합니다.
fminunc 의 종료 플래그 | 상응하는 숫자 | 의미 |
---|---|---|
NoDecreaseAlongSearchDirection | 5 | 목적 함수의 예측된 감소량이 |
FunctionChangeBelowTolerance | 3 | 목적 함수 값의 변화량이 |
StepSizeBelowTolerance |
|
|
OptimalSolution | 1 | 기울기 크기가 |
SolverLimitExceeded | 0 | 반복 횟수가 |
OutputFcnStop | -1 | 출력 함수나 플롯 함수에 의해 중지되었습니다. |
Unbounded | -3 | 현재 반복에서 목적 함수가 |
다음 표에서는 fmincon
솔버에 대한 종료 플래그를 설명합니다.
fmincon 의 종료 플래그 | 상응하는 숫자 | 의미 |
---|---|---|
NoDecreaseAlongSearchDirection | 5 | 탐색 방향에서 방향 도함수의 크기가 2* |
SearchDirectionTooSmall | 4 | 탐색 방향의 크기가 2* |
FunctionChangeBelowTolerance | 3 | 목적 함수 값의 변화량이 |
StepSizeBelowTolerance |
|
|
OptimalSolution | 1 | 1차 최적성 측정값이 |
SolverLimitExceeded | 0 | 반복 횟수가 |
OutputFcnStop | -1 | 출력 함수나 플롯 함수에 의해 중지되었습니다. |
NoFeasiblePointFound | -2 | 실현가능점을 찾지 못했습니다. |
Unbounded | -3 | 현재 반복에서 목적 함수가 |
다음 표에서는 fsolve
솔버에 대한 종료 플래그를 설명합니다.
fsolve 의 종료 플래그 | 상응하는 숫자 | 의미 |
---|---|---|
SearchDirectionTooSmall | 4 | 탐색 방향의 크기가 |
FunctionChangeBelowTolerance | 3 | 목적 함수 값의 변화량이 |
StepSizeBelowTolerance |
|
|
OptimalSolution | 1 | 1차 최적성 측정값이 |
SolverLimitExceeded | 0 | 반복 횟수가 |
OutputFcnStop | -1 | 출력 함수나 플롯 함수에 의해 중지되었습니다. |
NoFeasiblePointFound | -2 | 근이 아닌 점으로 수렴되었습니다. |
TrustRegionRadiusTooSmall | -3 | 방정식을 풀지 못했습니다. 신뢰 영역 반지름이 너무 작아졌습니다( |
다음 표에서는 fzero
솔버에 대한 종료 플래그를 설명합니다.
fzero 의 종료 플래그 | 상응하는 숫자 | 의미 |
---|---|---|
OptimalSolution | 1 | 방정식을 풀었습니다. |
OutputFcnStop | -1 | 출력 함수나 플롯 함수에 의해 중지되었습니다. |
FoundNaNInfOrComplex | -4 | 부호 변경이 포함된 구간을 탐색하는 중 |
SingularPoint | -5 | 특이점으로 수렴되었을 수 있습니다. |
CannotDetectSignChange | -6 | 함수 값에 대해 반대 부호를 갖는 두 점을 찾지 못했습니다. |
다음 표에서는 patternsearch
솔버에 대한 종료 플래그를 설명합니다.
patternsearch 의 종료 플래그 | 상응하는 숫자 | 의미 |
---|---|---|
SearchDirectionTooSmall | 4 | 스텝의 크기가 기계 정밀도보다 작고 제약 조건 위반 값이 |
FunctionChangeBelowTolerance | 3 |
|
StepSizeBelowTolerance |
|
|
SolverConvergedSuccessfully | 1 | 비선형 제약 조건 없음 — 메시 크기가 지정된 허용오차보다 작고 제약 조건 위반 값이 |
비선형 제약 조건 있음 — 상보성 측정값의 크기(이 표 다음에 정의됨)가 | ||
SolverLimitExceeded | 0 | 함수 실행 또는 반복이 최대 횟수에 도달했습니다. |
OutputFcnStop | -1 | 출력 함수나 플롯 함수에 의해 중지되었습니다. |
NoFeasiblePointFound | -2 | 실현가능점을 찾지 못했습니다. |
비선형 제약 조건 솔버에서 상보성 측정값은 요소가 ciλi인 벡터의 노름입니다. 여기서 ci는 비선형 부등식 제약 조건 위반 값이며 λi는 이에 대응하는 라그랑주 승수입니다.
다음 표에서는 ga
솔버에 대한 종료 플래그를 설명합니다.
ga 의 종료 플래그 | 상응하는 숫자 | 의미 |
---|---|---|
MinimumFitnessLimitReached | 5 | 최소 적합도 제한 |
SearchDirectionTooSmall | 4 | 스텝의 크기가 기계 정밀도보다 작고 제약 조건 위반 값이 |
FunctionChangeBelowTolerance | 3 | 적합도 함수의 값이 |
SolverConvergedSuccessfully | 1 | 비선형 제약 조건 없음 — |
비선형 제약 조건 있음 — 상보성 측정값의 크기(상보성 측정값 (Global Optimization Toolbox) 참조)는 | ||
SolverLimitExceeded | 0 | 최대 생성 횟수인 |
OutputFcnStop | -1 | 출력 함수나 플롯 함수에 의해 중지되었습니다. |
NoFeasiblePointFound | -2 | 실현가능점을 찾지 못했습니다. |
StallTimeLimitExceeded | -4 | 정체 시간 제한인 |
TimeLimitExceeded | -5 | 시간 제한인 |
다음 표에서는 particleswarm
솔버에 대한 종료 플래그를 설명합니다.
particleswarm 의 종료 플래그 | 상응하는 숫자 | 의미 |
---|---|---|
SolverConvergedSuccessfully | 1 | 마지막 |
SolverLimitExceeded | 0 | 반복 횟수가 |
OutputFcnStop | -1 | 출력 함수나 플롯 함수에 의해 반복이 중지되었습니다. |
NoFeasiblePointFound | -2 | 범위에 모순이 있습니다. 일부 |
Unbounded | -3 | 최상의 목적 함수 값이 |
StallTimeLimitExceeded | -4 | 최상의 목적 함수 값이 |
TimeLimitExceeded | -5 | 실행 시간이 |
다음 표에서는 simulannealbnd
솔버에 대한 종료 플래그를 설명합니다.
simulannealbnd 의 종료 플래그 | 상응하는 숫자 | 의미 |
---|---|---|
ObjectiveValueBelowLimit | 5 | 목적 함수 값이 |
SolverConvergedSuccessfully | 1 |
|
SolverLimitExceeded | 0 | 최대 생성 횟수인 |
OutputFcnStop | -1 | 출력 함수나 플롯 함수에 의해 최적화가 종료되었습니다. |
NoFeasiblePointFound | -2 | 실현가능점을 찾지 못했습니다. |
TimeLimitExceeded | -5 | 시간 제한을 초과했습니다. |
다음 표에서는 surrogateopt
솔버에 대한 종료 플래그를 설명합니다.
surrogateopt 의 종료 플래그 | 상응하는 숫자 | 의미 |
---|---|---|
BoundsEqual | 10 | 다음 중 하나로 인해 문제가 고유한 실현 가능한 해를 갖습니다.
|
FeasiblePointFound | 3 | 실현가능점을 찾았습니다. 새로 찾은 실현가능점이 너무 적어서 계속할 수 없으므로 솔버가 중지되었습니다. |
ObjectiveLimitAttained | 1 | 목적 함수 값이 |
SolverLimitExceeded | 0 | 함수 실행 횟수가 |
OutputFcnStop | -1 | 출력 함수나 플롯 함수에 의해 최적화가 종료되었습니다. |
NoFeasiblePointFound | -2 | 다음 중 하나로 인해 실현가능점을 찾지 못했습니다.
|
다음 표에서는 MultiStart
및 GlobalSearch
솔버에 대한 종료 플래그를 설명합니다.
MultiStart 또는 GlobalSearch 의 종료 플래그 | 상응하는 숫자 | 의미 |
---|---|---|
LocalMinimumFoundSomeConverged | 2 | 최소 하나의 국소 최솟값을 찾았습니다. 로컬 솔버의 일부 실행이 수렴되었습니다. |
LocalMinimumFoundAllConverged | 1 | 최소 하나의 국소 최솟값을 찾았습니다. 로컬 솔버의 모든 실행이 수렴되었습니다. |
SolverLimitExceeded | 0 | 국소 최솟값을 찾지 못했습니다. 로컬 솔버가 적어도 한 번 호출되었고, 로컬 솔버 호출이 적어도 한 번 반복을 모두 마쳤습니다. |
OutputFcnStop | –1 | 출력 함수나 플롯 함수에 의해 중지되었습니다. |
NoFeasibleLocalMinimumFound | –2 | 실현 가능한 국소 최솟값을 찾지 못했습니다. |
TimeLimitExceeded | –5 | MaxTime 제한을 초과했습니다. |
NoSolutionFound | –8 | 해를 찾지 못했습니다. 모든 실행의 로컬 솔버 종료 플래그가 –2 또는 그보다 작은 숫자였으며, 이 중 일부는 –2가 아닙니다. |
FailureInSuppliedFcn | –10 | 목적 함수 또는 비선형 제약 조건 함수에서 오류를 발견했습니다. |
다음 표에서는 paretosearch
솔버에 대한 종료 플래그를 설명합니다.
paretosearch 의 종료 플래그 | 상응하는 숫자 | 의미 |
---|---|---|
SolverConvergedSuccessfully | 1 | 다음 조건 중 하나가 충족되었습니다.
|
SolverLimitExceeded | 0 | 반복 횟수가 options.MaxIterations 를 초과하거나, 함수 실행 횟수가 options.MaxFunctionEvaluations 를 초과합니다. |
OutputFcnStop | –1 | 출력 함수나 플롯 함수에 의해 중지되었습니다. |
NoFeasiblePointFound | –2 | 솔버가 모든 제약 조건을 충족하는 점을 찾을 수 없습니다. |
TimeLimitExceeded | –5 | 최적화 시간이 options.MaxTime 을 초과합니다. |
다음 표에서는 gamultiobj
솔버에 대한 종료 플래그를 설명합니다.
paretosearch 의 종료 플래그 | 상응하는 숫자 | 의미 |
---|---|---|
SolverConvergedSuccessfully | 1 | options.MaxStallGenerations 번의 생성 동안 산포 값의 상대적 변화의 기하 평균이 options.FunctionTolerance 보다 작고, 최종 산포 값이 지난 options.MaxStallGenerations 번의 생성 동안의 평균 산포 값보다 작습니다. |
SolverLimitExceeded | 0 | 생성 횟수가 options.MaxGenerations 를 초과합니다. |
OutputFcnStop | –1 | 출력 함수나 플롯 함수에 의해 중지되었습니다. |
NoFeasiblePointFound | –2 | 솔버가 모든 제약 조건을 충족하는 점을 찾을 수 없습니다. |
TimeLimitExceeded | –5 | 최적화 시간이 options.MaxTime 을 초과합니다. |
output
— 최적화 과정에 대한 정보
구조체
최적화 과정에 대한 정보로, 구조체로 반환됩니다. 출력 구조체에는 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 항목을 참조하십시오.
lambda
— 해에서의 라그랑주 승수
구조체
해에서의 라그랑주 승수로, 구조체로 반환됩니다.
참고
solve
는 방정식 풀이 문제에 대해 lambda
를 반환하지 않습니다.
intlinprog
솔버와 fminunc
솔버의 경우 lambda
는 비어 있습니다([]
). 다른 솔버의 경우 lambda
는 다음 필드를 가집니다.
Variables
– 각 문제 변수에 대한 필드를 포함합니다. 각 문제 변수 이름은 다음 2개의 필드를 갖는 구조체입니다.Lower
– 변수LowerBound
속성과 연결된 라그랑주 승수로, 변수와 같은 크기의 배열로 반환됩니다. 0이 아닌 요소는 해가 하한에 있음을 의미합니다. 이러한 승수는 구조체lambda.Variables.
에 있습니다.variablename
.LowerUpper
– 변수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를 사용합니다.최소제곱 목적 함수의 경우
fmincon
과fminunc
는 기본적으로 목적 함수에 대해 순방향 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에 설명되어 있는 접근법을 사용해야 합니다.
확장 기능
자동 병렬 지원
Parallel Computing Toolbox™를 사용해 자동 병렬 계산을 실행하여 코드 실행 속도를 높일 수 있습니다.
솔버의 UseParallel
옵션이 true
인 경우 solve
는 비선형 솔버의 도함수를 병렬로 추정합니다. 예를 들면 다음을 입력합니다.
options = optimoptions('fminunc','UseParallel',true); [sol,fval] = solve(prob,x0,'Options',options)
Supported Operations for Optimization Variables and Expressions에 설명되어 있는 대로, 모든 목적 함수와 비선형 제약 조건 함수가 지원되는 연산으로만 구성된 경우 solve
는 병렬 도함수 추정을 사용하지 않습니다. 이 경우 solve
는 도함수를 구하기 위해 자동 미분을 사용합니다. 자동 미분 항목을 참조하십시오.
'ObjectiveDerivative'
인수와 'ConstraintDerivative'
인수를 'finite-differences'
로 설정하여 자동 미분을 재정의하고 유한 차분 추정값을 병렬로 사용할 수 있습니다.
병렬 계산(ga
(Global Optimization Toolbox), particleswarm
(Global Optimization Toolbox), patternsearch
(Global Optimization Toolbox), surrogateopt
(Global Optimization Toolbox))을 지원하는 Global Optimization Toolbox 솔버를 지정하면 solve
는 솔버의 UseParallel
옵션이 true
일 때 병렬로 계산합니다. 예를 들면 다음을 입력합니다.
options = optimoptions("patternsearch","UseParallel",true); [sol,fval] = solve(prob,x0,"Options",options,"Solver","patternsearch")
버전 내역
R2017b에 개발됨R2018b: solve(prob,solver)
, solve(prob,options)
및 solve(prob,solver,options)
구문이 제거됨
solve
용 옵션이나 기본 솔버를 선택하려면 이름-값 쌍을 사용하십시오. 예를 들면 다음을 입력합니다.
sol = solve(prob,'options',opts,'solver','quadprog');
이전 구문은 이름-값 쌍만큼 유연하거나 표준적이거나 확장 가능하지 않았습니다.
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)