我从平面曲线得到了一系列(x,y)样本,取自实际测量值,因此可能有点嘈杂且时间间隔不均匀。
x = -2.51509 -2.38485 -1.88485 -1.38485 -0.88485 -0.38485 0.11515 0.61515 1.11515 1.61515 ...
y = -48.902 -48.917 -48.955 -48.981 -49.001 -49.014 -49.015 -49.010 -49.001 -48.974 ...
如果我绘制整个系列,它看起来像一个漂亮的椭圆形,但如果我仔细观察,该线看起来有点摇摆,这可能是噪音。
我如何提取下面椭圆曲率半径的估计?
任何编程语言都没问题!
答案 0 :(得分:3)
Roger Stafford在这里给出了一些MATLAB代码:
http://www.mathworks.com/matlabcentral/newsreader/view_thread/152405
我对此功能进行了一些试验:
# given a load of points, with x,y coordinates, we can estimate the radius
# of curvature by fitting a circle to them using least squares.
function [r,a,b]=radiusofcurv(x,y)
# translate the points to the centre of mass coordinates
mx = mean(x);
my = mean(y);
X = x - mx; Y = y - my;
dx2 = mean(X.^2);
dy2 = mean(Y.^2);
# Set up linear equation for derivative and solve
RHS=(X.^2-dx2+Y.^2-dy2)/2;
M=[X,Y];
t = M\RHS;
# t is the centre of the circle [a0;b0]
a0 = t(1); b0 = t(2);
# from which we can get the radius
r = sqrt(dx2+dy2+a0^2+b0^2);
# return to given coordinate system
a = a0 + mx;
b = b0 + my;
endfunction
它似乎对我的目的很有效,尽管它给出了非常奇怪的答案,例如:共线点。但是,如果它们来自一条带有一点噪音的漂亮曲线,那么工作就已经完成了。
它应该很容易适应其他语言,但请注意\是MATLAB / Octave的'使用伪逆解决'功能,所以你需要一个线性代数库来计算伪逆,以便复制它。
答案 1 :(得分:1)
我认为this描述了您想要的内容,包括代码和拟合算法的描述。
答案 2 :(得分:1)
我认为你可以计算椭圆,它满足你的数据和椭圆方程之间差异的最小二乘。然后使用椭圆的长轴和短轴。 Here是我在Google搜索后发现的一篇论文。