솔버가 성공한 경우
솔버가 성공하더라도 잘못된 사항이 있을 수 있나요?
솔버가 최소화에 성공했다고 보고할 수 있지만, 보고된 해가 정확하지 않을 수 있습니다. 비교적 자명한 예제로서, 다음과 같이 점 1/3
에서 시작하여 –2와 2 사이의 x에 대해 함수 f(x) = x3을 최소화한다고 가정하겠습니다.
options = optimoptions('fmincon','Algorithm','active-set'); ffun = @(x)x^3; xfinal = fmincon(ffun,1/3,[],[],[],[],-2,2,[],options) Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the default valueof the function tolerance, and constraints were satisfied to within the default value of the constraint tolerance. No active inequalities. xfinal = -1.5056e-008
참 최솟값은 x = -2
에서 발생합니다. fmincon
이 위와 같이 보고하는 이유는 함수 f(x)가 x = 0 근처에서 상당히 평탄하기 때문입니다.
흔히 볼 수 있는 또 다른 문제는 솔버가 국소 최솟값을 구했지만 필요한 것은 전역 최솟값인 경우입니다. 자세한 내용은 국소 최적해와 전역 최적해 항목을 참조하십시오.
교훈: 솔버가 국소 최솟값을 “찾았다”거나 방정식을 “풀었다”고 보고하더라도 결과를 확인하십시오.
이 섹션에서는 결과를 확인하는 기법에 대해 설명합니다.
1. 초기점 변경하기
초기점은 해에 커다란 영향을 미칠 수 있습니다. 다양한 초기점으로부터 동일하거나 더 부정확한 해를 얻는다면 자신이 구한 해를 더 확신할 수 있게 됩니다.
예를 들어, 다음과 같이 점 1/4에서 시작하여 f(x) = x3 + x4을 최소화합니다.
ffun = @(x)x^3 + x^4; options = optimoptions('fminunc','Algorithm','quasi-newton'); [xfinal fval] = fminunc(ffun,1/4,options) Local minimum found. Optimization completed because the size of the gradient is less than the default value of the function tolerance. x = -1.6764e-008 fval = -4.7111e-024
초기점을 조금 변경하면 솔버가 더 나은 해를 구합니다.
[xfinal fval] = fminunc(ffun,1/4+.001,options) Local minimum found. Optimization completed because the size of the gradient is less than the default value of the function tolerance. xfinal = -0.7500 fval = -0.1055
x = -0.75
는 전역해이므로, 다른 점에서 시작해도 해가 개선되지 못합니다.
자세한 내용은 국소 최적해와 전역 최적해 항목을 참조하십시오.
2. 주변에 있는 점 확인하기
보고된 해보다 더 나은 값이 있는지 확인하기 위해 주변에 있는 다양한 점에서 목적 함수와 제약 조건을 실행합니다.
예를 들어 다음과 같이 솔버가 성공하더라도 잘못된 사항이 있을 수 있나요? 항목의 목적 함수 ffun
과 최종점 xfinal = -1.5056e-008
을 사용하여 어떤 Δ
에 대해 ffun(xfinal±Δ)
를 계산합니다.
delta = .1; [ffun(xfinal),ffun(xfinal+delta),ffun(xfinal-delta)] ans = -0.0000 0.0011 -0.0009
목적 함수의 값이 ffun(xfinal-Δ)
에서 더 낮습니다. 따라서 솔버가 부정확한 해를 보고한 것입니다.
비교적 자명하지 않은 예제:
options = optimoptions(@fmincon,'Algorithm','active-set'); lb = [0,-1]; ub = [1,1]; ffun = @(x)(x(1)-(x(1)-x(2))^2); [x fval exitflag] = fmincon(ffun,[1/2 1/3],[],[],[],[],... lb,ub,[],options) Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the default valueof the function tolerance, and constraints were satisfied to within the default value of the constraint tolerance. Active inequalities (to within options.ConstraintTolerance = 1e-006): lower upper ineqlin ineqnonlin 1 x = 1.0e-007 * 0 0.1614 fval = -2.6059e-016 exitflag = 1
주변에 있는 실현가능점에서 ffun
을 실행하면 해 x
가 참 최솟값이 아님을 알 수 있습니다.
[ffun([0,.001]),ffun([0,-.001]),... ffun([.001,-.001]),ffun([.001,.001])] ans = 1.0e-003 * -0.0010 -0.0010 0.9960 1.0000
나열된 처음 두 개의 값은 계산된 최솟값 fval
보다 작습니다.
Global Optimization Toolbox 라이선스가 있으면 patternsearch
(Global Optimization Toolbox) 함수를 사용하여 근처에 있는 점을 확인할 수 있습니다.
3. 목적 함수와 제약 조건 함수 확인하기
목적 함수와 제약 조건 함수를 이중으로 확인하여, 풀려는 문제에 이들 함수가 대응되는지 확인합니다. 제안 사항은 다음과 같습니다.
몇몇 점에서 목적 함수의 값을 확인합니다.
각 부등식 제약 조건의 부호가 올바른지 확인합니다.
최대화를 수행한 경우 보고된 해에 음을 취해야 합니다. (이 제안은 사용자가 목적 함수에 음을 취해 함수를 최대화했다고 가정합니다.) 예를 들어 f(x) = x – x2을 최대화하려면 다음과 같이 g(x) = –x + x2을 최소화합니다.
options = optimoptions('fminunc','Algorithm','quasi-newton'); [x fval] = fminunc(@(x)-x+x^2,0,options) Local minimum found. Optimization completed because the size of the gradient is less than the default value of the function tolerance. x = 0.5000 fval = -0.2500
f의 최댓값은
fval
의 값에 음을 취한 0.25입니다.실현불가능점으로 인해 함수에 오류가 발생하지 않는지 확인합니다. Iterations Can Violate Constraints 항목을 참조하십시오.