2017-07-14 1 views
0

Ich weiß, ich weiß, dass es mehrere ähnliche Fragen bereits in diesem und anderen Foren gibt. Ich lese und probiere sie alle ... hat aber nicht für mich gearbeitet.Wie schränke ich eine angepasste Kurve durch bestimmte Punkte wie der Ursprung in MATLAB, auch die Implementierung von Gradienten

Ich folgte this MATLAB Post meine Probleme zu lösen, hier der Code

x0 = Xh(end,1); %end point of previous curve to add on 
y0 = fh(end,1); %end point of previous curve to add on 

x = A.data(co2:end,1); %a 17280 x 1 double of real data (shaky) 
y = A.data(co2:end,31); %a 17280 x 1 double of real data (shaky) 
% 'C' is the Vandermonde matrix for 'x' 
n = 25; % Degree of polynomial to fit 
V(:,n+1) = ones(length(x),1,class(x)); 
for j = n:-1:1 
    V(:,j) = x.*V(:,j+1); 
end 
C = V; 
% 'd' is the vector of target values, 'y'. 
d = y; 
%% 
% There are no inequality constraints in this case, i.e., 
A = []; 
b = []; 
%% 
% We use linear equality constraints to force the curve to hit the required point. In 
% this case, 'Aeq' is the Vandermoonde matrix for 'x0' 
Aeq = x0.^(n:-1:0); 
% and 'beq' is the value the curve should take at that point 
beq = y0; 
%% 
p = lsqlin(C, d, A, b, Aeq, beq) 
%% 
% We can then use POLYVAL to evaluate the fitted curve 
yhat = polyval(p, x); 
%% 
% Plot original data 
plot(x,y,'.b-') 
hold on 
% Plot point to go through 
plot(x0,y0,'gx','linewidth',4) 
% Plot fitted data 
plot(x,yhat,'g','linewidth',2) 
hold off 

Dieser Code für mich die Kurve in Bezug auf die Montage perfekt funktioniert und zwingt ihn durch meinen Ausgangspunkt zu gehen. Aber in Bezug auf die glatte Hinzufügung der Kurve zu einem vorherigen sollte der Startpunkt den gleichen Gradienten haben wie die vorherige Kurve, die an endete. Auch sollte es an einem festen Punkt mit festem Gefälle enden.

So sind die Implementierungen ich brauche sind:


hinzufügen mehr als einen festen Punkt ([x0, y0], [x1, y1], ...)

Set der Gradient an dem festen x0, x1, ...

ich weiß polyfix dies zuvor, aber der Anpassungsprozess in diesem Code funktioniert in meinem Fall nicht. Die Ergebnisse von lsqlin sind viel besser. Trotzdem suche ich nach etwas.

Können Sie mir helfen, den obigen Code zu bearbeiten, um diese Funktionen hinzuzufügen?

+0

Nein. "Gimme the Codez" Fragen sind Off-Topic auf Stack Overflow. Fügen Sie die Funktionen selbst hinzu und kehren Sie zurück, wenn Sie eine _spezifische Frage oder einen Fehler _ haben. – dasdingonesin

Antwort

1

Sie sollen mehr Beschränkungsgleichung auf Ihr Optimierungsproblem hinzufügen, zB:

Aeq(1, :) = x0.^(n:-1:0); 
beq(1, :) = x0; 
Aeq(2, :) = x1.^(n:-1:0); 
beq(2, :) = y1; 
Aeq(3, 1:end-1) = x0.^(n-1:-1:0) .* (n:-1:1); 
beq(3, :) = dy0; 
Aeq(4, 1:end-1) = x1.^(n-1:-1:0) .* (n:-1:1); 
beq(4, :) = dy1; 

die Gleichung der ersten Ableitung Einschränkung abzuleiten, ist es eine gute Idee, es zuerst mit der Hand für ein kleines Polynom zu versuchen, Auftrag.

Beispiel

Die folgende Eingabe:

p_exact = [1 2 3 4 5 6]; 
x0 = 0; 
y0 = 0; 
dy0 = 0; 
x1 = 1; 
y1 = 10; 
dy1 = 100; 

x = (0:0.001:1)'; 
y = polyval(p_exact, x)+randn(size(x)); 
n = 7; % Degree of polynomial to fit 

erzeugt diese Ausgabe:

enter image description here

Sie deutlich sehen, die Auswirkungen der Einschränkungen auf Ihrer angepassten Kurve, also vergleichen die rote und grüne Kurve.

Verwandte Themen