2017-07-06 48 views
0

我有一個角度,形成一個完整的轉角陣列x,從-90到270 (可以用其他方法定義,如0到360或-180到180),步驟1或其他。使用asin函數將完整轉角x角度值映射到半圈,如何將它們鏡像回來?

asin功能有效只有在-90和+90之間。

因此,角度< -90或> 90將被「映射」在這些值之間。

E.g. y = some_asin_func(over_sin(x))將以始終在-90和+90之間的y值結束。所以y卡在-90到+90之間。

我需要檢索到X-輸入y相關的,因爲它是曖昧尚未:例如,該功能在(x)可以得到同樣的yx = 120x = 60,或x = -47x = 223。這不是我想要的。
換一種方式;我需要y作爲x做了一個完整的轉變,範圍從x開始到x結束。

的圖像會更好:

original_curves1

這裏,之間-90(左)x範圍至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) 

再次,圖的第一左半部分是完全正確的。 右半也是它的行爲是正確的,但在決賽中,在這裏,它必須在位置y=+90x>90鏡像約一個水平軸,像這樣:

wanted_curves1

也就是說,它的功能等被鏡像約Y = -90Y = + 90y其中x超出該範圍的[-90,+ 90],只有其中其中x在該範圍[-90,+ 90]的。

未鏡它的有效外[-90,+ 90]範圍:
y=-90其中y低於-90
y=+90其中y大於90

當然,每完成一次模數。

這裏的其它例子,其中x範圍從-180到180和所需的行爲:

然而:

original_curves2

尋求:

wanted_curves2

我有第一現在測試了一些簡單的東西:

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

不工作在所有但我認爲背景思想是有...
我想這可能是某種模招的,但不能弄明白。

+0

我不太清楚,如果我明白你想要做什麼。你是否希望單位圓上的x-y對作爲極座標中角度的函數? –

+0

背景可以看作是我想根據它在相對於北方的赤道平面上的角度檢索一個恆星的方位角(在水平面上測量)。所以我需要根據完整的其他0-360個x值的函數檢索完整的0-360個y值。 –

+0

我是否正確理解問題的核心:您是否想要像第二個圖表中那樣定義曲線? – kazemakase

回答

0

謝謝@Thomas庫恩看來,除了罰款我想要在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] 

這裏有一些預期的結果:

Results1

範圍從-180到+180

Results1

範圍從0到+360

Results3

範圍從-720到720

Results4

範圍從-360到+360一些不同A值。

有趣的是,它讓我想起了一些電子圖表。
週期性現象無處不在!

+0

請參閱我的答案的編輯 –

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]結果看起來是這樣的:

result of the given code

需要注意的是,你可以得到pinumpy,這樣你就不需要導入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() 

結果現在看起來是這樣的:

updated figure