两条线的交点。以下哪个方程式资源效率最高?

时间:2014-11-27 21:52:07

标签: python performance line intersection

在我的程序中,我需要找到两行相交的y值。

第一行表示为:y = a1 * x + b1 第二行用y = a2 * x + b2

表示

解决每个中的x,设置方程彼此相等,求解y和重新排列,我想出了四个不同但相当于(实际上尚未确定)的方程式:

  1. Y =(B1 / A1-B2 / A2)/(1 / A1-1 / a2)的

  2. Y =(B2 +(A2 / A1)* B1)/(1-A2 / A1)

  3. Y =(A1 * B2-B1 * A2)/(A1-A2)

  4. Y = A1 *((B2-B1)/(A1-A2))+ B1

  5. 现在,我运行了以下Python代码来检查所有方程式是否给出了相同的答案:

    import random
    
    def linearfunction(coords1,coords2):
        x1=coords1[0]
        x2=coords2[0]
        y1=coords1[1]
        y2=coords2[1]
        a=(y2-y1)/(x2-x1)
        b=y2-a*x2
        return [a,b]
    
    def doesitequal():
        first=[random.randint(0,100),random.randint(0,100)]
        second=[random.randint(0,100),random.randint(0,100)]
        third=[random.randint(0,100),random.randint(0,100)]
        fourth=[random.randint(0,100),random.randint(0,100)]
    
        a1=linearfunction(first,second)[0]
        b1=a1=linearfunction(first,second)[1]
        a2=linearfunction(third,fourth)[0]
        b2=linearfunction(third,fourth)[1]
    
        firstversion=(b1/a1-b2/a2)/(1/a1-1/a2)
        secondversion=(b2+(a2/a1)*b1)/(1-a2/a1)
        thirdversion=(a1*b2-b1*a2)/(a1-a2)
        fourthversion=a1*((b2-b1)/(a1-a2))+b1
    
        print('First equation: ', firstversion)
        print('Second equation:', secondversion)
        print('Third equation:', thirdversion)
        print('Fourth equation', fourthversion)
    
    for i in range(100):
        doesitequal()
    

    令人惊讶的是(对我而言),第二个等式总是返回一个稍微偏离其他值的值,这些值返回彼此完全相等的值。请亲自尝试看看我的意思。

    示例输出:

    First equation:  -71.13238078843175
    Second equation: -67.71148218281976
    Third equation: -71.13238078843175
    Fourth equation -71.1323807884317
    First equation:  190.62597809076678
    Second equation: 186.9640062597809
    Third equation: 190.6259780907668
    Fourth equation 190.62597809076686
    First equation:  81.93742601048538
    Second equation: 80.48246237104686
    Third equation: 81.93742601048537
    Fourth equation 81.93742601048537
    

    所以我的第一个问题是:

    为什么dos第二个等式返回的值略有不同?我弄乱了算术吗?或者是由于Python评估给定数学运算的方式?

    我的第二个问题是:

    这四个公式中哪个是效率最高的公式?也就是说,如果要在短时间内计算大量的线路交叉点,哪一个最不可能导致计算滞后?

    一个疯狂的猜测是效率与给定方程中的操作数成反比。例如,第一个等式涉及7个数学运算,而最后一个涉及5个,意味着最后一个比第一个更有效。然而,就复杂性和效率而言,不同的数学运算可能彼此不相等。这就是为什么我不确定这个问题的答案。

    非常感谢任何帮助!

1 个答案:

答案 0 :(得分:-1)

2. y=(b2+(a2/a1)*b1)/(1-a2/a1)

     a2 b1
b2 + -----
      a1
----------
      a2
  1 - --
      a1

(a2 b1 + a1 b2) / a1
--------------------
   (a1 - a2) / a1

a2 b1 + a1 b2
-------------
   a1 - a2

它将与eq.3(我使用的那个)进行比较

a2 b1 - a1 b2
-------------
   a2 - a1