이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.
fsolve
는 비선형 연립방정식을 풉니다. 하지만, 이 함수를 사용하는 경우 범위 제약 조건을 포함하여 어떠한 제약 조건도 포함시킬 수 없습니다. 그렇다면 제약 조건이 있을 때는 비선형 연립방정식을 어떻게 풀 수 있을까요?
간단히 말하면, 제약 조건을 충족하는 해가 존재한다고 보장할 수 없습니다. 즉, 제약 조건을 충족하지 않는 해를 포함해 어떠한 해도 존재하지 않을 수 있습니다. 그럼에도 불구하고 제약 조건을 충족하는 해를 찾는 데 도움이 될 수 있는 기법이 있습니다.
다음 방정식을 푸는 방법을 통해 이 기법을 살펴보겠습니다.
(1) |
여기서 x의 성분은 음수가 아니어야 합니다. 확실히, 이 방정식에는 네 개의 해가 있습니다.
x = (–1,–2)
x = (10,–2),
x = (–1,20),
x = (10,20).
그중 제약 조건을 충족하는 해는 하나뿐입니다(즉, x = (10,20).).
방정식을 수치적으로 풀기 위해 먼저 F(x)를 계산하는 코드를 입력합니다.
function F = fbnd(x)
F(1) = (x(1)+1)*(10-x(1))*(1+x(2)^2)/(1+x(2)^2+x(2));
F(2) = (x(2)+2)*(20-x(2))*(1+x(1)^2)/(1+x(1)^2+x(1));
이 코드를 MATLAB® 경로에 fbnd.m
이라는 파일로 저장합니다.
일반적으로, N개 변수의 N개의 방정식으로 구성된 시스템에는 고립된(Isolated) 해가 있습니다. 이는 각 해의 근방에는 그 또한 해가 되는 인근 이웃이 없다는 것을 의미합니다. 따라서 제약 조건을 충족하는 해를 찾는 한 가지 방법은 여러 초기점 x0
을 생성하고 각 x0
에서 시작하여 fsolve
를 실행하는 것입니다.
이 예제에서는 수식 1의 해를 찾기 위해 평균이 0이고 표준편차가 100인 정규분포를 갖는 임의의 점 10개를 사용합니다.
rng default % for reproducibility N = 10; % try 10 random start points pts = 100*randn(N,2); % initial points are rows in pts soln = zeros(N,2); % allocate solution opts = optimoptions('fsolve','Display','off'); for k = 1:N soln(k,:) = fsolve(@fbnd,pts(k,:),opts); % find solutions end
soln
에서 해를 검토합니다. 그러면 제약 조건을 충족하는 여러 해를 찾을 수 있을 것입니다.
fsolve
알고리즘은 세 가지가 있습니다. 각각 다른 해를 생성할 수 있습니다.
이 예제에서는 x0 = [1,9]
를 사용하여 각 알고리즘이 반환하는 해를 검토합니다.
x0 = [1,9]; opts = optimoptions(@fsolve,'Display','off',... 'Algorithm','trust-region-dogleg'); x1 = fsolve(@fbnd,x0,opts)
x1 = -1.0000 -2.0000
opts.Algorithm = 'trust-region';
x2 = fsolve(@fbnd,x0,opts)
x2 = -1.0000 20.0000
opts.Algorithm = 'levenberg-marquardt';
x3 = fsolve(@fbnd,x0,opts)
x3 = 0.9523 8.9941
여기서는 세 가지 알고리즘 모두 동일한 초기점에 대해 각기 다른 해를 구합니다. 실제로, x3
은 해가 아니라 단순히 국소 정상점(stationary point)입니다.
lsqnonlin
은 벡터 함수 F(x)의 성분에 대한 제곱 합을 최소화하려고 합니다. 따라서, 방정식 F(x) = 0을 풀려고 시도합니다. 또한, lsqnonlin
은 범위 제약 조건을 받습니다.
lsqnonlin
의 예제 문제를 정식화한 후 풀어봅니다.
lb = [0,0];
rng default
x0 = 100*randn(2,1);
[x,res] = lsqnonlin(@fbnd,x0,lb)
x = 10.0000 20.0000 res = 2.4783e-25
Global Optimization Toolbox의 MultiStart
솔버와 함께 lsqnonlin
을 사용하면 많은 초기점에서 자동으로 탐색을 수행할 수 있습니다. MultiStart Using lsqcurvefit or lsqnonlin (Global Optimization Toolbox) 항목을 참조하십시오.
다음과 같이 문제를 다시 정식화하고 fmincon
을 사용할 수 있습니다.
각 x
에 대해 0
으로 평가되는 @(x)0
과 같은 상수 목적 함수를 제공합니다.
fsolve
목적 함수를 fmincon
에서 비선형 등식 제약 조건으로 설정합니다.
일반적인 fmincon
구문에 그 밖의 다른 제약 조건을 제공합니다.
이 예제에서는 비선형 부등식 제약 조건에 대한 함수 파일을 작성합니다.
function [c,ceq] = fminconstr(x) c = []; % no nonlinear inequality ceq = fbnd(x); % the fsolve objective is fmincon constraints
이 코드를 MATLAB 경로에 fminconstr.m
이라는 파일로 저장합니다.
제약 조건이 있는 문제를 풉니다.
lb = [0,0]; % lower bound constraint rng default % reproducible initial point x0 = 100*randn(2,1); opts = optimoptions(@fmincon,'Algorithm','interior-point','Display','off'); x = fmincon(@(x)0,x0,[],[],[],[],lb,[],@fminconstr,opts)
x = 10.0000 20.0000