0

제 실험에서 필자는 선형 세그먼트가 n 인 측정 값 y = f_m (x)을 근사화하거나 피팅해야합니다. n의 값은 1, 2, 3, 4, 5 ... 및 아마도 10 미만으로 선택할 수 있습니다. 명확하게하기 위해 서로 다른 경우의 오류를 비교하여 오류가 가장 작은 오류를 찾는 것이 좋습니다.MATLAB을 사용한 피스 와이즈 선형 커브 피팅

내가 MATLAB (link)를 사용하여 하나의 예를 발견했습니다

% Random data... 
xdata = linspace(-2,3,101); 
ydata = log(abs(10./(10+1i*10.^xdata))) + 0.5*randn(size(xdata)); 
plot(xdata,ydata) 
F = @(B,xdata) min(B(1),B(2)+B(3)*xdata); %Form of the equation 
IC = [max(ydata) max(ydata) 0]; %Initial guess 
B = lsqcurvefit(F,IC,xdata,ydata,[min(ydata) -inf -inf],[max(xdata) inf 0]); 
hold all; 
plot(xdata,F(B,xdata)); 
a = (B(1) - B(2))/B(3) 
cte = B(1) 
c = B(2) 
d = B(3) 

이 내가 2 개 세그먼트의 경우 무엇을 찾고 있어요과 유사합니다. 나는 함수 핸들을 변경 내 필요에 맞게이 기능을 수정하려고 :

F = @(B,xdata) min(B(1),B(2)+B(3)*xdata); %Form of the equation 

F = @(B,xdata) min(B(1)+B(2)*xdata,B(3)+B(4)*xdata); 

에 있지만 같은 줄에 2 개 세그먼트 내 수정 결과를 보인다.

나는 MATLAB 함수 핸들에 대해 많이 모른다. 특히 여기에는 "min"기능이 있습니다. 또한이 예제를 여러 선형 세그먼트로 확장하려면 어떻게해야합니까?

미리 감사드립니다.

Edit01 :

감사합니다. 귀하의 대답에 따라 원하는대로 내 코드가 실행됩니다. 그러나, 나는 여기서 약간의 질문을할지 모른다. 앞서 언급했듯이, 원래 근사를 여러 선형 세그먼트로 확장하려고합니다. 그래서 저는 다음과 같이갑니다 :

F = @(B,xdata) min(B(1)+B(2)*xdata, B(3)+B(4)*xdata, B(5)+B(6)*xdata); %Form of the equation 
IC = [max(ydata) max(ydata) max(ydata) max(ydata) max(ydata) 0]; %Initial guess 
B = lsqcurvefit(F,IC,xdata,ydata,[min(ydata) -inf -inf -inf -inf -inf],[max(xdata) inf inf inf inf 0]); 

그러나 I.C. 오류 :

Failure in initial user-supplied objective function evaluation 

여기에서 I.C를 곧 사용할 수 있습니까? 함수 핸들에서 "min"함수는 무엇입니까? 코드를 실행할 때

답변

1

나는 다음과 같은 오류가 발생합니다 :

??? Error using ==> lsqncommon at 101 
LSQCURVEFIT cannot continue because user supplied objective function failed with the following error: 
Attempted to access B(4); index out of bounds because numel(B)=3. 

따라서,이 B(4) 아무것도 없다는 것을 의미한다. IC, lbub을 4 개 요소로 수정하려고합니다.

IC = [max(ydata) max(ydata) max(ydata) 0]; %Initial guess 
B = lsqcurvefit(F,IC,xdata,ydata,[min(ydata) -inf -inf -inf],[max(xdata) inf inf 0]); 
:

그래서 코드에서이 두 줄을 넣어 시도