【问题标题】:Complete turn x angle values are mapped to half turn using asin function, how to mirror them back?使用 asin 函数将完整的转弯 x 角度值映射到半转弯,如何将它们镜像回来?
【发布时间】:2017-07-06 09:35:16
【问题描述】:

我的角度在数组x 中形成一个完整的转弯,从 -90 到 270,例如(它可以以其他方式定义,例如从 0 到 360 或 -180 到 180)与步骤 1 或其他。

asin 函数在 -90 和 +90 之间有效。

因此,角度 90 将在这些值之间“映射”。

例如y = some_asin_func(over_sin(x)) 最终会得到一个始终介于 -90 和 +90 之间的 y 值。所以y 卡在 -90 和 +90 之间。

我确实需要检索与 y 相关的 x-input,因为它尚不明确:例如,函数 over (x) 将为 x = 120 和 @987654339 提供相同的 y 值@,或x = -47x = 223。这不是我想要的。
换一种方式;我需要yx 那样完成一个完整的转弯,从x 的开始位置到x 的结束位置。

图片会更好:

这里,x 的范围在 -90(左侧)到 270(图表右侧)之间。
曲线的有效部分在x=-90x=+90 之间(图表的左半部分)。
所有其他值都类似于 y=90 或 y=-90 的镜像。
例如x=180,我得到了y=0,它应该是y=180
对于x=270,我有y=-90,但它应该是y=270,因此是+360。

这是一个代码示例:

A   = 50 # you can make this value vary to have different curves like in the images, when A=0 -> shape is triangle-like, when A=90-> shape is square-like.
x   = np.linspace(-90,270,int(1e3))
u   = np.sin(math.pi*A/180)*np.cos(math.pi*x/180)
v   = 180*(np.arcsin(u))/math.pi
y   = 180*np.arcsin(np.sin(math.pi*x/180)/np.cos(math.pi*v/180))/math.pi
plt.plot(x,y)
plt.grid(True)

再一次,图表的左前半部分是完全正确的。 右半部分的行为也是正确的,但最终,在这里,当x>90 时,它必须在位置y=+90 处围绕水平轴镜像,如下所示:

也就是说,对于y,就像函数是关于 y=-90y=+90 的镜像,其中 x 超出范围 [ -90,+90] 并且仅在 x 超出范围 [-90,+90] 的情况下。

我想在有效的 [-90,+90] 范围之外取消镜像它:
关于y=-90 其中y 低于-90
关于y=+90 其中y 大于+90

当然,还要对每个完整的回合取模。

这是另一个示例,其中 x 的范围从 -180 到 180 以及所需的行为:

然而:

通缉:

我现在先测试了一些简单的东西:

A = 50
x = np.linspace(-180,180,int(1e3))
u = np.sin(math.pi*A/180)*np.cos(math.pi*x/180)
v = 180*(np.arcsin(u))/math.pi 
y = 180*np.arcsin(np.sin(math.pi*x/180)/np.cos(math.pi*v/180))/math.pi
for i,j in np.ndenumerate(x):
    xval = (j-180)%180-180
    if (xval < -90):
        y[i] = y[i]-val
    elif (xval > 90):
        y[i] = y[i]+val

plt.plot(x,y);
plt.grid(True)
plt.show()

这根本不起作用,但我认为背景想法是存在的......
我猜这可能是某种取模技巧,但无法弄清楚。

【问题讨论】:

  • 我不太确定我是否理解您要做什么。您希望单位圆上的 x-y 对作为极坐标中角度的函数吗?
  • 可以看到背景,就像我想根据它在赤道平面上相对于北方移动的角度来检索一个恒星方位角(在水平面上测量)。所以我需要根据完整的其他 0-360 x 值的函数来检索完整的 0-360 y 值。
  • 我是否正确理解了问题的核心:您想定义第二张图中的曲线吗?
  • 是的,确实,就像第二张图一样,与输入值的范围无关。结果应显示完整的 360 度转弯变化。

标签: python numpy angle


【解决方案1】:

这里有一个解决方案,它通过基于x 值计算offsetsign 校正来修复cos 函数“蛮力”的周期性。我确信那里有更好的东西,但我几乎需要一张包含所涉及的角度和距离的图。

from matplotlib import pyplot as plt
import numpy as np

fig, ax = plt.subplots(1,1, figsize=(4,4))

x = np.linspace(-540,540,1000)
sign = np.sign(np.cos(np.pi*x/180))
offset = ((x-90)//180)*180

for A in range(1,91,9):

    u   = np.sin(np.pi*A/180)*np.cos(np.pi*x/180)
    v   = 180*(np.arcsin(u))/np.pi
    y   = 180*np.arcsin(np.sin(np.pi*x/180)/np.cos(np.pi*v/180))/np.pi
    y   = sign*y + offset

    ax.plot(x,y)

ax.grid(True)
plt.show()

[-540, 540] 区间的结果如下所示:

请注意,您也可以从numpy 获取pi,因此您无需导入math——我相应地更改了代码。

编辑: 显然,我首先稍微误解了 OP 的期望输出。如果offset的计算只是稍作改动,结果如要求:

from matplotlib import pyplot as plt
import numpy as np

fig, ax = plt.subplots(1,1, figsize=(4,4))

x = np.linspace(-720,720,1000)
sign = np.sign(np.cos(np.pi*x/180))
offset = ((x-90)//180 +1 )*180 - ((x-180)//360+1)*360

for A in range(1,91,9):

    u   = np.sin(np.pi*A/180)*np.cos(np.pi*x/180)
    v   = 180*(np.arcsin(u))/np.pi
    y   = 180*np.arcsin(np.sin(np.pi*x/180)/np.cos(np.pi*v/180))/np.pi
    y   = sign*y + offset

    ax.plot(x,y)

ax.grid(True)
plt.show()

结果现在看起来像这样:

【讨论】:

    【解决方案2】:

    谢谢@Thomas Kühn,这似乎很好,只是我想在 y 值方面将函数限制在同一个回合中。无论如何,这只是美学。

    这是我在身边发现的。它可能并不完美,但它确实有效:

    A = 50
    u = np.sin(math.pi*A/180)*np.cos(math.pi*x/180)
    v = 180*(np.arcsin(u))/math.pi
    y = 180*np.arcsin(np.sin(math.pi*x/180)/np.cos(math.pi*v/180))/math.pi
    for i,j in np.ndenumerate(x):
        val = (j-180)%360-180
        if (val < -90):
            y[i] = -180-y[i]
        elif (val > 90):
            y[i] = 180-y[i]
    

    以下是一些预期结果:

    范围从 -180 到 +180

    范围从 0 到 +360

    范围从 -720 到 +720

    范围从 -360 到 +360,有一些不同的 A 值。

    有趣的是,它还让我想起了一些电子图表。
    周期性现象无处不在!

    【讨论】:

      猜你喜欢
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      相关资源
      最近更新 更多