This is not the cleanest code in the world (some allocations that could be trimmed at least), and seems a bit fragile with respect to initial conditions, but here’s a working example using LsqFit.
using LsqFit
data = [(-2.0,1.0), (0.0, 3.0), (2.0, 1.0)]
ptrs = 1:length(data)
y = zeros(length(data))
function circle_model(t,p)
out = []
x0,y0,r = p
for ptr ∈ ptrs
x,y = data[ptr]
push!(out,(x-x0)^2+(y-y0)^2-r^2)
end
out
end
p0 = [0.0, 0.0, 1.0] # using 0.0 as initial radius fails
fit = curve_fit(circle_model, ptrs, y, p0)
fit.param