我有一个 3D 点列表,我想将其拟合到一个球体:
R^2 = (x-x0)^2 + (y-y0)^2 + (z-z0)^2
所以我想,我会表达 z,并用 4 个参数(x0、y0、z0 和 R)拟合 2D 数据:
z = sqrt(R^2 - (x-x0)^2 - (y-y0)^2) + z0
这是一个代码(它是更大项目的一部分):
#!/usr/bin/python
from scipy import *
from scipy.optimize import leastsq
Coordinates = load("data.npy")
xyCoords = Coordinates[:, [0, 1]]
zCoords = Coordinates[:, 2]
p0 = [149.33499, 148.95999, -218.84893225608857, 285.72893713890107]
fitfunc = lambda p, x: sqrt(p[3]**2 - (x[0] - p[0])**2 - (x[1] - p[1])**2) + x[2]
errfunc = lambda p, x, z: fitfunc(p, x) - z
p1, flag = leastsq(errfunc, p0, args=(xyCoords, zCoords))
print p1
我得到错误:
ValueError: operands could not be broadcast together with shapes (2) (1404)
这是data.npy的链接。