2013-07-01 4 views
6

I-Daten, die ich mit einer Funktion interpoliert werden sollten, welche der folgenden Art sein:Polynomfit Matlab mit einigen Einschränkungen für die Koeffizienten

f(x) = ax4 + bx2 + c

mit a > 0 und b ≤ 0. Leider erlaubt MATLABs polyfit keine Beschränkungen für die Koeffizienten des Polynoms. Weiß jemand, ob es dafür eine MATLAB-Funktion gibt? Ansonsten, wie kann ich es implementieren?

Vielen Dank im Voraus,

Elisabetta

+0

warum 'a> 0' und nicht' a> = 0'? Nehmen wir an, Ihre Optimierungsergebnisse würden mit 'a = 0' und dann mit 'a = \ epsilon' sehr wenig ändern ... – Shai

+0

Ja, Sie haben Recht, ich habe ein> 0 gesagt, nur weil meine Daten sich nie" benehmen " eine Funktion mit einem geschlossenen Wert von 0, aber ich muss es nicht unbedingt als Bedingung setzen – bettaberg

+0

@bbettaberg: Ich bin immer noch gespannt, woher diese Einschränkungen kommen ...? Was versuchst du zu modellieren und warum die Einschränkungen der Parameter? –

Antwort

11

Sie versuchen fminsearch verwenden, können, fminunc manuell Ihre Zielfunktion definieren.

Alternativ können Sie Ihr Problem etwas anders definieren:

f(x) = a2x4 - b2x2 + c

Nun kann die neue a und b für ohne Einschränkungen optimiert werden, während sichergestellt wird, dass die endgültige a und b Sie suchen sind positiv (negativ bzw.).

+4

+1 für die Transformation vorschlagen, gut –

7

Ohne Einschränkungen kann das Problem geschrieben und als ein einfaches lineares System gelöst werden:

% 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(:) 

Diese Einschränkungen werden natürlich automatisch erfüllt sein iff, die in der Tat gezwungen Modell Ihrer Daten zugrunde liegt. wenn Sie Einschränkungen für Daten verhängen Zum Beispiel

% 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

jedoch, die nicht genau durch diese eingeschränkte Modell beschrieben, könnten die Dinge schief gehen:

% 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

(diese Lösung hat a == 0, indikativ für ein i nkorrekte Modellwahl).

Wenn die genaue Gleichheit von a == 0 ein Problem ist: Es gibt natürlich keinen Unterschied, wenn Siesetzen. Numerisch wird dies für reale Daten nicht wahrnehmbar sein, aber nichtsdestotrotz ungleich null.

Wie auch immer, ich habe den Verdacht, dass Ihr Modell nicht gut gewählt ist und die Einschränkungen sind ein "Fix", um alles zum Laufen zu bringen, oder Ihre Daten sollten tatsächlich unvoreingenommen sein, bevor Sie versuchen, oder einige fit zu machen ähnliche Voraussetzungen treffen zu (ich habe oft Leute gesehen, die so etwas machen, also ja, ich bin in dieser Hinsicht ein bisschen voreingenommen :).

Also ... was sind die wahren Gründe für diese Einschränkungen?

+0

es ist ein bisschen naiv zu sagen "seit wir dieses Modell angenommen haben, sollten die Einschränkungen automatisch durch die Daten erfüllt sein" ... – Shai

+0

@Shai: wo genau habe ich das gesagt? Es gab eine ziemlich explizite *** IF *** dort ... –

+0

Ich hätte wahrscheinlich meinen Kommentar anders formuliert, aber der Punkt ist: Wenn Sie Einschränkungen für Ihre Parameter haben, sollten Sie sie verwenden und nicht hoffen, dass sie miraculasly werden zufrieden ... – Shai

3

Wenn Sie die Toolbox zur Kurvenanpassung haben, können Sie mit fit Constraints mit den Optionen "Upper" und "Lower" festlegen. Du möchtest etwas wie.

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

Hinweis Verwenden Sie -inf, um einen bestimmten Koeffizienten als unbeschränkt festzulegen.

Dies ergibt ein cfit Objekt mit den relevanten Koeffizienten. Sie können auf diese zugreifen, indem Sie z. B. M.p1 für den Ausdruck x^4 verwenden. Alternativ können Sie die Funktion an den gewünschten Stellen mit feval auswerten.

Ich denke, Sie können eine ähnliche Sache mit lsqcurvefit in der Optimierungs-Toolbox als auch tun.

+0

Dies ist der schnellste und einfachste Weg, es zu tun – Kvothe

Verwandte Themen