python用函数绘制椭圆_python – 通过轨道数据拟合椭圆

我为它绕太阳运行的行星的(x,y,z)坐标生成了一堆数据.现在我想通过这些数据拟合椭圆.

我试图做的:

我基于五个参数创建了一个虚拟椭圆:半长轴&定义尺寸和偏差的偏心率形状和三个旋转椭圆的欧拉角.由于我的数据并不总是以原点为中心,因此我还需要翻译需要额外三个变量(dx,dy,dz)的椭圆.

一旦我用这八个变量初始化这个函数,我就得到了这个椭圆上的N个点. (N =我绘制椭圆的数据点数)

我计算这些虚拟点与实际数据的偏差,然后使用一些最小化方法最小化该偏差,以找到这八个变量的最佳拟合值.

我的问题在于最后一部分:最小化偏差并找到变量的值.

为了最大限度地减少偏差,我使用scipy.optimize.minimize来尝试近似最佳拟合变量,但它只是做得不够好:

我最好的一个看起来像是Here is an image,这是一个非常慷慨准确的初始猜测. (蓝色=数据,红色=适合)

简而言之,我使用这个scipy函数:

initial_guess = [0.3,0.2,0.1,0.7,3,0.0,-0.1,0.0]

bnds = ((0.2, 0.5), (0.1, 0.3), (0, 2*np.pi), (0, 2*np.pi), (0, 2*np.pi), (-0.5,0.5), (-0.5,0.5), (-0.3,0.3)) #reasonable bounds for the variables

result = optimize.minimize(deviation, initial_guess, args=(data,), method='L-BFGS-B', bounds=bnds, tol=1e-8) #perform minimalisation

semi_major,eccentricity,inclination,periapsis,longitude,dx,dy,dz = result["x"]

要最小化此错误(或偏差)功能:

def deviation(variables, data):

"""

This function calculates the cumulative seperation between the ellipse fit points and data points and returns it

"""

num_pts = len(data[:,0])

semi_major,eccentricity,inclination,periapsis,longitude,dx,dy,dz = variables

dummy_ellipse = generate_ellipse(num_pts,semi_major,eccentricity,inclination,periapsis,longitude,dz,dy,dz)

deviations = np.zeros(len(data[:,0]))

pair_deviations = np.zeros(len(data[:,0]))

# Calculate separation between each pair of points

for j in range(len(data[:,0])):

for i in range(len(data[:,0])):

pair_deviations[i] = np.sqrt((data[j,0]-dummy_ellipse[i,0])**2 + (data[j,1]-dummy_ellipse[i,1])**2 + (data[j,2]-dummy_ellipse[i,2])**2)

deviations[j] = min(pair_deviations) # only pick the closest point to the data point j.

total_deviation = sum(deviations)

return total_deviation

(我的代码可能有点乱,而且效率低,我是新手)

我可能在编码中犯了一些逻辑错误,但我认为它归结为scipy.minimize.optimize函数.我不知道它是如何工作的以及对它的期望.我还建议在处理这么多变量时尝试马尔可夫链蒙特卡罗.我确实看了一下司仪,但现在它已经超出了我的脑海.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值