在Python中处理2 * pi(360度)附近的连续角度

时间:2017-11-03 08:39:11

标签: python math trigonometry angle

我没有找到类似的主题,所以我要求

我正在处理机制的优化,我发现一堆变量作为长度,坐标和一些变量是0到2pi之间的角度。 其中一个限制是角度必须是连续的角度。我正在比较角度并在产生非连续角度时惩罚解决方案,但是当角度接近2 * pi时我会丢失,因为有效解是例如:6,6.1,0.1,0.2 [rad]。

{{1}}

我使用sort来对角度进行排序,但我需要脚本“理解”角度应该是连续的,这样我需要惩罚值将其添加到我想要优化的函数中。

我获得了结果,但我限制了解决方案并且最小化无效

任何建议都会有所帮助

感谢您阅读

编辑,澄清:

这是创建四杆机构的优化问题,并且角度表示四杆机构中杆的不同位置角。我对那个酒吧的相对位置很感兴趣。

连续角度我的意思是从最低到最高,但要记住,如果角度开始接近 2 * pi (第四象限)并继续足以改变到第一象限,那就是有效解决方案示例:6.0,6.1,0.1,0.2,0.3,0.5 [rad] 是连续角度,因为我对相对位置感兴趣,在这种情况下 0.1rad 实际意味着的 0.1 + 2 * PI ; 0.2rad 实际上意味着 0.2 + 2 * PI ; 0.3rad 实际上意味着 0.3 + 2 * PI 0.5rad 实际意味着 0.5 + 2 * PI

如果我通过上述操作分析值,则会收到惩罚,因为 T2_1 = 6.0 不是这些值中的最小值(可能是角度但不是小数)。请注意,这些值是从 0 - 2PI 中随机生成的,值 0.1rad 可能意味着 0.1rad 0.1+ 2 * Pi rad ,如上例所示。

其他情况:

  1. 0.5,1.0,1.5,2.0,2.2,2.5 [rad] - 有效(上述函数适用于此案例)
  2. 0.8,6.1,0.1,0.2,0.3,0.5 [rad] - 无效
  3. 0.5,1.0,1.5,6.0,2.2,2.5 [rad] - 无效
  4. 5.5,6.0,6.28,1.0,1.2,1.5 [rad] - 有效
  5. 在编写编辑时,我意识到连续角度之间的差异必须最大;如果不是这样,每个角度都可以是另一个角度的连续角度。所以,也许我需要研究角度可以达到的最大跳跃。但是,我需要脚本来确定是否有任何角度 Xrad 意味着 Xrad X + 2 * Pi rad

    我正在检查其中一个答案,这些答案指出我使用角度的不同,因为我觉得它可能有效。

    我很抱歉这个复杂的问题,这是一项正在进行中的工作,我知道我需要更多的调查,但我仍然坚持在 2 * PI 附近的连续角度,并且找不到解决方案。

1 个答案:

答案 0 :(得分:1)

我得到了一个可以正常工作的解决方案,尽管可能有一个简单的替代方案来实现相同的

T2 = np.array([T2_1,T2_2,T2_3,T2_4,T2_5,T2_6])
M3 = 0
for i in range(6):
    T2 = np.array([T2_1,T2_2,T2_3,T2_4,T2_5,T2_6])
    if 0 <= T2[i] < 3*np.pi/2 and T2[i] == min(T2[i:]):
        M3=0
    elif (3*np.pi/2 <= T2[i] < 2*np.pi) and  all( T2[i:] == np.clip(T2[i:] , 3*np.pi/2, 2*np.pi) ) and (T2[i]== min(T2[i:])):
        M3=0
    elif 3*np.pi/2 <= T2[i] < 2*np.pi and any( T2[i:] == np.clip(T2[i:] , 0, 0.5*np.pi) ):
        k = i+1
        while k <= 5:
            if 0 <= T2[k] < np.pi/2:
                T2[k] = T2[k] + 2*np.pi
            k=k+1
        if T2[i] == min(T2[i:]):
            M3=0
        else:
            M3=1e4
    else:
        M3=1e4 

通过这个广泛的循环,我调整了条的旋转方向,在这种情况下,从较低的角度到较高的角度。

在前三个象限中只是检查该值是否为最小值与序列(数组)中的下一个角度,如果它是好的则不会受到惩罚。旋转条形并且角度在第4个象限时,只要所有角度都在第4个中,它就会比较该角度是否为最小角度与下一个角度25美分硬币。 当条形在第4个象限中成一定角度时,以下任何一个角度都对应第一个象限,它会添加 2PI (在while loop)到那个角度,然后进行比较。

作为结论,当第一个值不是最小值(正常整数比较)时,它会受到惩罚,当一个角度后面是一个完整的旋转时,它会将 2PI 添加到第一个象限中的角度。

for loop的开头,我重新启动了T2的值,因为我在while loop中更改了