【发布时间】: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 = -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,就像函数是关于 y=-90 和 y=+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 度转弯变化。