2017-07-06 1 views
0

私はアレイ内で完全なターンを形成する角度を持っています。x、-90から270までです。 (0から360または-180から180までのように、別の方法で定義することができます)。完全な回転角度値は、関数asinを使用して半回転にマップされます。どのようにそれらをミラーリングするのですか?

asin機能は有効です -90と+90の間です。

したがって、角度< -90または> 90は、これらの値の間に "マップ"されます。

など。 y = some_asin_func(over_sin(x))は、常に-90〜+90の間の値であるyになります。だからyは-90と+90の間に詰まっています。それはまだ曖昧だから

私は、どの入力をxに関連するyで取得する必要があります:例えば、機能オーバー(x)はx = 120x = 60、またはx = -47x = 223に同じy値が得られます。それは私が望むものではありません。
他の方法を使用してください。私はxがどこから始まり、xが終わるところまでxのように完全に曲がるyが必要です。

画像が良くなる:270(グラフの右側)へここ

original_curves1

、-90(左)との間の範囲x
曲線の有効部分は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

、それは機能のようなものです[-90、+ 90]約Y = -90 xが範囲外であるyためY = + 90 [-90、+ 90]ミラーとxが範囲外である場合にのみここれます。

Iが有効[-90、+ 90]の範囲外で非ミラーたい:
y=-90yy=+90yが+90

よりも大きいより-90
低い場合

もちろん、それぞれの完全なターンをモジュロにします。ここ

他の例ここx -180から180の範囲であり、所望の挙動:まだ

original_curves2

募集:

wanted_curves2

Iが最初に持っていますいくつか簡単なことを今までテストした:

すべて
を動作しますが、私は、バックグラウンドのアイデアがあると思いません
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

質問の中核を正しく理解していますか?2番目のグラフのように曲線を定義しますか? – kazemakase

答えて

0

はあなたに@Thomasキューンありがとう、それは私を除いて罰金ですy値に関して1回の同じターンで関数を制限したいと考えました。とにかく、それは唯一の美学です。

ここに私が私の側で見つけたものがあります。それは多分、完璧ではないのですが、それは動作します:-180から+180 0から

Results1

範囲に

Results1

範囲:ここで

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] 

は、いくつかの予想される結果であります+360

Results3

範囲-720から-360からいくつかの異なるA値の360までの範囲

Results4

720へ。

面白いことに、エレクトロニクスの図を思い出させるのは面白いことです。
定期的な現象はどこにでもあります!

+0

私の答えの編集を見てください –

1

offsetx値に基づいてsign補正を計算することによって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]のための結果は以下のようになります。あなたがmathをインポートする必要はありませんので、あなたは、numpyからもpiを得ることができます

result of the given code

注 - 私が変更されましたそれに応じてコード。

EDIT: 明らかに、私は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

関連する問題