【问题标题】:How to find the equation for an ellipse如何找到椭圆的方程
【发布时间】:2017-06-24 21:51:38
【问题描述】:

我正在寻找使用圆锥的一般方程给定五个或六个点的椭圆方程: A x2 + B xy + C y2 + D x + E y + F = 0。

起初我尝试使用六个点。这是我的python代码:

    import numpy as np
    def conic_section(p1, p2, p3, p4, p5, p6):
        def row(point):
            return [point[0]*point[0], point[0]*point[1], point[1]*point[1],                         
            point[0], point[1], 1]
        matrix=np.matrix([row(p1),row(p2),row(p3),row(p4),row(p5), row(p6)])
        b=[0,0,0,0,0,0]
        return np.linalg.solve(matrix,b)

    print conic_section(np.array([6,5]), np.array([2,9]), np.array([0,0]),         
    np.array([11, 5.5]), np.array([6, 7]), np.array([-1,-1]))

问题是这将返回解 [0,0,0,0,0,0],因为我的等式右侧是零向量。

然后我尝试通过减去 F 并将其除以来更改圆锥:

A x2 + B xy + C y2 + D x + E y + F = 0

A x2 + B xy + C y2 + D x + E y = -F

A' x2 + B xy + C' y2 + D' x + E' y = -1。

这不起作用的原因是,如果我的观点之一是 (0,0),那么我最终会得到一个有一行零的矩阵,但等式的右手边会向量中的条目为 -1。换句话说,如果我的一个点是(0,0) - 那么“F”应该是0,所以我不能把它分开。

任何帮助将不胜感激。 谢谢。

【问题讨论】:

  • 分不出来是什么意思?线性代数完全有能力处理这个问题。给定六个点独立,并且在椭圆上,系统可以解方程。
  • 请提供造成麻烦的六点。
  • 如果椭圆有任何点接触原点,则其方程中的 F 值等于 0。:) 在这种情况下,如果你有一个没有椭圆的椭圆,我认为你不能使用这种方法一个常数。如果我错了,请有人纠正我。
  • 如果 F=0 则不能将方程除以 F,因为不能除以零。五个不起作用的点只是列出的前五个:np.array([6,5])、np.array([2,9])、np.array([0,0])、np.array ([11, 5.5]), np.array([6, 7]).
  • 如果你知道你有一个椭圆(而不是一个更一般的圆锥截面),A 必须是非零的。由于您可以通过任意工厂缩放AF,因此您可以在您的线性方程组中添加一个额外的约束A = 1(如果您有六个点,则删除其中一个;五个足以确定圆锥)。

标签: python math linear-algebra ellipse


【解决方案1】:

您似乎在椭圆上有精确的点,不需要近似值,并以某种奇怪的方式将 Braikenridge-Maclaurin 构造用于圆锥截面。

五点(x[i],y[i]) 用这个显式方程确定椭圆 (mathworld page, eq. 8)

所以要找到椭圆方程,你可以为第一行的未成年人建立行列式的cofactor expansion。例如,系数A是从x1y1到右下角的子矩阵的行列式值,系数B是没有xiyi列的子矩阵的行列式取反值等等。

【讨论】:

    【解决方案2】:

    椭圆方程(没有平移和旋转):

    目标是在变量AF 中求解这个线性方程

    用途:

    from math import sin, cos, pi, sqrt
    
    import matplotlib.pyplot as plt
    import numpy as np
    from numpy.linalg import eig, inv
    
    # basis parameters of the ellipse
    a = 7
    b = 4
    
    def ellipse(t, a, b):
        return a*cos(t), b*sin(t)
    
    points = [ellipse(t, a, b) for t in np.linspace(0, 2*pi, 100)]
    x, y = [np.array(v) for v in list(zip(*points))]
    
    fig = plt.figure()
    plt.scatter(x, y)
    plt.show()
    
    def fit_ellipse(x, y):
        x = x[:, np.newaxis]
        y = y[:, np.newaxis]
        D =  np.column_stack((x**2, x*y, y**2, x, y, np.ones_like(x)))
        S = np.dot(D.T, D)
        C = np.zeros([6,6])
        C[0, 2] = C[2, 0] = 2
        C[1, 1] = -1
        E, V = eig(np.dot(inv(S), C))
        n = np.argmax(np.abs(E))
        return V[:, n]
    
    A, B, C, D, E, F = fit_ellipse(x, y)
    K = D**2/(4*A) + E**2/(4*C) - F
    
    # a, b
    print('a:', sqrt(K/A), 'b:', sqrt(K/C))
    

    输出:

    a:6.999999999999998 b:4.0

    见:

    http://mathworld.wolfram.com/ConicSection.html https://fr.wikipedia.org/wiki/Ellipse_(math%C3%A9matiques)#Forme_matricielle http://nicky.vanforeest.com/misc/fitEllipse/fitEllipse.html

    【讨论】:

    • 方程在未知数中线性的,它们是AF。 OPs 问题源于这些是齐次线性方程。
    猜你喜欢
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多