使用 asin 函数将完整的旋转 x 角度值映射到半旋转,如何将它们镜像回来?

Complete turn x angle values are mapped to half turn using asin function, how to mirror them back?

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

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

因此,这些值之间的角度 < -90 或 > 90 将是 "mapped"。

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

我确实需要检索哪个 x 输入与 y 相关,因为它还不明确:例如,函数 over (x) 将给出相同的 y x = 120x = 60x = -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=-90y=+90 的镜像 y其中 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()

根本行不通但我认为背景想法就在那里...
我想这可能是某种 取模技巧 但我想不出来。

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

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()

现在的结果是这样的:

谢谢@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 值。

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