抛物面(3D 抛物线)曲面拟合 Python

4

我正在尝试将这些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)

我试图将抛物面在 x 轴 .16 到 .58 之间,在 y 轴 .22 到 .63 之间居中。为了做到这一点,如果 b 或 c 在此范围之外,我会返回一个较大的值。

不幸的是,适配效果非常差,我的 popt 值全部为 1,我的 pcov 是无穷大。

任何帮助都将不胜感激。

谢谢

1个回答

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接