【问题标题】:Dealing with consecutive angles near 2*pi (360 deg) in Python在 Python 中处理 2*pi(360 度)附近的连续角度
【发布时间】:2018-04-15 22:24:18
【问题描述】:

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

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

if( T2_1 == min(T2_1,T2_2,T2_3,T2_4,T2_5,T2_6) and 
   T2_2 == min(T2_2,T2_3,T2_4,T2_5,T2_6) and
   T2_3 == min(T2_3,T2_4,T2_5,T2_6) and
   T2_4 == min(T2_4,T2_5,T2_6) and
   T2_5 == min(T2_5,T2_6) ):
      M1 = 1e3 #Penalty 

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

我获得了结果,但我限制了解决方案并且最小化不起作用

任何建议都会有所帮助

感谢您的阅读

编辑,澄清:

这是一个创建四杆机构的优化问题,角度代表四杆机构中杆的不同位置角度。我对该栏的相对位置感兴趣。

我的意思是从最低到最高的连续角度,但请记住,如果角度从 2*pi(第 4 象限)附近开始并继续变化到第 1 象限,那就是有效的解决方案。 示例:6.0, 6.1, 0.1, 0.2, 0.3, 0.5 [rad] 是连续角度,因为我对相对位置感兴趣,在这种情况下 0.1rad 实际上意味着0.1+2*PI0.2rad其实就是0.2+2*PI0.3rad 实际上表示 0.3+2*PI,而 0.5rad 实际上表示 0.5+2*PI

如果我使用上述操作分析值,那么它会受到惩罚,因为 T2_1=6.0 不是这些值中的最小值(可能是角度但不是小数)。请记住,这些值是从 0 - 2PI 随机生成的,0.1rad 的值可能意味着 0.1rad0.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] - 有效

在编写编辑时,我意识到连续角度之间的差异必须有一个最大值;如果不是这样,每个角度都可能是另一个连续的角度,这会产生很大的跳跃。所以,也许我需要研究一下角度可以做出的最大跳跃。但是,我需要脚本来确定任何角度 Xrad 是否意味着 XradX+2*Pi rad

我正在检查一个答案,因为我认为它可能会起作用。

对于这个复杂的问题,我很抱歉,这是一项正在进行的工作,我知道我需要进行更多调查,但我被 2*PI 附近的连续角度困住了,找不到任何地方的解决方案。

【问题讨论】:

  • 目前还不清楚你在用这些角度做什么。 “连续角”是什么意思?但这里的答案可能会有所帮助:stackoverflow.com/questions/1878907/…
  • 欢迎来到 StackOverflow。您的问题清晰易懂非常重要。正如已经问过的,“连续角”是什么意思?请阅读并关注FAQHow to Ask
  • “其中一个限制是角度必须是连续的角度。”如果6, 6.1, 0.1, 0.2 是连续的(序列通过0 弧度),那么6, 0.1, 6.1, 0.2 也是连续的(序列通过0 弧度两次)。 Post 需要对连续角度进行更严格的定义以消除任何序列。
  • 我添加了一些说明。此时我正在尝试根据象限进行比较,如果第一个值在 3*Pi/22*PI 之间开始,则添加 2Pi 如果出现在第一象限,则到下一个

标签: python math trigonometry angle


【解决方案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 

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

在前 3 个象限中,只是检查该值是否是序列(数组)中下一个角度的最小值,如果它是好的,它不会受到惩罚。当条形图旋转且角度位于 4th 象限时,只要所有角度都在 4th 25美分硬币。 当条形在 4th 象限中的某个角度且以下任一角度对应于 1st 象限时,它添加 2PI(在while loop) 到那个角度,然后比较。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-04
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多