Paraboloide (parábola 3D) de ajuste de superficie python

Estoy tratando de ajustar estos datos x: [0.4,0.165,0.165,0.585,0.585], estos datos y: [.45, .22, .63, .22, .63], y estos datos z: [1, 0.99, 0.98,0.97,0.96] a un paraboloide. Estoy usando la herramienta curve_fit de scipy. Aquí está mi código:

doex = [0.4,0.165,0.165,0.585,0.585] doey = [.45, .22, .63, .22, .63] doez = np.array([1, .99, .98,.97,.96]) def paraBolEqn(data,a,b,c,d): if b  .58 or c .63: return 1e6 else: return ((data[0,:]-b)**2/(a**2)+(data[1,:]-c)**2/(a**2)) data = np.vstack((doex,doey)) zdata = doez opt.curve_fit(paraBolEqn,data,zdata) 

Estoy tratando de centrar el paraboloide entre .16 y .58 (eje x) y entre .22 y .63 (eje y). Estoy haciendo esto devolviendo un valor grande si b o c está fuera de este rango.

Desafortunadamente, el ajuste está muy apagado y mis valores popt son todos 1, y mi pcov es inf.

Cualquier ayuda sería genial.

Gracias

En lugar de forzar valores de retorno altos para regiones fuera de rango, debe proporcionar una buena estimación inicial. Además, el modo carece de un parámetro de compensación y el paraboloide tiene el signo incorrecto. Cambie el modelo a:

 def paraBolEqn(data,a,b,c,d): x,y = data return -(((xb)/a)**2+((yd)/c)**2)+1.0 

Fijé el desplazamiento a 1.0 porque si se añadiera como parámetro de ajuste, el sistema estaría indeterminado (menos o igual número de puntos de datos que los parámetros de ajuste). Llame a curve_fit con una suposición inicial como esta:

 popt,pcov=opt.curve_fit(paraBolEqn,np.vstack((doex,doey)),doez,p0=[1.5,0.4,1.5,0.4]) 

Esto produce:

 [ 1.68293045 0.31074135 2.38822062 0.36205424] 

y un buen partido agradable a los datos:

introduzca la descripción de la imagen aquí