Main Content

최적화를 통한 곡선 피팅

이 예제에서는 비선형 함수를 데이터에 피팅하는 방법을 보여줍니다. 이 예제에서, 비선형 함수는 표준 지수 감쇠 곡선입니다.

y(t)=Aexp(-λt),

여기서 y(t)는 시간 t에서의 응답이고, Aλ는 피팅할 파라미터입니다. 곡선을 피팅한다는 것은 오차제곱합을 최소화하는 파라미터 Aλ를 구한다는 의미입니다.

i=1n(yi-Aexp(-λti))2,

여기서 시간은 ti이고 응답은 yi,i=1,,n입니다. 오차제곱합은 목적 함수입니다.

샘플 데이터 만들기

대개의 경우, 측정값 데이터가 있습니다. 이 예제에서는 A=40, λ=0.5인 모델을 기반으로 하고 의사 난수 오차가 정규분포하는 인위적 데이터를 만듭니다.

rng default % for reproducibility
tdata = 0:0.1:10;
ydata = 40*exp(-0.5*tdata) + randn(size(tdata));

목적 함수 작성하기

파라미터 Alambda, 데이터 tdataydata를 받고 모델 y(t)의 오차제곱합을 반환하는 함수를 작성합니다. 최적화할 모든 변수(Alambda)를 단일 벡터 변수(x)에 추가합니다. 자세한 내용은 다변수 함수 최소화하기 항목을 참조하십시오.

type sseval
function sse = sseval(x,tdata,ydata)
A = x(1);
lambda = x(2);
sse = sum((ydata - A*exp(-lambda*tdata)).^2);

이 목적 함수를 MATLAB® 경로에 sseval.m이라는 파일로 저장합니다.

fminsearch 솔버는 단일 변수 x의 함수에 적용됩니다. 그러나 sseval 함수는 세 개의 변수를 갖습니다. 추가 변수 tdataydata는 최적화할 변수가 아니라 최적화를 위한 데이터입니다. fminsearch에 대한 목적 함수를 x만의 함수로 정의합니다.

fun = @(x)sseval(x,tdata,ydata);

tdataydata와 같은 추가 파라미터를 포함하는 데 대한 자세한 내용은 함수를 파라미터화하기 항목을 참조하십시오.

최적의 피팅 파라미터 구하기

임의의 양수 파라미터 세트 x0에서 시작하여, fminsearch를 사용해 목적 함수를 최소화하는 파라미터를 구합니다.

x0 = rand(2,1);
bestx = fminsearch(fun,x0)
bestx = 2×1

   40.6877
    0.4984

결과 bestx는 해당 데이터를 생성한 파라미터인 A = 40lambda = 0.5에 상당히 가깝습니다.

피팅 품질 확인하기

피팅의 품질을 확인하려면 데이터와 결과로 생성되는 피팅된 응답 곡선을 플로팅해 보십시오. 모델의 반환된 파라미터에서 응답 곡선을 만듭니다.

A = bestx(1);
lambda = bestx(2);
yfit = A*exp(-lambda*tdata);
plot(tdata,ydata,'*');
hold on
plot(tdata,yfit,'r');
xlabel('tdata')
ylabel('Response Data and Curve')
title('Data and Best Fitting Exponential Curve')
legend('Data','Fitted Curve')
hold off

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

관련 항목