home / junkbox / hyp-func 双曲線関数

 普段あまりお目にかかりませんが、CORDICアルゴリズムで便利に使うことができます。 以下、「使えればいい」程度に書いているので、厳密性を要求しないでください。

双曲線

パラメタ表示と微分

パラメタ t の意味

テイラー展開

双曲線関数

加法定理

双曲線と座標系

双曲線航法

home / junkbox / hyp-func 双曲線

 XY平面上に2点FとF'を用意します。 XY平面上に点Pを考え、FPとF'Pの距離の差が常にdになるようにします。 このような点Pの集合のことを双曲線といいます。 今はFとF'を特に指定しませんでしたが、そのままだと面倒なので、出来上がった双曲線を回転・平行移動して、計算が楽になるようにします。 まずFF'間の中点が原点Oに一致するように平行移動して、さらにFF'がX軸と重なるように原点を中心に回転します。 このとき、FがX軸の正の方向に来るようにします。 そうするとF'はX軸の負の方向に来ます。 Fの座標が (f, 0) になったとすると、f > 0 で、F'の座標は (-f, 0) です。

 点Pを (x, y) とすると、双曲線の定義の意味しているところは |FP - F'P| = d ですので、

| sqrt { ( x + f )2 + y2 } - sqrt { ( x - f )2 + y2 } | = d

です。 ただし、| 〜 | は 〜 の絶対値、sqrt(〜) は 〜 の平方根(のうち正のもの)です。 これを絶対値も平方根もない形に変形してみます。 方針としてはまず2乗して絶対値とsqrtを外し、このときにsqrtの積が出てくるので、これを右辺に追いやってさらに2乗します。 つまり、全体では4乗するわけです。 ちょっとうんざりします。

| sqrt { ( x + f )2 + y2 } - sqrt { ( x - f )2 + y2 } | = d
※とりあえず両辺を2乗
[ sqrt { ( x + f )2 + y2 } - sqrt { ( x - f )2 + y2 } ]2 = d2
( x + f )2 + y2 + ( x - f )2 + y2 - 2 sqrt { ( x + f )2 + y2 } sqrt { ( x - f )2 + y2 } = d2
( x + f )2 + y2 + ( x - f )2 + y2 - 2 sqrt [ { ( x + f )2 + y2 } { ( x - f )2 + y2 } ] = d2
※新しく出てきた根号を右辺に追いやってさらに2乗
( x + f )2 + y2 + ( x - f )2 + y2 - d2 = 2 sqrt [ { ( x + f )2 + y2 } { ( x - f )2 + y2 } ]
{ ( x + f )2 + y2 + ( x - f )2 + y2 - d2 }2 = 4 { ( x + f )2 + y2 } { ( x - f )2 + y2 }
※ ( a + b ) ( a - b ) = a2 - b2 をうまく使って右辺を変形する
{ ( x + f )2 + y2 + ( x - f )2 + y2 - d2 }2 = 4 { x2 + f2 + y2 + 2fx } { x2 + f2 + y2 - 2fx }
{ ( x + f )2 + y2 + ( x - f )2 + y2 - d2 }2 = 4 { ( x2 + f2 + y2 )2 - 4f2x2 }
※左辺をばらして適当にまとめる
{ x2 + f2 + 2fx + y2 + x2 + f2 - 2fx + y2 - d2 }2 = 4 { ( x2 + f2 + y2 )2 - 4f2x2 }
{ 2 ( x2 + f2 + y2 ) - d2 }2 = 4 { ( x2 + f2 + y2 )2 - 4f2x2 }
※ ( x2 + f2 + y2 ) をまとめたまま変形すると、これがスッキリ消える
4 ( x2 + f2 + y2 )2 + d4 - 4 ( x2 + f2 + y2 ) d2 = 4 ( x2 + f2 + y2 )2 - 16f2x2
d4 - 4 ( x2 + f2 + y2 ) d2 = - 16f2x2
※ 左に x2・y2を、右に定数項を集める
d2 - 4 ( x2 + f2 + y2 ) = - 16f2x2 / d2
d2 - 4x2 - 4f2 - 4y2 = - 16f2x2 / d2
16f2x2 / d2 - 4x2 - 4y2 = 4f2 - d2
( 16f2 / d2 - 4 ) x2 - 4y2 = 4f2 - d2
( 16f2 - 4d2 ) x2 / d2 - 4y2 = 4f2 - d2
4 ( 4f2 - d2 ) x2 / d2 - 4y2 = 4f2 - d2
※ 両辺を 4f2 - d2 で割って、右辺を1にする。
4 x2 / d2 - 4y2 / ( 4f2 - d2 ) = 1

 ここで、a = d/2 、b = sqrt ( 4f2 - d2 ) / 2 と置けば、よく見慣れた x2/a2 - y2/b2 = 1 となり、さらに d = 2a で、

b2 = ( 4f2 - d2 ) / 4

= ( 4f2 - 4a2 ) / 4

= f2 - a2

f2 = a2 + b2

f = ±sqrt ( a2 + b2 )

なので、

x2 - y2 = 1
a2 b2

を満たす点 (x, y) の集合は、( ±sqrt ( a2 + b2 ) , 0 ) を焦点とし、焦点からの距離の差が 2a となる双曲線になる。

ことが分かります。

 この変形は自分で思いついたわけではありません。 このあたりを参考にしました。 高校数学の範囲のはずですが、高校のときは最後の事実だけ示されて、計算はやった覚えがないなぁ。 やはり変形が面倒だからでしょうか。

home / junkbox / hyp-func パラメタ表示と微分

 三角関数にならって、関数 x = f(t)、 y = g(t) を考え、 (x, y) が双曲線 x2 - y2 = 1 上にあるものとします。 円と違って双曲線はXY平面の左右に分かれてできますが、右半面だけを考えます。 したがって t = 0 のとき x = f(0) = 1 、 y = g(0) = 0 です。 これだけでは t が増えたときに (x, y) がどれくらい双曲線上を動くかが分からないので、やはり三角関数のときと同じように、とりあえず、 (x')2 + (y')2 = 1 と置いてみます。 ここで、 x' は x を t で微分したもの、つまり dx/dt です。 こうすると t が Δt だけ増えると、 (x, y) は双曲線の上を Δt だけ動きます(後でこれでは都合が悪いことが分かるのですが)。 また、t = 0 の近くでは t が増えると y が増加、つまり、 g'(0) > 0 とします。

 この場合、 f'(t)g'(t) はどうなるでしょう?

x2 - y2 = 1

2xx' - 2yy' = 0 (両辺をtで微分)

xx' = yy'

x2(x')2 = y2(y')2 (両辺を2乗)

x2(x')2 = ( x2 - 1 ) ( 1 - (x')2) ( x2 - y2 = 1 、 (x')2 + (y')2 = 1 より)

x2(x')2 = x2 - x2(x')2 - 1 + (x')2

ここで x2(x')2 が消えてほしいのですが、消えません。 うまく消すためには右辺の x2(x')2 の前が + にならないといけません。 そのためには、その前の右辺の x2 の前に負号をつけるか、 (x')2 の前の負号を + にするかですが、前者は双曲線の方程式から来ていて譲れませんから、後者、つまり、微分の関係式の (x')2 の前を - にしましょう。 つまり、 (y')2 - (x')2 = 1 とします。 すると、

x2(x')2 = y2(y')2

x2(x')2 = ( x2 - 1 ) ( (x')2 + 1 ) ( x2 - y2 = 1 、 (y')2 - (x')2 = 1 より)

x2(x')2 = x2(x')2 + x2 - (x')2 - 1

0 = x2 - (x')2 - 1

(x')2 = x2 - 1

(x')2 = y2 ( x2 - y2 = 1 より)

つまり、 x' = ±y だということが分かります。 今考えている双曲線はXY平面の右半面にあり、t = 0 の付近で t が増えると y が増加と約束したので、t が増えると (x, y) は上に向かって動いていきます。 したがって、y > 0 の領域では t が増えると x は増加、y < 0 の領域では t が増えると x は減少します。 つまり、y と x' の符合は一致するので、 x' = y が正解です。 あとは xx' = yy' なので、

xx' = yy'

xy = yy' x' = y より)

x = y' (両辺を y で割る)

なので、 y' = x です。 y が 0 だと「両辺を y で割る」ができませんが、y = 0 ならば x' = y = 0 ですから、 (y')2 - (x')2 = 1 と g'(0) > 0 から、すぐに y' = 1 だと分かります。 このときの x は 1 (XY平面の右側を考えているから x = -1 はありえない)なので、y = 0 のときも成り立っていることが分かります。 したがって、

f'(t) = g(t)

g'(t) = f(t)

で、2回微分すると元に戻り、あとは延々と微分できることになります。

home / junkbox / hyp-func パラメタ t の意味

 パラメタ t は何を意味しているのでしょう? 三角関数のときは (y')2 + (x')2 = 1 だったので、円周上の長さだと分かりました。 双曲線の場合は (y')2 - (x')2 = 1 なので、双曲線上の長さではないようです。 これを微小な量Δtを使って少し変形してみます。

(y')2 - (x')2 = 1

x y' - y x' = 1

x y'Δt - y x'Δt = Δt

ここで、x'Δt は t がΔt だけ動いたときの x の変化量、つまりΔx で、同様に y'Δt はΔy のことですから、結局こう書けます。

xΔy - yΔx = Δt

グラフを書いたとすれば、x・y・Δy・Δx はX軸あるいはY軸に平行な線分の長さと考えられます。 そう考えると、上の式は「長さ×長さ」になっているので、「何かの面積」を計算していて、それがΔt だけ増加する、ということを言ってそうです。 この4つの量が絡む面積は、x y、xΔy、yΔx、ΔxΔy の4つあります。 これを全部足すと ( x + Δx ) ( y + Δy ) になります。 これはこの式を展開してみればすぐに分かるでしょう。 そしてこれは横が ( x + Δx )、縦が ( y + Δy ) の長方形の面積です。 つまり、概ね双曲線の上にある点 ( x + Δx, y + Δy ) と原点を対角線とする長方形の面積です。

 ここから余計なもの・・・ x y と ΔxΔy ・・・を取り去り、さらに yΔx の2倍を引いたのが問題の式です。

Δt = xΔy - yΔx

= ( x + Δx ) ( y + Δy ) - x y - ΔxΔy - 2yΔx

しかし、yΔx の「2倍を引く」というのがピンときませんね。 「2倍」がピンとこないのなら、全体を2で割ってしまいましょう。 すると、長方形の面積だったものは三角形の面積になり、2倍だったものは長方形の面積になります。

Δt/2 = xΔy/2 - yΔx/2

= ( x + Δx ) ( y + Δy ) / 2 - x y / 2 - ΔxΔy / 2 - yΔx

原点と概ね双曲線上にある点 ( x + Δx, y + Δy ) を結んだ線分を斜辺とする直角三角形(外側の三角形)の面積から、やはり原点と双曲線上の点 ( x, y ) を結んだ線分を斜辺とする直角三角形(左下の三角形)、上記2点を結んだ線分を斜辺とする直角三角形(右上の小さな三角形)と、その下にできる長方形の面積を引いたものが、Δt/2 になることが分かります。 図を見ると分かるように、残った部分は原点、 ( x, y ) 、 ( x + Δx, y + Δy ) の3つの点を結んだ三角形の面積(上側の細長い三角形の面積)になります。

 つまり、t がΔt だけ増えると、双曲線上の点 ( x, y ) がその分だけ動きますが、この動いた分と原点を結んでできる図形の面積がΔt/2 だけ増える、ということです。 ということは、原点とX軸上の点 ( 1, 0 ) を結ぶ直線、 原点と双曲線上の点 ( x, y ) を結ぶ直線、X軸上の点 ( 1, 0 ) と ( x, y ) の間の双曲線に囲まれた図形の面積が t/2 になっています。 これがパラメタ t の意味です。 実際にはXY平面の下半分( y < 0 の部分)では符号が逆になるのでもう少し考える必要がありますが。

 ちなみに、三角関数の場合は x2 + y2 = 1 、 (x')2 + (y')2 = 1 、 x' = -y 、 y' = x という関係になっているので、 計算してみるとやはり xΔy - yΔx = Δt になります。 たとえば第一象限(x > 0・y > 0 の部分)では x' が負になるので、Δt > 0 に対してΔx が負になります。 したがって、同じような変形をすると、長方形 yΔx と三角形 ΔxΔy / 2 に対応する面積は引くのではなく足すことになります。

図にしてみると、足すものを全部足した時点で外側の四角形OABCの面積になり、そこから x y / 2、つまり三角形OABを引くことになるので、最終的には(極限をとると)原点と円周上の2つの点を結ぶ2つの線分、および同じ円周上の2点を結ぶ円弧で囲まれた面積(OBC)になることが分かります。 これも象限によって正負が変わってくるのでもう少し考える必要がありますが、 やはり原点とX軸上の点 ( 1, 0 ) を結ぶ直線、 原点と円周上の点 ( cos t, sin t ) を結ぶ直線、X軸上の点 ( 1, 0 ) と ( cos t, sin t ) の間の円弧に囲まれた図形の面積が t/2 になっています。

 もっとも、三角関数の場合は単位円の面積が πr2 = π で、単位円の円周が 2π、円弧の長さが t ですから、X軸・動径・円弧に囲まれた部分の面積は π・t/2π = t/2 とすぐに分かります。 いずれにせよ、三角関数でも双曲線でも、t/2 (の絶対値)がX軸・動径・曲線に囲まれた面積になり、両者で統一がとれています。

home / junkbox / hyp-func テイラー展開

  f'(t) = g(t)g'(t) = f(t) より、 f(t)g(t) も延々と微分できて、t = 0 のときの値が f(0) = 1 、 g(0) = 0 と分かっているので、

f(0) = 1 、 f'(0) = 0 、 f''(0) = 1 、 f'''(0) = 0 ・・・

g(0) = 0 、 g'(0) = 1 、 g''(0) = 0 、 g'''(0) = 1 ・・・

です。 したがって、テーラー展開すると以下のようになります。
f(t) = 1 + t2 + t4 +・・・
2 ! 4 !
g(t) = t + t3 + t5 +・・・
3 ! 5 !

 これと指数関数 et のテーラー展開

et = 1 + t + t2 + t3 + t4 + t5 +・・・
2 ! 3 ! 4 ! 5 !

を比べると、

et = f(t) + g(t)

だということが分かります。 さらに、テーラー展開の結果から、 f(-t) = f(t)g(-t) = -g(t) 、つまり、 f(t) は偶関数、 g(t) は奇関数なので、これはつまり、et を偶関数と奇関数に分けると、偶関数部分が f(t) で、奇関数部分が g(t) だということです。 また、e-t は、

e-t = f(-t) + g(-t)

= f(t) - g(t)

なので、 f(t)g(t) は et ・ e-t を使って以下のように書けます。

f(t) = et + e-t
2
g(t) = et - e-t
2

ちなみに、三角関数はこうでした:

ejt = cos t + j sin t
cos t = ejt + e-jt
2
sin t = ejt - e-jt
2j

ただし、j は虚数単位です。

home / junkbox / hyp-func 双曲線関数

 三角関数の cos・sin にならって x = f(t) のことを cosh t と書いて「双曲線余弦」、 y = g(t) のことを sinh t と書いて「双曲線正弦」、 また、y/x = sinh t / cosh t のことを tanh t と書いて「双曲線正接」と呼び、これらを合わせて「双曲線関数」と呼びます。 三角関数の後ろに「h」を付け加えた記号になっていますが、この「h」は「hyperbolic」(双曲線の)というの意味です。 英語でのフルスペルは「hyperbolic sine」のようになります。 いろんな読み方がありますが、「はいぱーぼりっくさいん」と読むのも長くて面倒なので、まぁ「さいんえいち」などと読んでおけば通じると思います。

sinh t = et - e-t
2
cosh t = et + e-t
2
tanh t = sinh t = et - e-t
cosh t et + e-t

cosh2 t - sinh2 t = 1

cosh 0 = 1

sinh 0 = 0

cosh (-t) = cosh t ※偶関数

sinh (-t) = - sinh t ※奇関数

tanh (-t) = - tanh t ※奇関数

d cosh t = sinh t
dt
d sinh t = cosh t
dt

ここで、cosh2 t などは、三角関数のときと同様、( cosh t )2 のことを示しています。

 双曲線関数は et の関数になっているので、et について解いて最後に対数をとると、適当な条件の下で t について解くことができます。 つまり、逆関数が求まります。 たとえば、E = et とすると、e-t = 1/E なので、tanh t = u とおいて、

tanh t = u =
sinh t = et - e-t
cosh t et + e-t
=
E - 1/E = E2 - 1
E + 1/E E2 + 1
( E2 + 1 ) u = E2 - 1
E2 u + u = E2 - 1
E2 u - E2 = - 1 - u
E2 ( u - 1 ) = - 1 - u
E2 ( 1 - u ) = 1 + u
E2 =
1 + u
1 - u
log E2 =
log
1 + u
1 - u
2 log E =
log
1 + u
1 - u
log E =
1 log
1 + u
2 1 - u
log et = t =
1 log
1 + u
2 1 - u

tanh t = u とおいたのですから、t = tanh-1 u です。 つまり、

tanh-1 u = 1 log
1 + u
2 1 - u
です。

 これを使うと、s = ( 1 + u ) / ( 1 - u ) とおけば、

s =
1 + u
1 - u
( 1 - u ) s = 1 + u
s - su = 1 + u
su + u = s - 1
u ( s + 1 ) = s - 1
u =
s - 1
s + 1

なので、

tanh-1 u =
1 log
1 + u
2 1 - u
tanh-1
s - 1
s + 1
=
1 log s
2
log s =
2 tanh-1
s - 1
s + 1

と書くことができます。つまり、双曲線関数は指数関数・対数関数で表現できますが、逆に、指数関数・対数関数を双曲線関数で表現することもできます。

ex = sinh x + cosh x
log x =
2 tanh-1
x - 1
x + 1

home / junkbox / hyp-func 加法定理

 cosh (α+β) = { eα+β + e- (α+β) } / 2、sinh (α+β) = { eα+β - e- (α+β) } / 2 なので、まず e±(α+β) を計算。

eα+β = eα eβ

= ( coshα+ sinhα) ( coshβ+ sinhβ)

= coshαcoshβ+ coshαsinhβ+ sinhαcoshβ+ sinhαsinhβ

e- (α+β) = e e は、奇関数である sinh がひとつだけある項の符号が逆になるので、

e- (α+β) = e e

= coshαcoshβ- coshαsinhβ- sinhαcoshβ+ sinhαsinhβ

このふたつの式を足し引きすることで、

eα+β = coshαcoshβ +coshαsinhβ +sinhαcoshβ +sinhαsinhβ
e- (α+β) = coshαcoshβ -coshαsinhβ -sinhαcoshβ +sinhαsinhβ
2 cosh (α+β) = eα+β + e- (α+β) = 2 coshαcoshβ +2 sinhαsinhβ
2 sinh (α+β) = eα+β - e- (α+β) = 2coshαsinhβ +2 sinhαcoshβ
cosh (α+β) = coshαcoshβ + sinhαsinhβ
sinh (α+β) = sinhαcoshβ + coshαsinhβ

 cosh (α-β)、sinh (α-β) は β を -β に置き換えて、そうすると sinhβ がある項だけ符号が逆になるので、

cosh (α-β) = coshαcoshβ - sinhαsinhβ

sinh (α-β) = sinhαcoshβ - coshαsinhβ

 tanh も欲しければ、

tanh (α+β) =
sinh (α+β)
cosh (α+β)
=
sinhαcoshβ + coshαsinhβ
coshαcoshβ + sinhαsinhβ
=
sinhαcoshβ/coshαcoshβ + coshαsinhβ/coshαcoshβ
coshαcoshβ/coshαcoshβ + sinhαsinhβ/coshαcoshβ
=
sinhα/coshα + sinhβ/coshβ
1 + sinhαsinhβ/coshαcoshβ
=
tanhα + tanhβ
1 + tanhαtanhβ
tanh (α-β) =
tanhα - tanhβ
1 - tanhαtanhβ

 ちなみに、三角関数の加法定理も同じように計算できます。 実数の範囲ならばオイラーの公式を使った証明が楽ですが、複素数の範囲になると「実部・虚部に分ける」という操作が意味を持たなくなります。 cos も sin も複素数になりますから。 しかし、cos (α+β) = { ej (α+β) + e- j (α+β) } / 2、sin (α+β) = { ej (α+β) - e- j (α+β) } / 2j を使えば、複素数の範囲でも加法定理がそのまま成り立っていることが分かります。 まぁ、これもオイラーの公式を元にしているわけですが。 虚数単位 j と j2 の振る舞いに注意。

ej (α+β) = ee = cosαcosβ +j cosαsinβ +j sinαcosβ -sinαsinβ
e- j (α+β) = e- jαe- jβ = cosαcosβ -j cosαsinβ -j sinαcosβ -sinαsinβ
2 cos (α+β) = ej (α+β) + e- j (α+β) = 2 cosαcosβ -2 sinαsinβ
2 j sin (α+β) = ej (α+β) - e- j (α+β) = 2 jcosαsinβ +2 j sinαcosβ
cos (α+β) = cosαcosβ - sinαsinβ
sin (α+β) = sinαcosβ + cosαsinβ

鮮やか(力技ともいう)でしょ? 加法定理が重要な公式であることに間違いはありませんが、オイラーの公式さえ覚えていればいつでも導くことができるので、加法定理自体は覚える必要はありません。 この章に書いてあることは全部忘れてしまって大丈夫です(がらくた数学ですから)。 あやふやに覚えるくらいなら覚えないほうが賢明です。

 オイラーの公式は高校の範囲ではないのですが、高校のときに先生が教えてくれて非常に感動した覚えがあります。 最初はキツネにつままれたかと思いましたが。 厳密に証明できるかどうかは別として(複素関数論の範疇になりますから)、高校の範囲でも形式的な導出は可能です。 理解も可能だと思います。 実際、導出から意味まで高校のときに理解できましたから。 オイラーの公式は複素数の本質が詰まった公式です。 理系なら高校でやるべきだと思っています。 これひとつで覚えなければいけないものもぐっと減るわけですし。 正直「もっと早く教えてくれよ」と思いました。

 以下は余談ですが、双曲線関数を指数関数で定義する式で、t を j t で置き換えると、

cosh ( j t ) =
ej t + e- j t
2
= cos t
sinh ( j t ) =
ej t - e- j t
2
= j sin t

逆に三角関数の定義を使って同じことをやると、

cos ( j t ) =
ej2 t + e- j2 t
2
=
e- t + et
2
= cosh t
sin ( j t ) =
ej2 t - e- j2 t
2 j
=
e- t - et
2 j
= - sinh t / j = j sinh t

という関係があります。 加法定理が複素数の範囲でも成り立っていることが分かったので cos ( u + j v ) や sin ( u + j v ) に適用すると、

cos ( u + j v ) = cos u cos ( j v ) - sin u sin ( j v ) = cos u cosh v - j sin u sinh v

sin ( u + j v ) = sin u cos ( j v ) + cos u sin ( j v ) = sin u cosh v + j cos u sinh v

となり、三角関数を複素数で定義した場合の実部・虚部が得られます。 双曲線関数でも同じことができて、

cosh ( u + j v ) = cosh u cosh ( j v ) + sinh u sinh ( j v ) = cosh u cos v + j sinh u sin v

sinh ( u + j v ) = sinh u cosh ( j v ) + cosh u sinh ( j v ) = sinh u cos v + j cosh u sin v

となります。 これを見ると三角関数と双曲線関数は表裏一体(実虚一体?)だということが分かります。

 この式で v =π とすると、

cosh ( u + jπ) = cosh u cosπ + j sinh u sinπ

= - cosh u

sinh ( u + jπ ) = sinh u cosπ + j cosh u sinπ

= - sinh u

になります。 つまり、原点に対して ( cosh u , sinh u ) と点対称の位置になり、XY平面の左側にも双曲線を書くことができます。

 また、u = 0 とすると、

cosh ( j v ) = cosh 0 cos v + j sinh 0 sin v

= cos v

sinh ( j v ) = sinh 0 cos v + j cosh 0 sin v

= j sin v

となります。 つまり、X = x = cosh z および Y = y / j = sinh z は、z を虚軸に沿って動かすとX-ImY平面上で三角関数のように円を書きます。 z が 2πj 増えると元の位置に戻るので周期は 2πj です。 X2 + Y2 = 1 なので、x2 + ( y / j )2 = 1、つまり、x2 - y2 = 1 です。 この式は双曲線だけを表していたのではなく、円も表していた、ということですね。

 そして、z が jΔz だけ増えるとこの円周上を Δz だけ移動します。 話を分かりやすくするために z = j v とおくと、v を Δv だけ増やすと z が jΔv 増え、X-ImY平面にある円周上を Δv だけ移動します。 つまり、( dX/dv )2 + ( dY/dv )2 = 1 です。 ここで、dX/dv や dY/dv を dx/dz や dy/dz で表すことを考えると、

dY/dv = dY/dy・dy/dz・dz/dv

= ( 1 / j )・dy/dz・j

= dy/dz

dX/dv = dX/dx・dx/dz・dz/dv

= 1・dx/dz・j

= j・dx/dz

です(たぶん)。 したがって、 ( dX/dv )2 + ( dY/dv )2 = ( dy/dz )2 + ( j・dx/dz )2 = ( dy/dz )2 - ( dx/dz )2 = 1 になります。 つまり、z を虚軸に沿って動かしたときに、( x, y / j ) が等速で円周上を動くようにすると、 (x')2 + (y')2 = 1 ではダメで、 (y')2 - (x')2 = 1 になる、ということのようです。

home / junkbox / hyp-func 双曲線と座標系

 双曲線 ( x = cosh t , y = sinh t ) を縦横とも a 倍に拡大した曲線を考えます。 これは ( x = a cosh t , y = a sinh t ) になります。 まず、t = 0 のとき、x = a cosh t = a 、y = a sinh t = 0 です。 また、

x2 - y2 = ( a cosh t )2 - ( a sinh t )2

= a2 cosh2 t - a2 sinh2 t

= a2 ( cosh2 t - sinh2 t )

= a2

x2 - y2 = 1
a2 a2

ですから、この曲線も双曲線になっていることが分かります。

 この曲線の漸近線を求めてみます。 まずは傾き。

lim
t→±∞
y
x
=
lim
t→±∞
a sinh t
a cosh t
=
lim
t→±∞
a ( et - e-t ) / 2
a ( et + e-t ) / 2
=
lim
t→±∞
et - e-t
et + e-t
lim
t→+∞
et - e-t
et + e-t
=
lim
t→+∞
et ( 1 - e-2t )
et ( 1 + e-2t )
=
lim
t→+∞
1 - e-2t
1 + e-2t
=
1 - 0
1 + 0
= 1
lim
t→−∞
et - e-t
et + e-t
=
lim
t→−∞
e-t ( e2t - 1 )
e-t ( e2t + 1 )
(同様に)
= -1

次に切片。

lim
t→+∞
y - x
=
lim
t→+∞
( a sinh t - a cosh t )
=
lim
t→+∞
a { ( et - e-t ) - ( et + e-t ) } / 2
=
lim
t→+∞
a ( et - e-t - et - e-t ) / 2
=
lim
t→+∞
a ( - e-t - e-t ) / 2
=
lim
t→+∞
- a e-t
= 0
lim
t→−∞
y + x
=
lim
t→−∞
( a sinh t + a cosh t )
=
lim
t→−∞
a { ( et - e-t ) + ( et + e-t ) } / 2 (同様に)
=
lim
t→+∞
a et
= 0

 したがって、漸近線は a に関わらず y = ±x だと分かります。 さらに、x > 0 の領域で、

x2 - y2 = a2

y = ±sqrt ( x2 - a2 )

sqrt ( x2 - a2 ) < sqrt ( x2 ) = x

- sqrt ( x2 - a2 ) > - sqrt ( x2 ) = - x

なので、| y | < x です。 つまり、この曲線は直線 y =±x より外側に出ることがありません。 すべて漸近線の内側に収まります。

 また、適当に正の値を二つ持ってきて a1 と a2 としたとき、x2 - y2 = a12 と x2 - y2 = a22 を連立させた方程式は、a1 = a2 でなければ解を持ちません(前者から後者を引けば 0 = a12 - a22 なので明らか)。 したがって、a が異なる双曲線どうしが交わることもありません。 グラフにしてみるとこんな風になります。

 ここで、 | y | < x の領域、つまり、x > 0 で漸近線に囲まれた領域に点 ( x0 , y0 ) をとります。

a0 = sqrt ( x02 - y02 )

とすると、 | y | < x なので a0 > 0 です。 また、 x02 - y02 = a02 になるので、 ( x0 , y0 ) は双曲線 x2 - y2 = a02 の上に載ります。 つまり、( x0 = a0 cosh t , y0 = a0 sinh t ) を満たす t があるはずです。

y0 / x0 = a0 sinh t / a0 cosh t

= sinh t / cosh t

= tanh t

なので、

t0 = tanh-1 ( y0 / x0 )

と計算できます。

 逆に、この a0 と t0 を使って、 ( x = a0 cosh t0 , y = a0 sinh t0 ) とおけば、

x2 - y2 = ( a0 cosh t0 )2 - ( a0 sinh t0 )2

= a02 cosh2 t0 - ( a02 sinh2 t0

= a02 ( cosh2 t0 - sinh2 t0 )

= a02

= x02 - y02

y / x = a0 sinh t0 / a0 cosh t0

= sinh t0 / cosh t0

= tanh t0

= tanh ( tanh-1 y0 / x0 )

= y0 / x0

となり、この連立方程式と考えて解くと、

x2 - y2 = x02 - y02 ( 1 )
y / x = y0 / x0 ( 2 )

y = x y0 / x0 ( 2 ) より

x2 - ( x y0 / x0 )2 = x02 - y02 ( 1 ) に代入

x2 - x2 y02 / x02 = x02 - y02

x2 x02 - x2 y02 = ( x02 - y02 ) x02

x2 ( x02 - y02 ) = ( x02 - y02 ) x02

x02 - y02 = a02 > 0 なので、( x02 - y02 ) で割ることができる

x2 = x02

x = x0 x > 0 かつ x0 > 0 より

y / x0 = y0 / x0 ( 2 ) に代入

y = y0

となって、 ( x , y ) は ( x0 , y0 ) に一致します。 つまり、この領域では ( x , y ) に対して ( a , t ) がひとつだけ決まり、なおかつ一対一で対応しています。 三角関数で極座標 ( r , θ ) が表現できたように、( r , t ) も座標のように使えます。 範囲は | y | < x に限られますが・・・。

a = sqrt ( x2 - y2 )
t = tanh-1 ( y / x )
x = a cosh t
y = a sinh t

 極座標では ( x , y ) をθだけ時計回りに回すと、( r , 0 ) になります。 つまり、原点から ( x , y ) までの距離が分かります。 言い換えると sqrt ( x2 + y2 ) を計算したことになります。 この回転には加法定理が使えます。 双曲線関数を用いた座標でも、加法定理で ( x , y ) を t だけ逆方向に「動かす」と、( a , 0 ) にたどり着きます。 これは sqrt ( x2 - y2 ) を計算したことになります。 これを利用するとCORDICで平方根を計算できます。

home / junkbox / hyp-func 双曲線航法

 CORDICとは関係ありませんが、座標の話が出たので双曲線航法の話も簡単に書いておきます。 実用的にはむしろこちらの方が身近に使われています。

 もし、平面上の2箇所から「同時に」「何か」を発射(普通は送信といいます)し、それをこの平面上の適当な地点で「受け取った」とします。 「何か」の速度が有限ならば、「受け取った」時刻に差が出ます。 発射装置(普通は基地局といいます)と受け取った装置(受信装置)に非常に正確な時計を置いて、基地局からは「送信した時刻」を「何か」に載せて送信すれば、受信した時刻から「何か」に書かれていた時刻・・・つまり送信された時刻・・・を引けば、到達にかかった時間が分かります。

 「何か」の速度が一定ならば、時間から2つの基地局までの距離が分かります。 基地局と基地局の間の距離はあらかじめ分かっていますので、この3つの距離から三角法で自分の位置が分かります。 ただし、基地局と基地局を結んだ直線(基線といいます)のどちら側にあるかの情報だけはないので、他の方法で決める必要があります。 「何か」の速度はなるべく一定のほうがいいので、普通は電波が使われます。 音は温度などによって速度が変わるのでちょっと都合が悪いのです。 この方法では双曲線は使ってません。(^-^; どちらかというと使っているのは三角関数ですね。

 この方法の欠点は「正確な時計が必要」なことです。 電波は毎秒約30万kmの速度があります。 地球一周でも約4万km、電波は0.13秒強で一周してしまいます。 ということは、この時計はそれよりもはるかに高い精度を常に維持していなければなりません。 基地局との時間差を利用して距離を測っているのですから、基地局を使って時計を校正することはできません。 単独で精度を維持する必要があります。 この用途に使えるのはいわゆる「原子時計」くらいです。 基地局に原子時計を備えるのはいいとしても、すべての受信側に原子時計を備えるのは現実的ではありません。

 しかし、基地局の時計が正確ならば、受信した時刻の「時間差」は正確に知ることができます。 この場合、受信側の時計の「時刻」は正確である必要はありません。 時刻の「進み具合」、つまり1秒の長さはある程度正確である必要がありますが、たとえば1%誤差があったとしても、基線間距離の1%程度の誤差しか出ません。 実際には水晶時計でも100ppm(0.01%)の精度は簡単に出せますから、1000km(東京-鹿児島の直線距離!)の基線に対して多めに見積もっても100m程度の誤差になり、実用上十分な精度が出せます。

 先ほどは双曲線を拡大・縮小しましたが、今度は焦点を固定して d を変えてみます。

d が0の場合は両方の焦点からの距離が等しいということですから、焦点を結んだ線分の垂直二等分線になります。 d が0から離れるにしたがって曲線はどちらかの焦点に近づき、曲がりも強くなっていきます。 電波を受信した時間差に速度をかければ、それがそのまま基地局からの距離の差になりますから、基地局の位置と距離の差で双曲線が一本決まり、その上に自分が載っている、ということが分かります。 距離の差を決めると曲線は2本できますが、どちらの基地局の電波を先に受信したかが分かるので、そのどちらに載っているのかは簡単に分かります。

 これだけでは線が決まるだけなので、もうひとつ基地局を用意して、同じことをしてやります。

この図では右上に基地局を増やしました。 右上の基地局と右下の基地局でも双曲線ができ、やはり自分が載っている双曲線が一本決まります。 この二本の双曲線の交点が自分のいる位置です。

 今は平面上でしたが、3次元空間でも同じように考えることができます。 3次元空間の場合、ふたつの基地局からの時間差で決まるのは単なる双曲線ではなく、基線を軸として双曲線を回転させた曲面になります。 基地局ふたつではこの面上にいるということが分かるだけです。 3つになるともうひとつ面ができますから、曲線ができます。 もし、自分が「地球の表面にいる」と仮定すると、この曲線と地球との交点が自分のいる位置です(2次元測位)。

 しかし、これでは標高が分かりません。 地上にいる場合は地図と併用すればある程度実用になりますが、空中を飛ぶ飛行機などでは実用になりません。 もうひとつ基地局があれば3次元空間で自分の位置が求められます。 つまり、標高も分かります(3次元測位)。

 GPSでも似たようなことをしていますが、どちらかというとこの章の冒頭で述べた、円(球)を使った方法に近いようです。 この場合でも受信機の時計の精度に限界がある(GPSは原子時計を積んで地球の回りを回っています!)ため、時計の補正のために衛星をひとつ余計に捕捉する必要があります。 2次元測位で3個、3次元測位で4個の衛星を捕捉する必要があるわけです。


ご意見・ご要望の送り先は あかもず仮店舗 の末尾をご覧ください。

Copyright (C) 2012-2015 akamoz.jp

$Id: hyp-func.htm,v 1.17 2017/06/10 11:35:43 you Exp $