使用 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 = 120
和 x = 60
或 x = -47
和 x = 223
的值。这不是我想要的。
换一种方式;我需要 y
像 x
那样完成一个完整的转弯,从 x
开始的地方到 x
结束的地方。
有图更好:
此处,x
介于 -90(左侧)到 270(图表右侧)之间。
曲线的有效部分在 x=-90
和 x=+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=-90 和 y=+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
值。
有趣的是,它还让我想起了一些电子图。
周期现象无处不在!
我的角度在数组 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 = 120
和 x = 60
或 x = -47
和 x = 223
的值。这不是我想要的。
换一种方式;我需要 y
像 x
那样完成一个完整的转弯,从 x
开始的地方到 x
结束的地方。
有图更好:
此处,x
介于 -90(左侧)到 270(图表右侧)之间。
曲线的有效部分在 x=-90
和 x=+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=-90 和 y=+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
值。
有趣的是,它还让我想起了一些电子图。
周期现象无处不在!