N = 20
x = np.random.randn(N)
y = np.random.randn(N)
z = func([-3, -1, 2], [x, y]) + np.random.normal(size=N)
data = Data([x, y], z)
model = Model(func)
odr = ODR(data, model, [0.0, 0.0, 0.0])
odr.set_job(fit_type=0)
res = odr.run()
Y, X = np.mgrid[y.min():y.max():20j, x.min():x.max():20j]
Z = func(res.beta, [X, Y])
f = plt.figure()
pl = f.add_subplot(111, projection='3d')
pl.scatter3D(x, y, z)
pl.plot_surface(X, Y, Z, alpha=0.4)
Как оценить локальную касательную плоскость для трехмерных точек?