下面是一个相当简单的函数实现,可以最小化该论文中的 SS(a,b,r):
fitSS <- function(xy,
a0=mean(xy[,1]),
b0=mean(xy[,2]),
r0 = mean(sqrt((xy[,1]-a0)^2 + (xy[,2]-b0)^2)),
...){
SS <- function(abr){
sum((abr[3] - sqrt((xy[,1]-abr[1])^2 + (xy[,2]-abr[2])^2))^2)
}
optim(c(a0,b0,r0), SS, ...)
}
我编写了几个支持函数来生成圆上的随机数据并绘制圆。因此:
> xy = sim_circles(10)
> f = fitSS(xy)
The fit$par
value 是 xcenter、ycenter、radius 的向量。
> plot(xy,asp=1,xlim=c(-2,2),ylim=c(-2,2))
> lines(circlexy(f$par))
请注意,它不使用梯度,也不检查收敛错误代码。您可以为其提供初始值,或者它可以进行猜测。
绘制和生成圆的代码如下:
circlexy <- function(xyr, n=180){
theta = seq(0,2*pi,len=n)
cbind(xyr[1] + xyr[3]*cos(theta),
xyr[2] + xyr[3]*sin(theta)
)
}
sim_circles <- function(n,x=0,y=0,r=1,sd=0.05){
theta = runif(n, 0, 2*pi)
r = r + rnorm(n, mean=0, sd=sd)
cbind(x + r*cos(theta),
y + r*sin(theta)
)
}