2016-04-13 8 views
0

Angenommen, ich habe eine Anzahl von Kurven mit unterschiedlicher Länge (Anzahl der Punkte in jeder Kurve und Punktabstand sind unterschiedlich) . Kann ich eine Kurve im 3D-Raum finden, die am besten zu dieser Liniengruppe passt?Kurvenanpassung: eine Anzahl von Kurven mit unterschiedlicher Länge/Anzahl von Punkten in einer Kurve in 3D in Matlab

Codebeispiel in Matlab würde geschätzt werden.

Beispiel Datensatz:

die erste Kurve hat 10 Punkte.

18.5860 18.4683 18.3576 18.2491 18.0844 17.9016 17.7709 17.6401 17.4617 17.2726 
    91.6178 91.5711 91.5580 91.5580 91.5701 91.6130 91.5746 91.5050 91.3993 91.2977 
    90.6253 91.1090 91.5964 92.0845 92.5565 93.0199 93.5010 93.9785 94.4335 94.8851 

Die zweite Kurve hat 8 Punkte.

15.2091 15.0894 14.9765 14.8567 14.7360 14.6144 14.4695 14.3017 
    90.1138 89.9824 89.8683 89.7716 89.6889 89.6040 89.4928 89.3624 
    99.4393 99.9066 100.3802 100.8559 101.3340 101.8115 102.2770 102.7296 

eine gewünschte Kurve ist eine, die diese beiden Kurven existieren darstellen könnte.

Ich habe daran gedacht, diese Kurven als Punkte streuen und passen eine Linie aus ihnen heraus. Aber nur eine gerade Linie kann ich von vielen Code-Schnipsel online bekommen.

Also habe ich etwas vermisst oder könnte jemand einen Hinweis geben. Vielen Dank.

+0

Können Sie alle Punkte setzen, von allen Kurven, in einer bestimmten Reihenfolge? Das heißt, können Sie die Kurven in eine Reihenfolge bringen? Zum Beispiel scheinen sich die beiden Sample-Kurven, die Sie angegeben haben, nicht zu überlappen - sie scheinen so zu sein, als käme die zweite Kurve nach der ersten Kurve. Das heißt, untersuchen wir eine einzelne Kurve, die in Fragmente aufgeteilt wurde, oder versuchen wir, eine Linie mit bester Anpassung durch eine Punktwolke zu erstellen? –

+0

Ich habe vielleicht einen Teildatensatz in das Beispiel eingefügt, weil die echten Daten in der Regel aus mehreren Mal mehr Punkten bestehen. und laufen parallel, wenn sie visualisiert werden. Mein Beispiel ist etwas übertrieben die Diskrepanz von Datenlänge und Anfangspunkt. Aber es ist ein Beispiel für einen "Sonderfall", mit dem man auch richtig umgehen sollte. Was ich habe, ist, alle Kurve auf die gleiche Anzahl von Punkten zu resampeln, N, dann alle i-ten zu berechnen (ich gehöre zu 1: N) X, Y und Z. Irgendwelche anderen besseren Vorschläge? –

Antwort

0

Es ist schwierig, eine kugelsichere Lösung ohne weitere Details zu finden, aber hier ist ein Ansatz, der für die bereitgestellten Beispieldaten funktioniert. Ich fand die Linie der besten Anpassung für alle Punkte und parametrisierte dann alle Punkte entlang dieser Linie der besten Anpassung. Dann habe ich für jede Dimension getrennt das Polynom der kleinsten Quadrate angepasst. Dies erzeugte eine dreidimensionale parametrische Kurve, die den Daten gut zu passen scheint. Beachten Sie, dass Kurvenanpassungen, die sich anders als polynomische kleinste Quadrate nähern, in einigen Fällen besser geeignet sind - ersetzen Sie einfach die bevorzugte Anpassungsfunktion für polyfit und polyval.

Hoffe, das ist hilfreich!

clear; 
close all; 

pts1=[18.5860 18.4683 18.3576 18.2491 18.0844 17.9016 17.7709 17.6401 17.4617 17.2726; 
    91.6178 91.5711 91.5580 91.5580 91.5701 91.6130 91.5746 91.5050 91.3993 91.2977; 
    90.6253 91.1090 91.5964 92.0845 92.5565 93.0199 93.5010 93.9785 94.4335 94.8851]'; 
pts2=[ 15.2091 15.0894 14.9765 14.8567 14.7360 14.6144 14.4695 14.3017; 
    90.1138 89.9824 89.8683 89.7716 89.6889 89.6040 89.4928 89.3624; 
    99.4393 99.9066 100.3802 100.8559 101.3340 101.8115 102.2770 102.7296]'; 

%Combine all of our curves into a single point cloud 
X = [pts1;pts2]; 

%======================================================= 
%We want to first find the line of best fit 
%This line will provide a parameterization of the points 
%See accepted answer to http://stackoverflow.com/questions/10878167/plot-3d-line-matlab 

% calculate centroid 
x0 = mean(X)'; 

% form matrix A of translated points 
A = [(X(:, 1) - x0(1)) (X(:, 2) - x0(2)) (X(:, 3) - x0(3))]; 

% calculate the SVD of A 
[~, S, V] = svd(A, 0); 

% find the largest singular value in S and extract from V the 
% corresponding right singular vector 
[s, i] = max(diag(S)); 
a = V(:, i); 
%======================================================= 
a=a/norm(a); 
%OK now 'a' is a unit vector pointing along the line of best fit. 
%Now we need to compute a new variable, 't', for each point in the cloud 
%This 't' value will parameterize the curve of best fit. 
%Essentially what we're doing here is taking the dot product of each 
%shifted point (contained in A) with the normal vector 'a' 
t = A * a; 

tMin = min(t); 
tMax = max(t); 

%This variable represents the order of our polynomial fit 
%Use the smallest number that produces a satisfactory result 
polyOrder = 8; 

%Polynomial fit all three dimensions separately against t 
pX = polyfit(t,X(:,1),polyOrder); 
pY = polyfit(t,X(:,2),polyOrder); 
pZ = polyfit(t,X(:,3),polyOrder); 

%And that's our curve fit: (pX(t),pY(t),pZ(t)) 

%Now let's plot it. 
tFine = tMin:.01:tMax; 
fitXFine = polyval(pX,tFine); 
fitYFine = polyval(pY,tFine); 
fitZFine = polyval(pZ,tFine); 

figure; 
scatter3(X(:,1),X(:,2),X(:,3)); 
hold on; 
plot3(fitXFine,fitYFine,fitZFine); 
hold off; 

Curve fit