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

Posted

技术标签:

【中文标题】抛物面(3D抛物线)曲面拟合python【英文标题】:Paraboloid (3D parabola) surface fitting python 【发布时间】:2014-11-26 22:25:40 【问题描述】:

我正在尝试拟合这个 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)

我试图将抛物面居中在 0.16 和 0.58(x 轴)之间以及 0.22 和 0.63(y 轴)之间。如果 b 或 c 超出此范围,我会通过返回一个较大的值来做到这一点。

不幸的是,合身太差了,我的 popt 值都是 1,我的 pcov 是 inf。

任何帮助都会很棒。

谢谢

【问题讨论】:

【参考方案1】:

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

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]

和数据很好的匹配:

【讨论】:

以上是关于抛物面(3D抛物线)曲面拟合python的主要内容,如果未能解决你的问题,请参考以下文章

曲面抛物方程的质量集中法

python 用 matplotlib 在 3D 空间绘制 二次抛物面 实例详解

二次曲面~

NURBS曲线与曲面

复杂算法双向树 - 分类抛物线 3D 运动 [关闭]

代数53 ----常见二次曲面