抛物面(3D抛物线)表面拟合python

时间:2014-10-01 23:22:36

标签: python optimization numpy scipy curve-fitting

我正在尝试拟合这个x数据:[0.4,0.165,0.165,0.585,0.585],这个y数据:[。45,。22,.63,。22,.63],这个z数据: [1,0.99,0.98,0.97,0.96]为抛物面。我正在使用scipy的curve_fit工具。这是我的代码:

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 < .16 or b > .58  or c < .22 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)

我试图将抛物面中心放在.16和.58(x轴)之间以及.22和.63(y轴)之间。如果b或c超出此范围,我会通过返回一个大值来执行此操作。

不幸的是,这种方式很合适,我的popt值都是1,而我的pcov是inf。

任何帮助都会很棒。

谢谢

1 个答案:

答案 0 :(得分:4)

您需要提供良好的初始猜测,而不是强制超出范围区域的高返回值。此外,该模式缺少偏移参数,抛物面具有错误的符号。将模型更改为:

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

我将偏移量修复为1.0,因为如果将其添加为适合参数,则系统将是欠定的(数据点的数量少于或等于拟合参数)。 使用这样的初始猜测来调用curve_fit

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

这会产生:

[ 1.68293045  0.31074135  2.38822062  0.36205424]

与数据很好的匹配:

enter image description here