作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试拟合此 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。
任何帮助都会很棒。
谢谢
最佳答案
您需要提供良好的初始猜测,而不是为超出范围的区域强制返回高值。此外,模式缺少偏移参数,抛物面符号错误。将模型更改为:
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]
以及与数据的完美匹配:
关于python - 抛物面(3D抛物线)曲面拟合python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26152222/
我正在尝试拟合此 x 数据:[0.4,0.165,0.165,0.585,0.585],此 y 数据:[.45, .22, .63, .22, .63] 和此 z 数据: [1, 0.99, 0.98
我是一名优秀的程序员,十分优秀!