Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
椭圆拟合以确定旋转(Python)_Python_Ellipse_Data Fitting - Fatal编程技术网

椭圆拟合以确定旋转(Python)

椭圆拟合以确定旋转(Python),python,ellipse,data-fitting,Python,Ellipse,Data Fitting,我正在寻找适合椭圆的一些数据点,我有 我想要的是:使用椭圆确定数据的旋转角度 数据:我的数据是极坐标(θ,r) 目前的算法是: 定义残差和残差的雅可比矩阵 使用scipy optimize.leastsq (以下是相关人员的演练) 然而,在我的数据集上,偏心率为负值,如果它是椭圆(0

我正在寻找适合椭圆的一些数据点,我有

我想要的是:使用椭圆确定数据的旋转角度

数据:我的数据是极坐标(θ,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))