Tôi đang cố gắng triển khai tối thiểu hình vuông phù hợp theo sau this giấy (xin lỗi tôi không thể xuất bản nó). Các trạng thái giấy, rằng chúng ta có thể phù hợp với một vòng tròn, bằng cách tính toán sai số hình học như khoảng cách euclide (Xi '') giữa một điểm cụ thể (Xi) và điểm tương ứng trên vòng tròn (Xi '). Chúng ta có ba parametres: Xc (vectơ tọa độ tâm của hình tròn), và R (bán kính).Vòng tròn hình vuông nhỏ nhất phù hợp bằng cách sử dụng Hộp công cụ tối ưu hóa MATLAB
tôi đã đưa ra đoạn mã sau MATLAB (lưu ý rằng tôi đang cố gắng để phù hợp với vòng tròn, không lĩnh vực như nó được ghi trên hình ảnh):
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
Các phụ kiện tuy nhiên không phải là quá tốt: nếu tôi bắt đầu với vector tham số tốt thuật toán kết thúc ở bước đầu tiên (vì vậy có một minima địa phương nơi nó nên), nhưng nếu tôi làm rối loạn điểm khởi đầu (với vòng tròn không ồn) các lỗi rất lớn. Tôi chắc chắn rằng tôi đã bỏ qua một cái gì đó trong việc thực hiện của tôi.