椭圆拟合以确定旋转(Python)
我正在寻找适合椭圆的一些数据点,我有 我想要的是:使用椭圆确定数据的旋转角度 数据:我的数据是极坐标(θ,r) 目前的算法是:椭圆拟合以确定旋转(Python),python,ellipse,data-fitting,Python,Ellipse,Data Fitting,我正在寻找适合椭圆的一些数据点,我有 我想要的是:使用椭圆确定数据的旋转角度 数据:我的数据是极坐标(θ,r) 目前的算法是: 定义残差和残差的雅可比矩阵 使用scipy optimize.leastsq (以下是相关人员的演练) 然而,在我的数据集上,偏心率为负值,如果它是椭圆(0
import numpy as np
from scipy import optimize
import pylab
def f(theta, p):
a, e = p
return a * (1 - e**2)/(1 - e*np.cos(theta))
def residuals(p, r, theta):
""" Return the observed - calculated residuals using f(theta, p). """
return r - f(theta, p)
def jac(p, r, theta):
""" Calculate and return the Jacobian of residuals. """
a, e = p
da = (1 - e**2)/(1 - e*np.cos(theta))
de = (-2*a*e*(1-e*np.cos(theta)) + a*(1-e**2)*np.cos(theta))/(1 -
e*np.cos(theta))**2
return -da, -de
return np.array((-da, -de)).T
def fit_ellipse(theta, r, p0 = (1,0.5)):
# Initial guesses for a, e
p0 = (1, 0.5)
plsq = optimize.leastsq(residuals, p0, Dfun=jac, args=(r, theta), col_deriv=True)
#return plsq
print(plsq)
pylab.polar(theta, r, 'o')
theta_grid = np.linspace(0, 2*np.pi, 200)
pylab.polar(theta_grid, f(theta_grid, plsq[0]), lw=2)
pylab.show()
fit_ellipse(theta, r, p0 = (1,0.5))
不需要非线性回归(如果不需要特定的拟合标准)。简单的线性回归得出以下结果: 符号和符号与等式一致。(15-23)从 另外:对评论的回答 用于绘制椭圆图的方程式为: 绘制椭圆的另一种方式(避免复杂的根)是:
参数θ必须从0变为2pi。看看。正如@jjacquelin所说,不需要非线性回归。谢谢@jjacquelin。你有你用来生成图形的代码吗?事实上没有代码。这是一个非常简单的数值演算,Mathcad就足够了。上图显示了sceen副本。没有别的了。这个图也是用Mathcad中实现的绘图工具绘制的。很抱歉,这对我来说并不简单。你先把坐标从极坐标转换成笛卡尔坐标了吗?什么是k和n?所有的微积分都在笛卡尔坐标系中,而不是在极坐标系中。n是点数。点的编号从k=1(点编号1,坐标x_1,y_1)到k=n(点编号n,坐标x_n,y_n)。杰奎林,绘制图形的方程式在大多数情况下似乎有效,但在某些情况下,平方根内的数字为负数,因此会引发错误。这正常吗?例如,x为84.48。
import numpy as np
from scipy import optimize
import pylab
def f(theta, p):
a, e = p
return a * (1 - e**2)/(1 - e*np.cos(theta))
def residuals(p, r, theta):
""" Return the observed - calculated residuals using f(theta, p). """
return r - f(theta, p)
def jac(p, r, theta):
""" Calculate and return the Jacobian of residuals. """
a, e = p
da = (1 - e**2)/(1 - e*np.cos(theta))
de = (-2*a*e*(1-e*np.cos(theta)) + a*(1-e**2)*np.cos(theta))/(1 -
e*np.cos(theta))**2
return -da, -de
return np.array((-da, -de)).T
def fit_ellipse(theta, r, p0 = (1,0.5)):
# Initial guesses for a, e
p0 = (1, 0.5)
plsq = optimize.leastsq(residuals, p0, Dfun=jac, args=(r, theta), col_deriv=True)
#return plsq
print(plsq)
pylab.polar(theta, r, 'o')
theta_grid = np.linspace(0, 2*np.pi, 200)
pylab.polar(theta_grid, f(theta_grid, plsq[0]), lw=2)
pylab.show()
fit_ellipse(theta, r, p0 = (1,0.5))