2013-07-01 2 views
6

나는 다음과 같은 종류의 수 있어야하는 기능 보간해야 데이터가 있습니다다항식 피팅 matlab에

f(x) = ax4 + bx2 + c

a > 0b ≤ 0으로합니다. 불행히도, MATLAB의 polyfit은 다항식의 계수에 대한 제약을 허용하지 않습니다. 누구든지이 일을 MATLAB 함수가 있는지 알고 있습니까? 그렇지 않으면 어떻게 구현할 수 있습니까?

는, 사전에 대단히 감사

엘리자베타

+0

왜 'a> 0'이 아닌 'a> = 0'입니까? 당신의 최적화 결과가'a = 0'으로 가정하고,'a = \ epsilon'으로 설정하면 아주 조금 변화 할 것입니다 ... – Shai

+0

내 데이터가 결코 "행동하지"않기 때문에 그렇습니다. 0으로 닫힌 함수이지만 반드시 제약 조건으로 설정하지 않아도됩니다. – bettaberg

+0

@bettaberg : 나는 제약 조건이 어디에서 왔는지 알고 싶어합니다 ... ...? 무엇을 모델링하려고합니까? 왜 매개 변수에 대한 제약이 있습니까? –

답변

11

당신은 수동으로 목적 함수를 정의 fminsearch, fminunc를 사용하여 시도 할 수 있습니다.

또는, 당신은 약간 다른 문제를 정의 할 수 있습니다

f(x) = a2x4 - b2x2 + c

을 이제, 새로운 a 및 보장 b없이 제약에 최적화 할 수있는 최종 ab 당신이 찾고있는 긍정적 인 (부정적인 resp.).

+4

변환을 제안하는 +1, 좋은 것 –

7

제약없이, 문제는 기록 할 수 있으며, 간단한 선형 시스템으로 해결 :

% Your design matrix ([4 2 0] are the powers of the polynomial) 
A = bsxfun(@power, your_X_data(:), [4 2 0]); 

% Best estimate for the coefficients, [a b c], found by 
% solving A*[a b c]' = y in a least-squares sense 
abc = A\your_Y_data(:) 

그 제약은 물론 자동 실제로 데이터의 기초가 모델을 제약하는 IFF에 만족하실 것입니다. 예를 들어,

% some example factors 
a = +23.9; 
b = -15.75; 
c = 4; 

% Your model 
f = @(x, F) F(1)*x.^4 + F(2)*x.^2 + F(3); 

% generate some noisy XY data 
x = -1:0.01:1; 
y = f(x, [a b c]) + randn(size(x)); 

% Best unconstrained estimate a, b and c from the data 
A = bsxfun(@power, x(:), [4 2 0]); 
abc = A\y(:); 

% Plot results 
plot(x,y, 'b'), hold on 
plot(x, f(x, abc), 'r') 
xlabel('x (nodes)'), ylabel('y (data)') 

enter image description here

그러나 정확하게 그 제약 모델에 의해 설명이, 일이 잘못 갈 수도없는 데이터에 대한 제한을 부과하는 경우 :

% Note: same data, but flipped signs 
a = -23.9; 
b = +15.75; 
c = 4; 

f = @(x, F) F(1)*x.^4 + F(2)*x.^2 + F(3); 

% generate some noisy XY data 
x = -1:0.01:1; 
y = f(x, [a b c]) + randn(size(x)); 

% Estimate a, b and c from the data, Forcing a>0 and b<0 
abc = fmincon(@(Y) sum((f(x,Y)-y).^2), [0 0 0], [-1 0 0; 0 +1 0; 0 0 0], zeros(3,1)); 

% Plot results 
plot(x,y, 'b'), hold on 
plot(x, f(x, abc), 'r') 
xlabel('x (nodes)'), ylabel('y (data)') 

enter image description here

(이 솔루션은 a == 0이고, i는 ncorrect 모델 선택).

정확한 균등도가 a == 0 인 경우 문제가 발생합니다. a == eps(0)을 설정하면 차이가 없습니다. 수치 적으로 이것은 실제 데이터에서는 눈에 띄지 않지만, 그럼에도 불구하고 0이 아닙니다.

어쨌든 모델이 잘 선택되지 않았고 제약 조건이 제대로 작동하지 않거나 데이터를 실제로 적용하려고 시도하는 "수정 사항"이거나 데이터를 실제로 적용하려고 시도하기 전에 약화되거나 재조정되어야한다는 의구심이 있습니다. 비슷한 전제 조건이 적용됩니다 (저는 사람들이 이런 종류의 일을하는 것을 보았습니다, 그렇습니다, 저는이 점에서 조금 편견이 있습니다).

그래서 ... 이러한 제약의 근본적인 이유는 무엇입니까?

+0

"우리가이 모델을 가정했기 때문에 제약 조건은 데이터에 의해 자동으로 충족되어야합니다."라고 말하기는 다소 순진합니다. ... – Shai

+0

@Shai : 정확히 어디에서 말 했나요? 꽤 명확한 *** IF ***이있었습니다 ... –

+0

아마도 내 의견을 달리 다르게해야 했겠지만, 요점은 : 매개 변수에 제약 조건이 있다면 매개 변수를 사용해야하고 기적적으로 될 것이라고 희망하지 않아야합니다. 만족 ... – Shai

3

커브 피팅 도구 상자가있는 경우 fit은 'upper'및 'lower'옵션을 사용하여 구속 조건을 설정할 수 있습니다. 너는 뭔가를 원할거야.

M=fit(x, f, 'poly4', 'upper', [-inf, 0, -inf, 0, -inf], 'lower', [0, 0, 0, 0, -inf]); 

특정 계수를 제한하지 않으려면 -inf를 사용하십시오.

이것은 관련 계수가있는 cfit 개체를 제공합니다. x^4 용어에 대해 예를 들어 M.p1을 사용하여 액세스 할 수 있습니다. 또는 feval을 사용하여 원하는 지점에서 함수를 평가할 수 있습니다.

최적화 도구 상자에서도 lsqcurvefit을 사용하여 유사한 작업을 수행 할 수 있다고 생각합니다.

+0

이것은 가장 빠르고 간단한 방법입니다. – Kvothe