'u kullanarak en küçük kareler çember uydurma this kağıdını izleyerek en küçük kareler çemberini yerleştirmeye çalışıyorum (üzgünüz, yayınlayamıyorum). Kağıt, geometrik bir noktayı belirli bir nokta (Xi) ile dairenin (Xi ') üzerindeki ilgili nokta arasındaki öklid mesafesi (Xi' ') olarak hesaplayarak bir daireye sığabileceğimizi belirtir. Üç parametreye sahibiz: Xc (dairenin merkezini koordine eden bir vektör) ve R (yarıçapı). AncakMATLAB Optimizasyon Araç Kutusu
function [ circle ] = fit_circle(X)
% Kör paraméterstruktúra inicializálása
% R - kör sugara
% Xc - kör középpontja
circle.R = NaN;
circle.Xc = [ NaN; NaN ];
% Kezdeti illesztés
% A köz középpontja legyen a súlypont
% A sugara legyen az átlagos négyzetes távolság a középponttól
circle.Xc = mean(X);
d = bsxfun(@minus, X, circle.Xc);
circle.R = mean(bsxfun(@hypot, d(:,1), d(:,2)));
circle.Xc = circle.Xc(1:2)+random('norm', 0, 1, size(circle.Xc));
% Optimalizáció
options = optimset('Jacobian', 'on');
out = lsqnonlin(@ort_error, [circle.Xc(1), circle.Xc(2), circle.R], [], [], options, X);
end
%% Cost function
function [ error, J ] = ort_error(P, X)
%% Calculate error
R = P(3);
a = P(1);
b = P(2);
d = bsxfun(@minus, X, P(1:2)); % X - Xc
n = bsxfun(@hypot, d(:,1), d(:,2)); % || X - Xc ||
res = d - R * bsxfun(@times,d,1./n);
error = zeros(2*size(X,1), 1);
error(1:2:2*size(X,1)) = res(:,1);
error(2:2:2*size(X,1)) = res(:,2);
%% Jacobian
xdR = d(:,1)./n;
ydR = d(:,2)./n;
xdx = bsxfun(@plus,-R./n+(d(:,1).^2*R)./n.^3,1);
ydy = bsxfun(@plus,-R./n+(d(:,2).^2*R)./n.^3,1);
xdy = (d(:,1).*d(:,2)*R)./n.^3;
ydx = xdy;
J = zeros(2*size(X,1), 3);
J(1:2:2*size(X,1),:) = [ xdR, xdx, xdy ];
J(2:2:2*size(X,1),:) = [ ydR, ydx, ydy ];
end
uydurma:
aşağıdaki MATLAB kodu (o görüntülerde gösterilir gibi ben çevrelerin değil, küreleri sığdırıyorum unutmayın) ile geldi çok iyi değil: eğer iyi parametre vektörü ile başlarsam algoritma ilk adımda sona erer (yani olması gereken yerde yerel bir minima olur), fakat eğer başlangıç noktasını bozarsam (gürültüsüz bir daire ile) bağlantı elemanı çok büyük hatalar. Uygulamamda bir şey gözden kaçırdığına eminim.