Main Content

lsqcurvefit

최소제곱을 사용하여 비선형 곡선 피팅(데이터 피팅) 문제 풀기

설명

비선형 최소제곱 솔버

다음 문제를 푸는 계수 x를 구합니다.

minxF(x,xdata)ydata22=minxi(F(x,xdatai)ydatai)2,

입력 데이터 xdata와 관측된 출력값 ydata가 주어지며, 여기서 xdata 및 ydata는 행렬 또는 벡터이고, F (x, xdata)는 ydata와 크기가 같은 행렬 값 또는 벡터 값을 갖는 함수입니다.

선택적으로 x의 성분이 다음 제약 조건에 적용됩니다.

lbxxubAxbAeqx=beqc(x)0ceq(x)=0.

인수 x, lb, ub는 벡터 또는 행렬일 수 있습니다. 행렬 인수 항목을 참조하십시오.

lsqcurvefit 함수는 lsqnonlin과 동일한 알고리즘을 사용합니다. lsqcurvefit은 데이터 피팅 문제를 위한 편리한 인터페이스를 제공합니다.

제곱합을 계산하는 대신 lsqcurvefit에서는 사용자 정의 함수가 다음과 같이 벡터 값을 갖는 함수를 계산해야 합니다.

F(x,xdata)=[F(x,xdata)(1)F(x,xdata)(2)F(x,xdata)(k)].

예제

x = lsqcurvefit(fun,x0,xdata,ydata)x0에서 시작하여 비선형 함수 fun(x,xdata)를 (최소제곱의 측면에서) 데이터 ydata에 가장 잘 피팅하는 계수 x를 구합니다. ydatafun이 반환하는 벡터(또는 행렬) F와 크기가 같아야 합니다.

참고

추가 파라미터 전달하기에는 필요한 경우 추가 파라미터를 벡터 함수 fun(x)에 전달하는 방법이 설명되어 있습니다.

예제

x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub)는 해가 항상 범위 lb x ub 내에 있도록 설계 변수 x에 대한 하한 및 상한 집합을 정의합니다. lb(i) = ub(i)를 지정하여 해 성분 x(i)를 고정할 수 있습니다.

참고

문제에 대해 지정된 입력 범위에 모순이 있는 경우 출력값 xx0이고 출력값 resnormresidual[]입니다.

범위 lb ≤ x ≤ ub를 위반하는 x0의 성분은 그 범위로 정의된 상자의 내부로 재설정됩니다. 범위를 준수하는 성분은 변경되지 않습니다.

예제

x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,A,b,Aeq,beq)는 선형 제약 조건을 충족하도록 해를 제한합니다.

A x ≤ b

Aeq x = beq.

예제

x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,A,b,Aeq,beq,nonlcon)nonlcon(x) 함수의 비선형 제약 조건을 충족하도록 해를 제한합니다. nonlcon은 두 개의 출력값 cceq를 반환합니다. 솔버는 제약 조건을 충족하려고 시도합니다.

c ≤ 0

ceq = 0.

예제

x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options) 또는 x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,A,b,Aeq,beq,nonlcon,options)options에 지정된 최적화 옵션을 사용하여 최소화합니다. 이 옵션을 설정하려면 optimoptions를 사용하십시오. 인수가 존재하지 않는 경우 lbub와 기타 입력 인수에 대해 빈 행렬을 전달하십시오.

x = lsqcurvefit(problem)problem에 설명되어 있는 구조체인 problem의 최솟값을 구합니다.

[x,resnorm] = lsqcurvefit(___)는 임의의 입력 인수에 대해 x에서 계산된 잔차에 대한 2-노름의 제곱 값(sum((fun(x,xdata)-ydata).^2))을 반환합니다.

예제

[x,resnorm,residual,exitflag,output] = lsqcurvefit(___)는 추가로 해 x에서의 잔차 fun(x,xdata)-ydata의 값을 반환하고, 종료 상황을 설명하는 값 exitflag와 최적화 과정에 대한 정보가 포함된 구조체 output을 반환합니다.

[x,resnorm,residual,exitflag,output,lambda,jacobian] = lsqcurvefit(___)는 추가로 해 x에서의 라그랑주 승수가 필드에 포함된 구조체 lambda를 반환하고, 해 x에서의 fun의 야코비 행렬을 반환합니다.

예제

모두 축소

관측 시간 데이터 xdata와 관측된 응답 변수 데이터 ydata가 있고 파라미터 x(1)x(2)를 찾아 다음 형식의 모델을 피팅하기를 원한다고 가정하겠습니다.

ydata=x(1)exp(x(2)xdata).

관측 시간과 응답 변수를 입력합니다.

xdata = ...
 [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3];
ydata = ...
 [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];

단순한 지수 감쇠 모델을 만듭니다.

fun = @(x,xdata)x(1)*exp(x(2)*xdata);

시작점 x0 = [100,-1]을 사용하여 모델을 피팅합니다.

x0 = [100,-1];
x = lsqcurvefit(fun,x0,xdata,ydata)
Local minimum possible.

lsqcurvefit stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.
x = 1×2

  498.8309   -0.1013

데이터와 피팅된 곡선을 플로팅합니다.

times = linspace(xdata(1),xdata(end));
plot(xdata,ydata,'ko',times,fun(x,times),'b-')
legend('Data','Fitted exponential')
title('Data and Fitted Curve')

Figure contains an axes object. The axes object with title Data and Fitted Curve contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Data, Fitted exponential.

피팅 파라미터가 제한된 데이터에 대한 최적의 지수 피팅을 찾습니다.

잡음이 추가된 지수 감쇠 모델에서 데이터를 생성합니다. 모델은 다음과 같습니다.

y=exp(-1.3t)+ε,

t의 범위는 0부터 3까지이며 ε은 평균이 0이고 표준편차가 0.05인 정규분포된 잡음입니다.

rng default % for reproducibility
xdata = linspace(0,3);
ydata = exp(-1.3*xdata) + 0.05*randn(size(xdata));

문제: 데이터(xdata, ydata)가 주어진 경우 파라미터의 범위가 다음과 같이 지정된 상태에서 데이터를 최적으로 피팅하는 지수 감쇠 모델 y=x(1)exp(x(2)xdata)를 찾습니다.

0x(1)3/4

-2x(2)-1.

lb = [0,-2];
ub = [3/4,-1];

모델을 만듭니다.

fun = @(x,xdata)x(1)*exp(x(2)*xdata);

초기 추측값을 만듭니다.

x0 = [1/2,-2];

유계 피팅 문제를 풉니다.

x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub)
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2

    0.7500   -1.0000

결과로 생성된 곡선이 얼마나 잘 데이터를 피팅하는지 검토합니다. 범위가 해를 실제 값에서 멀리 떨어지도록 하므로 피팅이 좋은 편은 아닙니다.

plot(xdata,ydata,'ko',xdata,fun(x,xdata),'b-')
legend('Data','Fitted exponential')
title('Data and Fitted Curve')

Figure contains an axes object. The axes object with title Data and Fitted Curve contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Data, Fitted exponential.

2에서 7까지의 시간 t에 파라미터 a, b, t0, c를 사용하여 비선형 모델 y=a+barctan(t-t0)+ct에 사용할 인위적인 데이터를 만듭니다. randn을 사용하여 데이터에 잡음을 추가합니다.

a = 2; % x(1)
b = 4; % x(2)
t0 = 5; % x(3)
c = 1/2; % x(4)
xdata = linspace(2,7);
rng default
ydata = a + b*atan(xdata - t0) + c*xdata + 1/10*randn(size(xdata));

데이터를 플로팅합니다.

plot(xdata,ydata,'ro')

Figure contains an axes object. The axes contains a line object which displays its values using only markers.

다음과 같은 제약 조건이 있는 데이터에 비선형 모델을 피팅합니다.

  • 모든 계수는 0과 7 사이입니다.

  • x1+x2x3+x4. A = [-1 -1 1 1]b = 0을 사용하여 A*x <= b 형식으로 이 제약 조건을 작성할 수 있습니다.

lb = zeros(4,1);
ub = 7*ones(4,1);
A = [-1 -1 1 1];
b = 0;

이 예제의 마지막 부분에 있는 myfun 함수는 이 모델에 대한 목적 함수를 생성합니다.

[1 2 3 1]에서 시작하여 피팅 문제를 풉니다.

startpt = [1 2 3 1];
Aeq = [];
beq = [];
[x,res] = lsqcurvefit(@myfun,startpt,xdata,ydata,lb,ub,A,b,Aeq,beq)
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.
x = 1×4

    2.3447    4.0972    4.9979    0.4303

res = 1.2682

반환된 해는 원래 점 [2 4 5 1/2]에서 멀지 않습니다 해에 해당하는 점에서 곡선에 대해 데이터를 플로팅합니다.

plot(xdata,ydata,'ro',xdata,myfun(x,xdata),'b-')

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

반환된 해는 데이터와 상당히 일치합니다. 제약 조건이 활성 상태일까요?

A*x(:)
ans = -1.0137

A*x < 0이기 때문에 제약 조건은 활성 상태가 아닙니다.

function F = myfun(x,xdata)
a = x(1);
b = x(2);
t0 = x(3);
c = x(4);
F = a + b*atan(xdata - t0) + c*xdata;
end

2에서 7까지의 시간 t에 파라미터 a, b, t0, c를 사용하여 비선형 모델 y=a+barctan(t-t0)+ct에 사용할 인위적인 데이터를 만듭니다. randn을 사용하여 데이터에 잡음을 추가합니다.

a = 2; % x(1)
b = 4; % x(2)
t0 = 5; % x(3)
c = 1/2; % x(4)
xdata = linspace(2,7);
rng default
ydata = a + b*atan(xdata - t0) + c*xdata + 1/10*randn(size(xdata));

데이터를 플로팅합니다.

plot(xdata,ydata,'ro')

Figure contains an axes object. The axes contains a line object which displays its values using only markers.

다음과 같은 제약 조건이 있는 데이터에 비선형 모델을 피팅합니다.

  • 모든 계수는 0과 7 사이입니다.

  • x12+x2242

lb = zeros(4,1);
ub = 7*ones(4,1);

문제에 선형 제약 조건이 없습니다.

A = [];
b = [];
Aeq = [];
beq = [];

이 예제의 마지막 부분에 있는 myfun 함수는 이 모델에 대한 목적 함수를 생성합니다. 이 예제의 마지막 부분에 있는 nlcon 함수는 비선형 제약 조건 함수를 생성합니다.

[1 2 3 1]에서 시작하여 피팅 문제를 풉니다.

startpt = [1 2 3 1];
[x,res] = lsqcurvefit(@myfun,startpt,xdata,ydata,lb,ub,A,b,Aeq,beq,@nlcon)
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.
x = 1×4

    1.3806    3.7542    5.0169    0.6337

res = 1.6018

원래 점 [2 4 5 1/2]에서 비선형 제약 조건을 위반했기 때문에 반환된 해 x는 이 원래 점에 없습니다. 해에 해당하는 점에서 곡선에 대해 데이터를 플로팅하고 제약 조건 함수를 계산합니다.

plot(xdata,ydata,'ro',xdata,myfun(x,xdata),'b-')

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

[c,ceq] = nlcon(x)
c = -3.1307e-06
ceq =

     []

해에서 c = 0이기 때문에 비선형 부등식 제약 조건은 활성 상태입니다.

해에 해당하는 점이 원래 점에 없지만 해 곡선은 데이터와 상당히 일치합니다.

function F = myfun(x,xdata)
a = x(1);
b = x(2);
t0 = x(3);
c = x(4);
F = a + b*atan(xdata - t0) + c*xdata;
end

function [c,ceq] = nlcon(x)
ceq = [];
c = x(1)^2 + x(2)^2 - 4^2;
end

디폴트 'trust-region-reflective' 알고리즘을 사용하는 경우와 'levenberg-marquardt' 알고리즘을 사용하는 경우의 피팅 결과를 비교합니다.

관측 시간 데이터 xdata와 관측된 응답 변수 데이터 ydata가 있고 파라미터 x(1)x(2)를 찾아 다음 형식의 모델을 피팅하기를 원한다고 가정하겠습니다.

ydata=x(1)exp(x(2)xdata).

관측 시간과 응답 변수를 입력합니다.

xdata = ...
 [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3];
ydata = ...
 [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];

단순한 지수 감쇠 모델을 만듭니다.

fun = @(x,xdata)x(1)*exp(x(2)*xdata);

시작점 x0 = [100,-1]을 사용하여 모델을 피팅합니다.

x0 = [100,-1];
x = lsqcurvefit(fun,x0,xdata,ydata)
Local minimum possible.

lsqcurvefit stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.
x = 1×2

  498.8309   -0.1013

해를 'levenberg-marquardt' 피팅의 해와 비교합니다.

options = optimoptions('lsqcurvefit','Algorithm','levenberg-marquardt');
lb = [];
ub = [];
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)
Local minimum possible.
lsqcurvefit stopped because the relative size of the current step is less than
the value of the step size tolerance.
x = 1×2

  498.8309   -0.1013

두 알고리즘 모두 동일한 해로 수렴되었습니다. 데이터와 피팅된 지수 모델을 플로팅합니다.

times = linspace(xdata(1),xdata(end));
plot(xdata,ydata,'ko',times,fun(x,times),'b-')
legend('Data','Fitted exponential')
title('Data and Fitted Curve')

Figure contains an axes object. The axes object with title Data and Fitted Curve contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Data, Fitted exponential.

디폴트 'trust-region-reflective' 알고리즘을 사용하는 경우와 'levenberg-marquardt' 알고리즘을 사용하는 경우의 피팅 결과를 비교합니다. 풀이 과정을 검토하여 이 경우 무엇이 더 효율적인지 확인합니다.

관측 시간 데이터 xdata와 관측된 응답 변수 데이터 ydata가 있고 파라미터 x(1)x(2)를 찾아 다음 형식의 모델을 피팅하기를 원한다고 가정하겠습니다.

ydata=x(1)exp(x(2)xdata).

관측 시간과 응답 변수를 입력합니다.

xdata = ...
 [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3];
ydata = ...
 [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];

단순한 지수 감쇠 모델을 만듭니다.

fun = @(x,xdata)x(1)*exp(x(2)*xdata);

시작점 x0 = [100,-1]을 사용하여 모델을 피팅합니다.

x0 = [100,-1];
[x,resnorm,residual,exitflag,output] = lsqcurvefit(fun,x0,xdata,ydata);
Local minimum possible.

lsqcurvefit stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.

해를 'levenberg-marquardt' 피팅의 해와 비교합니다.

options = optimoptions('lsqcurvefit','Algorithm','levenberg-marquardt');
lb = [];
ub = [];
[x2,resnorm2,residual2,exitflag2,output2] = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options);
Local minimum possible.
lsqcurvefit stopped because the relative size of the current step is less than
the value of the step size tolerance.

해가 동일합니까?

norm(x-x2)
ans = 2.0642e-06

예, 해가 동일합니다.

어떤 알고리즘이 함수를 더 적게 실행하여 해에 도달했습니까?

fprintf(['The ''trust-region-reflective'' algorithm took %d function evaluations,\n',...
   'and the ''levenberg-marquardt'' algorithm took %d function evaluations.\n'],...
   output.funcCount,output2.funcCount)
The 'trust-region-reflective' algorithm took 87 function evaluations,
and the 'levenberg-marquardt' algorithm took 72 function evaluations.

데이터와 피팅된 지수 모델을 플로팅합니다.

times = linspace(xdata(1),xdata(end));
plot(xdata,ydata,'ko',times,fun(x,times),'b-')
legend('Data','Fitted exponential')
title('Data and Fitted Curve')

Figure contains an axes object. The axes object with title Data and Fitted Curve contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Data, Fitted exponential.

피팅이 좋아 보입니다. 잔차는 얼마나 큽니까?

fprintf(['The ''trust-region-reflective'' algorithm has residual norm %f,\n',...
   'and the ''levenberg-marquardt'' algorithm has residual norm %f.\n'],...
   resnorm,resnorm2)
The 'trust-region-reflective' algorithm has residual norm 9.504887,
and the 'levenberg-marquardt' algorithm has residual norm 9.504887.

입력 인수

모두 축소

피팅하려는 함수로, 함수 핸들 또는 함수의 이름으로 지정됩니다. 'interior-point' 알고리즘의 경우, fun은 함수 핸들이어야 합니다. fun은 두 개의 입력값(벡터 또는 행렬 형식의 x와 벡터 또는 행렬 형식의 xdata)를 받는 함수입니다. fun은 벡터 또는 행렬 형식의 F(xxdata에서 실행된 목적 함수)를 반환합니다.

참고

fun은 제곱합 sum((fun(x,xdata)-ydata).^2)이 아니라 fun(x,xdata)를 반환해야 합니다. lsqcurvefitfun(x,xdata)-ydata 성분의 제곱합을 암묵적으로 계산합니다. 예제 항목을 참조하십시오.

함수 fun은 다음과 같이 함수 파일에 대한 함수 핸들로 지정할 수 있습니다.

x = lsqcurvefit(@myfun,x0,xdata,ydata)

여기서 myfun은 다음과 같은 MATLAB® 함수입니다.

function F = myfun(x,xdata)
F = ...     % Compute function values at x, xdata

fun을 익명 함수에 대한 함수 핸들로 지정할 수도 있습니다.

f = @(x,xdata)x(1)*xdata.^2+x(2)*sin(xdata);
x = lsqcurvefit(f,x0,xdata,ydata);

lsqcurvefit 함수는 xx0 인수 형태로 목적 함수에 전달합니다. 예를 들어, x0이 5×3 배열이면 lsqcurvefit 함수는 x를 5×3 배열로 fun에 전달합니다.

야코비 행렬도 계산할 수 있고 'SpecifyObjectiveGradient' 옵션이 다음 설정처럼 true인 경우

options = optimoptions('lsqcurvefit','SpecifyObjectiveGradient',true)

함수 funx에서 계산된 야코비 행렬 값 J(행렬)로 두 번째 출력 인수를 반환해야 합니다. 함수는 nargout의 값을 확인함으로써 fun이 하나의 출력 인수만 사용하여 호출되는 경우(이 경우 최적화 알고리즘에는 J가 아니라 F의 값만 필요함) J 계산을 피할 수 있습니다.

function [F,J] = myfun(x,xdata)
F = ...          % objective function values at x
if nargout > 1   % two output arguments
   J = ...   % Jacobian of the function evaluated at x
end

funm개 성분으로 구성된 벡터(행렬)를 반환하고 xn개 요소를 가지는 경우(여기서 nx0의 요소 개수임), 야코비 행렬 Jm×n 행렬입니다. 여기서 J(i,j)x(j)에 대한 F(i)의 편도함수입니다. 야코비 행렬 JF의 기울기의 전치입니다. 자세한 내용은 벡터 및 행렬 목적 함수 작성하기 항목을 참조하십시오.

예: @(x,xdata)x(1)*exp(-x(2)*xdata)

데이터형: char | function_handle | string

초기점으로, 실수형 벡터나 실수형 배열로 지정됩니다. 솔버는 x0의 요소 개수와 x0의 크기를 사용하여 fun이 받는 변수의 개수와 크기를 확인합니다.

예: x0 = [1,2,3,4]

데이터형: double

모델의 입력 데이터로, 실수형 벡터나 실수형 배열로 지정됩니다. 모델은 다음과 같습니다.

ydata = fun(x,xdata),

여기서 xdataydata는 고정된 배열이고, xlsqcurvefit이 최소 제곱합을 찾기 위해 변경하는 파라미터로 구성된 배열입니다.

예: xdata = [1,2,3,4]

데이터형: double

모델의 응답 변수 데이터로, 실수형 벡터나 실수형 배열로 지정됩니다. 모델은 다음과 같습니다.

ydata = fun(x,xdata),

여기서 xdataydata는 고정된 배열이고, xlsqcurvefit이 최소 제곱합을 찾기 위해 변경하는 파라미터로 구성된 배열입니다.

ydata 배열은 배열 fun(x0,xdata)와 크기와 형태가 같아야 합니다.

예: ydata = [1,2,3,4]

데이터형: double

하한으로, 실수형 벡터나 실수형 배열로 지정됩니다. x0의 요소 개수가 lb의 요소 개수와 같은 경우 lb는 다음을 지정합니다.

모든 i에 대해 x(i) >= lb(i)

numel(lb) < numel(x0)이면 lb는 다음을 지정합니다.

1 <= i <= numel(lb)에 대해

x(i) >= lb(i)

lb의 요소 개수가 x0의 요소 개수보다 적으면 솔버가 경고를 발생시킵니다.

예: 모든 x 성분이 양수가 되도록 지정하려면 lb = zeros(size(x0))을 사용하십시오.

데이터형: double

상한으로, 실수형 벡터나 실수형 배열로 지정됩니다. x0의 요소 개수가 ub의 요소 개수와 같은 경우 ub는 다음을 지정합니다.

모든 i에 대해 x(i) <= ub(i)

numel(ub) < numel(x0)이면 ub는 다음을 지정합니다.

1 <= i <= numel(ub)에 대해

x(i) <= ub(i)

ub의 요소 개수가 x0의 요소 개수보다 적으면 솔버가 경고를 발생시킵니다.

예: 모든 x 성분이 1보다 작도록 지정하려면 ub = ones(size(x0))을 사용하십시오.

데이터형: double

선형 부등식 제약 조건으로, 실수 행렬로 지정됩니다. AM×N 행렬입니다. 여기서 M은 부등식 개수이고 N은 변수 개수(x0의 요소 개수)입니다. 대규모 문제의 경우, A를 희소 행렬로 전달하십시오.

A는 다음과 같이 M개의 선형 부등식을 인코딩합니다.

A*x <= b,

여기서 xN개의 변수 x(:)으로 구성된 열 벡터이고, bM개의 요소를 갖는 열 벡터입니다.

예를 들어, 다음 부등식을 살펴보겠습니다.

x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30,

다음 제약 조건을 입력하여 부등식을 지정합니다.

A = [1,2;3,4;5,6];
b = [10;20;30];

예: x 성분의 합이 1 이하가 되도록 지정하려면 A = ones(1,N)b = 1을 사용하십시오.

데이터형: double

선형 부등식 제약 조건으로, 실수 벡터로 지정됩니다. bA 행렬과 관련된, 요소를 M개 가진 벡터입니다. b를 행 벡터로 전달하면 솔버는 내부적으로 b를 열 벡터 b(:)으로 변환합니다. 대규모 문제의 경우, b를 희소 벡터로 전달하십시오.

b는 다음과 같이 M개의 선형 부등식을 인코딩합니다.

A*x <= b,

여기서 xN개의 변수 x(:)으로 구성된 열 벡터이고, A는 크기가 M×N인 행렬입니다.

예를 들어, 다음 부등식을 살펴보겠습니다.

x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30.

다음 제약 조건을 입력하여 부등식을 지정합니다.

A = [1,2;3,4;5,6];
b = [10;20;30];

예: x 성분의 합이 1 이하가 되도록 지정하려면 A = ones(1,N)b = 1을 사용하십시오.

데이터형: double

선형 등식 제약 조건으로, 실수 행렬로 지정됩니다. AeqMe×N 행렬입니다. 여기서 Me는 부등식 개수이고 N은 변수 개수(x0의 요소 개수)입니다. 대규모 문제의 경우, Aeq를 희소 행렬로 전달하십시오.

Aeq는 다음과 같이 Me개의 선형 등식을 인코딩합니다.

Aeq*x = beq,

여기서 xN개의 변수 x(:)으로 구성된 열 벡터이고, beqMe개의 요소를 갖는 열 벡터입니다.

예를 들어, 다음 부등식을 살펴보겠습니다.

x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20,

다음 제약 조건을 입력하여 부등식을 지정합니다.

Aeq = [1,2,3;2,4,1];
beq = [10;20];

예: x 성분의 합이 1이 되도록 지정하려면 Aeq = ones(1,N)beq = 1을 사용하십시오.

데이터형: double

선형 등식 제약 조건으로, 실수 벡터로 지정됩니다. beqAeq 행렬과 관련된, 요소를 Me개 가진 벡터입니다. beq를 행 벡터로 전달하면 솔버는 내부적으로 beq를 열 벡터 beq(:)으로 변환합니다. 대규모 문제의 경우, beq를 희소 벡터로 전달하십시오.

beq는 다음과 같이 Me개의 선형 등식을 인코딩합니다.

Aeq*x = beq,

여기서 xN개의 변수 x(:)으로 구성된 열 벡터이고, Aeq는 크기가 Me×N인 행렬입니다.

예를 들어, 다음 등식을 살펴보겠습니다.

x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20.

다음 제약 조건을 입력하여 등식을 지정합니다.

Aeq = [1,2,3;2,4,1];
beq = [10;20];

예: x 성분의 합이 1이 되도록 지정하려면 Aeq = ones(1,N)beq = 1을 사용하십시오.

데이터형: double

비선형 제약 조건으로, 함수 핸들로 지정됩니다. nonlcon은 벡터 또는 배열 x를 받고 두 개의 배열 c(x)ceq(x)를 반환하는 함수입니다.

  • c(x)x의 비선형 부등식 제약 조건으로 구성된 배열입니다. lsqcurvefit는 다음을 충족하려고 시도합니다.

    모든 c 요소에 대해 c(x) <= 0.(1)
  • ceq(x)x의 비선형 등식 제약 조건으로 구성된 배열입니다. lsqcurvefit는 다음을 충족하려고 시도합니다.

    모든 ceq 요소에 대해 ceq(x) = 0.(2)

예를 들면 다음과 같습니다.

x = lsqcurvefit(@myfun,x0,xdata,ydata,lb,ub,A,b,Aeq,beq,@mycon,options)

여기서 mycon은 다음과 같은 MATLAB 함수입니다.

function [c,ceq] = mycon(x)
c = ...     % Compute nonlinear inequalities at x.
ceq = ...   % Compute nonlinear equalities at x.
제약 조건의 기울기도 계산할 수 있고 다음 설정처럼 SpecifyConstraintGradient 옵션이 true인 경우
options = optimoptions('lsqcurvefit','SpecifyConstraintGradient',true)
nonlcon은 세 번째 출력 인수와 네 번째 출력 인수로 c(x)의 기울기 GCceq(x)의 기울기 GCeq도 반환해야 합니다. GCGCeq는 희소 또는 조밀 형식일 수 있습니다. GC 또는 GCeq가 대규모이고 0이 아닌 요소가 상대적으로 적은 경우 이러한 요소를 희소 행렬로 나타내면 'interior-point' 알고리즘에서 실행 시간과 메모리를 절약할 수 있습니다. 자세한 내용은 비선형 제약 조건 항목을 참조하십시오.

데이터형: function_handle

최적화 옵션으로, optimoptions의 출력값 또는 optimset 등이 반환하는 구조체로 지정됩니다.

옵션에 따라 모든 알고리즘에 적용되는 옵션이 있고 특정 알고리즘에만 유효한 옵션이 있습니다. 자세한 내용은 최적화 옵션 참조 항목을 참조하십시오.

일부 옵션은 optimoptions 표시에 나타나지 않습니다. 이러한 옵션은 다음 표에서 기울임꼴로 표시되어 있습니다. 자세한 내용은 최적화 옵션 보기 항목을 참조하십시오.

모든 알고리즘

Algorithm

'trust-region-reflective'(디폴트 값), 'levenberg-marquardt', 'interior-point' 중에서 선택합니다.

Algorithm 옵션은 사용할 알고리즘에 대한 기본 설정을 지정합니다. 각 알고리즘을 사용하려면 특정 조건이 충족되어야 하기 때문에 이는 단지 기본적인 설정에 불과합니다. trust-region-reflective 알고리즘의 경우, fun으로 반환되는 F의 요소 개수는 x의 길이보다 크거나 같아야 합니다.

'interior-point' 알고리즘은 선형 제약 조건 또는 비선형 제약 조건이 있는 문제를 풀 수 있는 유일한 알고리즘입니다. 문제에 이러한 제약 조건을 포함시키고 알고리즘을 지정하지 않으면 솔버는 자동으로 'interior-point' 알고리즘으로 전환합니다. 'interior-point' 알고리즘은 fmincon 'interior-point' 알고리즘의 수정된 버전을 호출합니다.

알고리즘을 선택하는 방법에 대한 자세한 내용은 알고리즘 선택하기 항목을 참조하십시오.

CheckGradients

사용자 제공 도함수(목적 함수 또는 제약 조건의 기울기)를 유한 차분 도함수와 비교합니다. false(디폴트 값) 또는 true를 선택할 수 있습니다.

optimset의 경우, 이 이름은 DerivativeCheck이고 값은 'on' 또는 'off'입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

CheckGradients 옵션은 향후 릴리스에서 제거될 예정입니다. 도함수를 검사하려면 checkGradients 함수를 사용하십시오.

Diagnostics

최소화하거나 풀려는 함수에 대한 진단 정보를 표시합니다. 'off'(디폴트 값) 또는 'on'을 선택할 수 있습니다.

DiffMaxChange

유한 차분 기울기에 대한 변수의 최대 변화량입니다(양의 스칼라). 디폴트 값은 Inf입니다.

DiffMinChange

유한 차분 기울기에 대한 변수의 최소 변화량입니다(양의 스칼라). 디폴트 값은 0입니다.

Display

표시 수준입니다(반복 과정 표시 참조):

  • 'off' 또는 'none'은 출력값을 표시하지 않습니다.

  • 'iter'는 각 반복마다 출력값을 표시하고 디폴트 종료 메시지를 제공합니다.

  • 'iter-detailed'는 각 반복마다 출력값을 표시하고 기술적인 종료 메시지를 제공합니다.

  • 'final'(디폴트 값)은 최종 출력값만 표시하고 디폴트 종료 메시지를 제공합니다.

  • 'final-detailed'는 최종 출력값만 표시하고 기술적인 종료 메시지를 제공합니다.

FiniteDifferenceStepSize

유한 차분에 대한 스칼라 또는 벡터 스텝 크기 인자입니다. FiniteDifferenceStepSize를 벡터 v로 설정하는 경우 전향 유한 차분 delta는 다음과 같습니다.

delta = v.*sign′(x).*max(abs(x),TypicalX);

여기서 sign′(x) = sign(x)입니다(단, sign′(0) = 1임). 중심 유한 차분은 다음과 같습니다.

delta = v.*max(abs(x),TypicalX);

스칼라 FiniteDifferenceStepSize는 벡터로 확장됩니다. 디폴트 값은 전향 유한 차분의 경우 sqrt(eps)이고 중심 유한 차분의 경우 eps^(1/3)입니다.

optimset의 경우, 이 이름은 FinDiffRelStep입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

FiniteDifferenceType

기울기를 추정하는 데 사용되는 유한 차분으로, 'forward'(디폴트 값) 또는 'central'(중심화됨)입니다. 'central'은 함수 실행 횟수가 2배 더 많지만 더 정확합니다.

알고리즘은 두 유형의 유한 차분을 모두 추정하는 경우 범위를 준수하려고 노력합니다. 예를 들어, 범위 외부에 있는 점에서 실행되는 것을 방지하기 위해 전향 차분이 아니라 후향 차분을 사용할 수 있습니다.

optimset의 경우, 이 이름은 FinDiffType입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

FunctionTolerance

함수 값에 대한 종료 허용오차로, 양의 스칼라입니다. 디폴트 값은 1e-6입니다. 허용오차와 중지 기준 항목을 참조하십시오.

optimset의 경우, 이 이름은 TolFun입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

FunValCheck

함수 값이 유효한지 여부를 확인합니다. 'on'은 함수가 complex, Inf 또는 NaN 값을 반환하는 경우에 오류를 표시합니다. 디폴트 값인 'off'는 오류를 표시하지 않습니다.

MaxFunctionEvaluations

허용되는 최대 함수 실행 횟수로, 양의 정수입니다. 디폴트 값은 'trust-region-reflective' 알고리즘의 경우 100*numberOfVariables이고, 'levenberg-marquardt' 알고리즘의 경우 200*numberOfVariables이고, 'interior-point' 알고리즘의 경우 3000입니다. 허용오차와 중지 기준 항목과 반복 횟수와 함수 실행 횟수 항목을 참조하십시오.

optimset의 경우, 이 이름은 MaxFunEvals입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

MaxIterations

허용되는 최대 반복 횟수로, 양의 정수입니다. 디폴트 값은 'trust-region-reflective' 알고리즘과 'levenberg-marquardt' 알고리즘의 경우 400이고 'interior-point' 알고리즘의 경우 1000입니다. 허용오차와 중지 기준 항목과 반복 횟수와 함수 실행 횟수 항목을 참조하십시오.

optimset의 경우, 이 이름은 MaxIter입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

OptimalityTolerance

1차 최적성에 대한 종료 허용오차입니다(양의 스칼라). 디폴트 값은 1e-6입니다. 1차 최적성 측정값 항목을 참조하십시오.

내부적으로, 'levenberg-marquardt' 알고리즘은 최적성 허용오차(중지 기준) 1e-4FunctionTolerance를 곱한 값을 사용하고 OptimalityTolerance는 사용하지 않습니다.

optimset의 경우, 이 이름은 TolFun입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

OutputFcn

각 반복마다 최적화 함수가 호출하는 하나 이상의 사용자 정의 함수를 지정합니다. 함수 핸들 또는 함수 핸들 셀형 배열을 전달합니다. 디폴트 값은 없음([])입니다. Output Function and Plot Function Syntax 항목을 참조하십시오.

PlotFcn

알고리즘이 실행되는 동안 다양한 진행률 측정값을 플로팅합니다. 미리 정의된 플롯에서 선택하거나 사용자가 직접 작성할 수 있습니다. 이름, 함수 핸들 또는 이름이나 함수 핸들로 구성된 셀형 배열을 전달합니다. 사용자 지정 플롯 함수의 경우, 함수 핸들을 전달하십시오. 디폴트 값은 없음([])입니다.

  • 'optimplotx'는 현재 점을 플로팅합니다.

  • 'optimplotfunccount'는 함수 실행 횟수를 플로팅합니다.

  • 'optimplotfval'은 함수 값을 플로팅합니다.

  • 'optimplotresnorm'은 잔차에 대한 노름을 플로팅합니다.

  • 'optimplotstepsize'는 스텝 크기를 플로팅합니다.

  • 'optimplotfirstorderopt'는 1차 최적성 측정값을 플로팅합니다.

사용자 지정 플롯 함수는 출력 함수와 동일한 구문을 사용합니다. Optimization Toolbox의 출력 함수 항목과 Output Function and Plot Function Syntax 항목을 참조하십시오.

optimset의 경우, 이 이름은 PlotFcns입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

SpecifyObjectiveGradient

false(디폴트 값)인 경우, 솔버는 유한 차분을 사용하여 야코비 행렬의 근삿값을 계산합니다. true인 경우, 솔버는 목적 함수에 대해 사용자 정의 야코비 행렬(fun에서 정의됨)을 사용하거나 야코비 행렬 정보(JacobMult를 사용하는 경우)를 사용합니다.

optimset의 경우, 이 이름은 Jacobian이고 값은 'on' 또는 'off'입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

StepTolerance

x에 대한 종료 허용오차로, 양의 스칼라입니다. 디폴트 값은 'trust-region-reflective' 알고리즘과 'levenberg-marquardt' 알고리즘의 경우 1e-6이고 'interior-point' 알고리즘의 경우 1e-10입니다. 허용오차와 중지 기준 항목을 참조하십시오.

optimset의 경우, 이 이름은 TolX입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

TypicalX

일반적인 x 값입니다. TypicalX의 요소 개수는 시작점 x0의 요소 개수와 같습니다. 디폴트 값은 ones(numberofvariables,1)입니다. 솔버는 기울기 추정 시 유한 차분을 스케일링하는 데 TypicalX를 사용합니다.

UseParallel

true인 경우, 솔버는 기울기를 병렬로 추정합니다. 디폴트 값 false로 설정하면 비활성화됩니다. 병렬 연산 항목을 참조하십시오.

Trust-Region-Reflective 알고리즘
JacobianMultiplyFcn

야코비 행렬의 곱셈 함수로, 함수 핸들로 지정됩니다. 특정 구조를 가진 대규모 문제의 경우, 이 함수는 J를 실제로 구성하지 않고 야코비 행렬 곱 J*Y, J'*Y 또는 J'*(J*Y)를 계산합니다. lsqnonlin의 경우 함수의 형식은 다음과 같습니다.

W = jmfun(Jinfo,Y,flag)

여기서 JinfoJ*Y (또는 J'*YJ'*(J*Y))를 계산하는 데 도움이 되는 데이터를 포함합니다. lsqcurvefit의 경우 함수의 형식은 다음과 같습니다.

W = jmfun(Jinfo,Y,flag,xdata)

여기서 xdataxdata 인수에 전달된 데이터입니다.

데이터 Jinfo는 목적 함수 fun이 반환하는 두 번째 인수입니다.

[F,Jinfo] = fun(x)
% or [F,Jinfo] = fun(x,xdata)

lsqcurvefit 함수는 데이터 Jinfo, Y, flag, xdata(lsqcurvefit의 경우)를 전달하고, 함수 jmfun은 다음에 지정된 대로 결과를 계산합니다. Yflag의 값에 따라 크기가 달라지는 행렬입니다. m이 목적 함수 fun의 성분 개수를 지정하도록 하고 nx의 문제 변수 개수를 지정하도록 합니다. 야코비 행렬의 크기는 fun에 설명된 대로 m×n입니다. jmfun 함수는 다음 결과 중 하나를 반환합니다.

  • flag == 0이면 W = J'*(J*Y)이고 Y의 크기는 n×2입니다.

  • flag > 0이면 W = J*Y이고 Y의 크기는 n×1입니다.

  • flag < 0이면 W = J'*Y이고 Y의 크기는 m×1입니다.

어느 경우든 J가 명시적으로 구성되지는 않습니다. 솔버는 Jinfo를 사용하여 곱셈을 계산합니다. jmfun에 필요한 추가 파라미터의 값을 제공하는 방법에 대한 자세한 내용은 추가 파라미터 전달하기 항목을 참조하십시오.

참고

솔버가 Jinfofun에서 jmfun으로 전달하도록 하려면 'SpecifyObjectiveGradient'true로 설정되어야 합니다.

이와 유사한 예제를 보려면 Minimization with Dense Structured Hessian, Linear Equalities 항목과 Jacobian Multiply Function with Linear Least Squares 항목을 참조하십시오.

optimset의 경우, 이 이름은 JacobMult입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

JacobPattern

유한 차분을 위한 야코비 행렬의 희소성 패턴입니다. fun(i)x(j)에 종속되는 경우 JacobPattern(i,j) = 1을 설정합니다. 그렇지 않은 경우 JacobPattern(i,j) = 0을 설정합니다. 다시 말해, ∂fun(i)/∂x(j) ≠ 0이 성립하는 경우 JacobPattern(i,j) = 1을 설정합니다.

JacobPatternfun에서 야코비 행렬 J를 계산하는 것이 번거롭고 fun(i)x(j)에 종속된다는 사실은 (조사를 통해) 확인할 수 있는 경우에 사용합니다. JacobPattern을 제공하는 경우 솔버는 희소 유한 차분을 통해 J의 근삿값을 계산할 수 있습니다.

구조를 알 수 없는 경우 JacobPattern을 설정하지 마십시오. 이 경우 기본적으로 JacobPattern이 1로 구성된 조밀 행렬인 것처럼 동작합니다. 그러면 솔버가 각 반복마다 비희소 유한 차분 근삿값을 계산합니다. 이 과정은 대규모 문제의 경우 시간이 오래 걸릴 수 있으므로 희소성 구조를 확인하는 것이 일반적으로 더 좋습니다.

MaxPCGIter

최대 PCG(선조건 적용 켤레 기울기) 반복 횟수로, 양의 스칼라입니다. 디폴트 값은 max(1,numberOfVariables/2)입니다. 자세한 내용은 대규모 비선형 최소제곱 항목을 참조하십시오.

PrecondBandWidth

PCG에 대한 선조건자의 상부 대역폭으로, 음이 아닌 정수입니다. 디폴트 값 PrecondBandWidthInf이며, 이는 직접 분해(촐레스키)가 켤레 기울기(CG) 대신 사용된다는 것을 의미합니다. 직접 분해는 CG보다 계산량이 더 많지만 해에 다가가는 데 있어 더 나은 품질의 스텝을 생성합니다. 대각 선조건 지정에서는 PrecondBandWidth0으로 설정합니다(상부 대역폭: 0). 일부 문제의 경우, 중간 대역폭을 사용하면 PCG 반복 횟수가 줄어듭니다.

SubproblemAlgorithm

반복 스텝이 계산되는 방식을 결정합니다. 디폴트 값 'factorization''cg'보다 더 느리지만 더 정확한 스텝을 실행합니다. Trust-Region-Reflective 최소제곱 항목을 참조하십시오.

TolPCG

PCG 반복에 대한 종료 허용오차로, 양의 스칼라입니다. 디폴트 값은 0.1입니다.

Levenberg-Marquardt 알고리즘
InitDamping

Levenberg-Marquardt 파라미터의 초기값으로, 양의 스칼라입니다. 디폴트 값은 1e-2입니다. 자세한 내용은 Levenberg-Marquardt 방법 항목을 참조하십시오.

ScaleProblem

'jacobian'을 사용하면 잘못 스케일링된 문제의 수렴이 향상될 수도 있습니다. 디폴트 값은 'none'입니다.

Interior-Point 알고리즘
BarrierParamUpdate

fmincon이 장벽 파라미터를 업데이트하는 방법을 지정합니다(fmincon의 Interior Point 알고리즘 참조). 옵션은 다음과 같습니다.

  • 'monotone'(디폴트 값)

  • 'predictor-corrector'

이 옵션은 솔버의 속도와 수렴에 영향을 줄 수 있지만, 그 영향을 예측하기가 쉽지 않습니다.

ConstraintTolerance

제약 조건 위반에 대한 허용오차로, 양의 스칼라입니다. 디폴트 값은 1e-6입니다. 허용오차와 중지 기준 항목을 참조하십시오.

optimset의 경우, 이 이름은 TolCon입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

InitBarrierParam

초기 장벽 값으로, 양의 스칼라입니다. 경우에 따라 디폴트 값 0.1보다 높은 값을 사용하는 것이 도움이 될 수 있습니다. 특히, 목적 함수 또는 제약 조건의 규모가 큰 경우 그렇습니다.

SpecifyConstraintGradient

사용자가 정의하는 비선형 제약 조건 함수의 기울기입니다. 디폴트 값 false로 설정된 경우, lsqcurvefit는 유한 차분으로 비선형 제약 조건의 기울기를 추정합니다. true로 설정된 경우, lsqcurvefit에서 제약 조건 함수가 4개의 출력값을 가져야 합니다. 이에 대한 설명은 nonlcon에 나와 있습니다.

optimset의 경우, 이 이름은 GradConstr이고 값은 'on' 또는 'off'입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

SubproblemAlgorithm

반복 스텝이 계산되는 방식을 결정합니다. 디폴트 값 'factorization'은 일반적으로 'cg'(켤레 기울기)보다 빠릅니다. 하지만 조밀한 헤세 행렬이 포함된 대규모 문제에서는 'cg'가 더 빠를 수도 있습니다. fmincon의 Interior Point 알고리즘 항목을 참조하십시오.

optimset의 경우 값은 'cg''ldl-factorization'입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

예: options = optimoptions('lsqcurvefit','FiniteDifferenceType','central')

문제 구조체로, 다음 필드를 가진 구조체로 지정됩니다.

필드 이름항목

objective

목적 함수

x0

x의 초기점

xdata

목적 함수에 대한 입력 데이터

ydata

목적 함수와 일치해야 하는 출력 데이터

Aineq

선형 부등식 제약 조건에 대한 행렬

bineq

선형 부등식 제약 조건에 대한 벡터

Aeq

선형 등식 제약 조건에 대한 행렬

beq

선형 등식 제약 조건에 대한 벡터
lb하한으로 구성된 벡터
ub상한으로 구성된 벡터

nonlcon

비선형 제약 조건 함수

solver

'lsqcurvefit'

options

optimoptions로 생성되는 옵션

problem 구조체에 최소한 objective, x0, solver, xdata, ydata, options 필드를 반드시 제공해야 합니다.

데이터형: struct

출력 인수

모두 축소

해로, 실수형 벡터나 실수형 배열로 반환됩니다. x의 크기는 x0의 크기와 같습니다. 일반적으로 xexitflag가 양수인 경우 문제에 대한 국소해입니다. 해의 품질에 대한 자세한 내용은 솔버가 성공한 경우 항목을 참조하십시오.

잔차에 대한 노름의 제곱으로, 음이 아닌 실수로 반환됩니다. resnormx에서 계산된 잔차에 대한 2-노름의 제곱(sum((fun(x,xdata)-ydata).^2))입니다.

해에서 계산된 목적 함수의 값으로, 배열로 반환됩니다. 일반적으로, residual = fun(x,xdata)-ydata입니다.

솔버가 중지된 이유로, 정수로 반환됩니다.

1

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

2

x의 변화량이 지정된 허용오차보다 작거나, x에서 야코비 행렬이 정의되어 있지 않습니다.

3

잔차의 변화량이 지정된 허용오차보다 작습니다.

4

탐색 방향의 상대 크기가 스텝 허용오차보다 작습니다.

0

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

-1

플롯 함수 또는 출력 함수가 솔버를 중지했습니다.

-2

실현가능점을 찾지 못했습니다. 범위 lbub에 모순이 있습니다. 그래서 솔버가 실현불가능점에서 중지되었습니다.

최적화 과정에 대한 정보로, 다음 필드를 가진 구조체로 반환됩니다.

firstorderopt

1차 최적성에 대한 측정값

iterations

수행된 반복 횟수

funcCount

함수 실행 횟수

cgiterations

총 PCG 반복 횟수('trust-region-reflective' 알고리즘과 'interior-point' 알고리즘)

stepsize

x의 최종 변위

constrviolation

제약 조건 함수의 최댓값('interior-point' 알고리즘)

bestfeasible

최상의(가장 낮은 목적 함수) 실현가능점을 발견함('interior-point' 알고리즘). 다음 필드를 포함한 구조체:

  • x

  • fval

  • firstorderopt

  • constrviolation

실현가능점을 찾지 못한 경우 bestfeasible 필드가 비어 있습니다. 이를 위해, 제약 조건 함수의 최댓값이 options.ConstraintTolerance를 초과하지 않을 때 점이 실현 가능합니다.

bestfeasible 점은 반환되는 해에 해당하는 점 x와 다양한 이유로 다를 수 있습니다. 예제는 Obtain Best Feasible Point 항목을 참조하십시오.

algorithm

사용된 최적화 알고리즘

message

종료 메시지

해에서의 라그랑주 승수로, 다음 필드를 갖는 구조체로 반환됩니다.

lower

lb에 대응하는 하한

upper

ub에 대응하는 상한

ineqlin

Ab에 대응하는 선형 부등식

eqlin

Aeqbeq에 대응하는 선형 등식

ineqnonlin

nonlcon에서 c에 대응하는 비선형 부등식

eqnonlin

nonlcon에서 ceq에 대응하는 비선형 등식

해에서 계산된 야코비 행렬로, 실수형 행렬로 반환됩니다. jacobian(i,j)는 해 x에서 계산된 x(j)에 대한 fun(i)의 편도함수입니다.

해에서 활성 제약 조건이 있는 문제의 경우 jacobian은 신뢰구간을 추정하는 데 유용하지 않습니다.

제한 사항

  • trust-region-reflective 알고리즘은 부족 결정 시스템을 풀지 않습니다. 이 알고리즘을 사용하려면 방정식 개수, 즉 F의 행 차원이 최소한 변수 개수여야 합니다. 부족 결정 시스템의 경우 lsqcurvefit은 Levenberg-Marquardt 알고리즘을 사용합니다.

  • lsqcurvefit은 복소수 값을 갖는 문제를 직접 풀 수 있습니다. 제약 조건은 복소수 값에 적합하지 않다는 점에 유의하십시오. 복소수는 순서대로 정렬될 수 없기 때문에 한 복소수 값이 다른 복소수 값보다 크거나 작은지 여부를 요구하는 것은 무의미합니다. 범위 제약 조건이 있는 복소수 문제의 경우 변수를 실수부와 허수부로 분리하십시오. 복소수 데이터로 'interior-point' 알고리즘을 사용하지 마십시오. 복소수 값 데이터에 모델 피팅하기 항목을 참조하십시오.

  • trust-region-reflective 방법의 선조건 적용 켤레 기울기 부분에 사용되는 선조건자 계산은 선조건자를 계산하기 전에 JTJ(여기서 J는 야코비 행렬임)를 형성합니다. 따라서, 0이 아닌 요소를 많이 포함하는 J의 행은 거의 조밀한 곱 JTJ를 생성하며, 이는 대규모 문제에서 비용이 많이 드는 풀이 과정을 초래할 수 있습니다.

  • x의 성분에 상한(또는 하한)이 없는 경우 lsqcurvefit은 기본적으로 ub(또는 lb)의 대응하는 성분을 임의적이지만 매우 큰 양수(또는 하한의 경우 음수)로 설정하는 대신 inf(또는 하한의 경우 -inf)로 설정합니다.

중소 규모 문제에서는 fun에서 야코비 행렬을 계산하거나 야코비 행렬의 희소성 패턴을 제공하지 않고 lsqnonlin, lsqcurvefit, fsolve에 trust-region reflective 알고리즘을 사용할 수 있습니다. 이는 헤세 행렬을 계산하거나 헤세 행렬의 희소성 패턴을 제공하지 않고 fmincon 또는 fminunc를 사용하는 경우에도 적용됩니다. 중소 규모는 얼마나 작은가요? 절대적인 답은 없습니다. 컴퓨터 시스템 구성의 가상 메모리 크기에 따라 달라지기 때문입니다.

문제에 m개의 방정식과 n개의 미지수가 있다고 가정하겠습니다. 명령 J = sparse(ones(m,n))을 실행할 때 컴퓨터에 Out of memory 오류가 발생한다면 이 문제는 확실히 너무 큰 문제입니다. 오류가 발생하지 않은 경우에도 여전히 너무 큰 문제일 수 있습니다. 이를 확인할 수 있는 유일한 방법은 문제를 실행하고 MATLAB이 시스템에서 사용할 수 있는 가상 메모리 크기 내에서 실행되는지 확인하는 것입니다.

알고리즘

Levenberg-Marquardt 방법과 trust-region-reflective 방법은 fsolve에도 사용된 동일한 비선형 최소제곱 알고리즘을 기반으로 합니다.

  • 디폴트 trust-region-reflective 알고리즘은 부분공간 trust-region 방법이며 interior-reflective 뉴턴 방법([1][2]에 설명되어 있음)을 기반으로 합니다. 각 반복에는 선조건 적용 켤레 기울기(PCG) 방법을 사용한 대규모 선형 시스템의 근사해 풀이 작업이 포함됩니다. Trust-Region-Reflective 최소제곱 항목을 참조하십시오.

  • Levenberg-Marquardt 방법은 참고 문헌 [4], [5], [6]에 설명되어 있습니다. Levenberg-Marquardt 방법 항목을 참조하십시오.

'interior-point' 알고리즘은 몇 가지 수정 사항이 적용된 fmincon 'interior-point' 알고리즘을 사용합니다. 자세한 내용은 제약 조건이 있는 최소제곱에 대해 수정된 fmincon 알고리즘 항목을 참조하십시오.

대체 기능

최적화 라이브 편집기 작업은 lsqcurvefit에 대한 시각적 인터페이스를 제공합니다.

참고 문헌

[1] Coleman, T.F. and Y. Li. “An Interior, Trust Region Approach for Nonlinear Minimization Subject to Bounds.” SIAM Journal on Optimization, Vol. 6, 1996, pp. 418–445.

[2] Coleman, T.F. and Y. Li. “On the Convergence of Reflective Newton Methods for Large-Scale Nonlinear Minimization Subject to Bounds.” Mathematical Programming, Vol. 67, Number 2, 1994, pp. 189–224.

[3] Dennis, J. E. Jr. “Nonlinear Least-Squares.” State of the Art in Numerical Analysis, ed. D. Jacobs, Academic Press, pp. 269–312.

[4] Levenberg, K. “A Method for the Solution of Certain Problems in Least-Squares.” Quarterly Applied Mathematics 2, 1944, pp. 164–168.

[5] Marquardt, D. “An Algorithm for Least-squares Estimation of Nonlinear Parameters.” SIAM Journal Applied Mathematics, Vol. 11, 1963, pp. 431–441.

[6] Moré, J. J. “The Levenberg-Marquardt Algorithm: Implementation and Theory.” Numerical Analysis, ed. G. A. Watson, Lecture Notes in Mathematics 630, Springer Verlag, 1977, pp. 105–116.

[7] Moré, J. J., B. S. Garbow, and K. E. Hillstrom. User Guide for MINPACK 1. Argonne National Laboratory, Rept. ANL–80–74, 1980.

[8] Powell, M. J. D. “A Fortran Subroutine for Solving Systems of Nonlinear Algebraic Equations.” Numerical Methods for Nonlinear Algebraic Equations, P. Rabinowitz, ed., Ch.7, 1970.

확장 기능

버전 내역

R2006a 이전에 개발됨

모두 확장