我想«二次曲面»比«平面»更正确。在
问题是拟合z=ax^2+by^2+cxy+dx+ey+f
到给定的点集P
你需要通过公式来计算剩余距离。在
对于每个3D点,p的残差为
| p|2–ap_0^2+bp|1^2+c*p_0*p|1+dp|0+ep|
你需要最小化所有的残差,即它们的平方和,可变参数a…f
下面的代码在技术上应该可以解决上述问题。但是,拟合问题是多极值的,如果没有良好的起点和全局搜索,这种方法可能无法找到正确的参数集。在import numpy
import scipy.optimize
P = numpy.random.rand(3,10) # given point set
def quadratic(x,y, a, b, c, d, e, f):
#fit quadratic surface
return a*x**2 + b*y**2 + c*x*y + d*x + e*y + f
def residual(params, points):
#total residual
residuals = [
p[2] - quadratic(p[0], p[1],
params[0], params[1], params[2], params[3], params[4], params[5]) for p in points]
return numpy.linalg.norm(residuals)
result = scipy.optimize.minimize(residual,
(1, 1, 0, 0, 0, 0),#starting point
args=P)