特殊相対論で考える:併行して加速する2台ロケットの運動¶
入門現代の相対性理論入門(講談社サイエンティフィック)の第15章「特殊相対性理論の理解を深める」では、相対論的な一定の力のもとで加速する質点(ロケット)の運動を具体的に調べることで、加速度運動による時計の進みの変化が「双子のパラドックス(ランジュバンの旅行者)」と呼ばれる問題を矛盾なく説明することを示しました。
相対性理論では、いわゆる「剛体」というものは存在しません。というのも、"「剛体」とはどんな時にでもその静止系での剛体上の二点の距離が変わらない" ものと考えると、静止していた剛体の一方をある力で押して加速運動を始めた時、反対側の端も同時におなじ加速度で運動を開始しなければなりません。それには、力が瞬時に一方の端から他方の端に伝わること必要があり、特殊相対性理論の結論:「光速度を超える速度で伝わる信号は存在しない」に反してしまいます。
とはいえ、有限の大きさをもつ一体のロケットが実際に加速され飛行を続けていけるのは現実に起きていることです。同時に加速されているロケット内の物質について少しばかり考えてみましょう。
まず、ある慣性系(観測系)に対して相対論的な意味で一定の加速で運動する質点($R$ :ロケット)を考えます。 次に、同時に少し離れた場所($X1$) から ロケット$R$ と同じ加速で出発したロケット $R1$についても考えましょう。
以下に示す様に、これらのロケットは慣性系の観測者からは一定の距離で運動している様にみえますが、それぞれのロケットの瞬時加速系でみると、お互いに徐々に離れていくと観測されます。
さらに、ロケットの静止系で見たときにいつも一定の距離($L$)にある(ように見える)別の質点($Q$)を考えます($R$と$Q$は同時に加速させる一つの物体上の二点を想定しています)。この質点($Q$)をそれぞれの観測系で見たときの運動がどのようなものであるかを検討してみましょう。
ニュートン力学で考える限り、$Q$ と $R1$ に違いはありません。 特殊相対性理論の立場からは、微妙な、しかし、有意な違いが現れます。
下準備: 多様体の定義¶
このノートでは、座標変換の計算を簡単に実行するために、SageManifoldsを使います。SageManifoldsを使うことで、複数の座標系があった時の座標変換の合成の計算などを(半)自動化することができます。
SageManifoldsはその名のとおり多様体を取り扱う数式処理パッケージです。正確な理解のためには、多様体に関する知識が必要ですが、ここでは多様体=空間とその座標系の取り扱いを具体的に示していきます。
一定加速運動をする場合、その進行方向に鉛直な空間座標については、ローレンツ変換は恒等変換となりますから、 空間座標としては、進行方向の座標だけを考えれば良いでしょう。 つまり時間と一方向の空間からなる2次元のミンコフスキー空間を考えることになります。 SageManifoldsを使って議論を進めるために、 まずは舞台となる2次元のミンコフスキー空間(多様体)$M$ を定義します。
import time
# 開始
start_time = time.perf_counter_ns()
%display latex
import matplotlib.pyplot as plt
import pprint
show(version())
start_process_time = time.process_time_ns()
ミンコフスキー空間を表現する2次元の多様体(時空間)$M$ を考えましょう。
SageManifoldsでは計量が(+,---...-)あるいは、(-,+++...+)の符号を持つ多様体を"Lorentz"多様体と呼びます。
M = Manifold(2, 'M', structure="Lorentzian")
ローレンツ変換をSageManifolds で表現する。¶
この多様体の中でのローレンツ変換を表現するために、$\mathcal{CC}$ (静止系)および $\mathcal{MC}$ (運動系)と呼ぶ二つの座標系(チャート)を定義しましょう.
それぞれの座標は $t,x$ および $t_1, x_1$ とします。どの座標も$(-\infty, +\infty)$の座標範囲をもっています。
CC.<t,x>=M.chart('t:(-oo,+oo) x:(-oo,+oo)')
MC.<t_1,x_1>=M.chart('t_1:(-oo,+oo) x_1:(-oo,+oo)')
show(CC.coord_range())
show(MC.coord_range())
計量テンソルを定義する。¶
今考える空間はミンコフスキー空間なので、時空点間の固有距離は計量テンソル$g_{\mu\nu}$ を用いて、$ds^2=g_{\mu\nu}dx^\mu dx^\nu= dt^2 - dx^2$ と書き表せます。 この計量テンソル $g$ をSageManifoldsの中で定義します。
SageManifoldsではミンコフスキー空間の計量を作成するためのAPIが二つ(Lorentzian_metric および PseudoRimanian )あります。
これらのAPIでは、signatureの指定方法[ (+---) か (-++++) か? ] が異なります。
"Lorentzian_metric" では、 signature は "positive" あるいは "negative" で指定します。
これは、PseudoRimanian の計量で n-2 あるいは 2-n を指定することと、等価です。
$$n-2 == (n-1) - 1$$
つまり、空間的座標と時間的座標の数の差をPseudoRimanian多様体では指定します。
# PseudoRiemanian Metricを使う場合.
g_pr=M.metric('g_{pr}',signature=0) # (+,-,-,-)を想定. PseudoRiemanian Manifolds
# lorentzian_metricの場合
# lorentzian_metricではsignatureを、positive/negativeで指定できます。
# .metricではmetricの符号が正のものと、負のものの差を明示的に指定する必要がある。
g=M.lorentzian_metric('g',signature="negative") # positive:(-,+,+,+), negative:(+,-,-,-) のうちnegativeを選択
作成した計量にミンコフスキー計量を設定します。 どちらの方法で計量を定義しても、同じ計量が表現できています。
g[0,0]=g_pr[0,0]=1;
g[1,1]=g_pr[1,1]=-1
show(g[:]), show(g_pr[:])
show(g.display(CC))
show(g_pr.display())
SageManifoldsでは計量 $g$ は2階のテンソル場として取り扱われます。 すなわち、$g$ は二つのベクトル場からスカラー場を与える双線形の写像になっています。
g.inverse().display()
var('v_t v_x u_t u_x')
v=M.vector_field((v_t,v_x))
u=M.vector_field((u_t,u_x))
show(g(u,v).display(CC))
show(g(u,v).display(MC))
座標系を関係づけるローレンツ変換¶
先ほど作成した二つの座標系(CCおよびMC)はお互いに速度 $v$ で運動しているとします。
つまり二つの座標系は以下のローレンツ変換で関係づけられています。(この文書では光速度$c$が1である単位系を使います $c\equiv1$)。
$$\begin{cases}
t_1=\frac{1}{\sqrt{1-v^2}}\left(t - v\,x\right) \\
x_1=\frac{1}{\sqrt{1-v^2}}\left(x - v\,t\right) \\
\end{cases}
$$
特殊相対性理論では、$ |v| < c=1$ が要請されます。
この条件を assume() 関数を使って、SageMath/SageManifoldsにも伝えておきましょう。
SageManifoldsは、可能な場合には、逆変換も求めてくれます。
def gamma(v):
return 1/sqrt(1-v**2, hold=True)
v=var('v')
assume(abs(v) < 1, "real")
CC_to_MC=CC.transition_map(
MC,
[gamma(v)*(t-v*x), #
gamma(v)*(x-v*t)]
)
show(CC_to_MC.display())
show(CC_to_MC.inverse()(t_1,x_1))
逆変換の表式がちょっと見辛いので、等価な変換式に設定し直てみましょう。
CC_to_MC.set_inverse( gamma(v)*(t_1+v*x_1), #
gamma(v)*(x_1+v*t_1))
show(CC_to_MC.display())
show(CC_to_MC.inverse().display())
多様体${\mathcal{M}}$の座標変換ルールのリストM.coord_changes() には $\mathcal{CC} \rightarrow \mathcal{MC}$ と$\mathcal{MC} \rightarrow \mathcal{CC}$ のどちらもが登録されています。
show(M.coord_changes())
二つの座標系での計量 $g$ を見てみましょう。
show(g.display(MC))
show(g.display(CC))
この様に、ローレンツ変換によっては計量が変わらないことがこれで確認できました。
MC_to_CC=M.coord_change(MC,CC)
MC_to_CC.display()
.display() 関数は変換式を表示してくれますが、それらの式の変形などを調べるには不向きです。
これらの変換式を使った計算を実行する際にはその数式を取り出す必要があります。
これらの変換式の右辺の式を取り出してみましょう。
MC_to_CCは、$\mathcal{MC}$の座標値$(t_1,x_1)$ を$\mathcal{CC}$の座標値$(t,x)$に変換する関数としての機能を持ちます。
show(MC_to_CC)
show(MC_to_CC.display())
MC_to_CC(t_1,x_1),M.coord_change(MC,CC)(t,x)
座標系$\mathcal{CC}$と$\mathcal{MC}$をグラフで表示¶
二つの座標系の関係をグラフで表示してみましょう。 運動系の速度を $v=0.5 c$ として慣性系(赤)と運動系(青)の座標格子を描いてみます。
gls=(CC.plot(CC, parameters={v:0.5}, color="red",
number_values=5,
style={t: '--', x: '-.'},thickness=0.5)
, MC.plot(CC, parameters={v:0.5}, color="blue",
number_values=5,
style={t_1: '--', x_1: '-.'},thickness=0.7)
)
gl=sum(gls)
# 全体図
show(gl)
# 拡大図
show(gl, xmin=-6, xmax=6, ymin=-6, ymax=6, aspect_ratio=1)
今度は立場を変えて、運動系の座標系(MC)で見たときの座標格子を描いて見ます。
gls=( CC.plot(MC, parameters={v:0.5}, color="red",
number_values=5,
style={t: '--', x: '-.'}, thickness=0.5)
,
MC.plot(MC, parameters={v:0.5}, color="blue",
number_values=5,
style={t_1: '--', x_1: '-.'}, thickness=0.7)
)
gl=sum(gls)
show(gl)
show(gl, xmin=-6, xmax=6, ymin=-6, ymax=6, aspect_ratio=1)
慣性系 $\mathcal{O}$で静止している観測者$Obs_{\mathcal O}$¶
静止系の座標の原点にいる観測者を表現する点を考えます。静止系での座標は $(t,0)$ です。 運動系 $\mathcal{MC}$ での座標は、先ほど定義した変換規則から導かれます。
def Obs_O(t,X=0):
return M.point((t,X), CC, name="P_obs",latex_name="P{\\mathcal obs}")
Obs_O(t).coord(CC),Obs_O(t).coord(MC)
加速しているロケットの軌道¶
今考えている状況では二人の登場人物(観測者)がいます。一人は、地上(慣性系)に静止している観測者$Obs_{\mathcal O}$です。 残りの一人(パイロット$R$と呼びましょう)は、 この観測者に対して一定の力を受けて加速運動を行うロケット$R$に乗っています。 パイロットの固有時間 $\tau$を使うと、ロケットの軌道は、
$$ \begin{split}Z(s) - Z(0) =& \frac{1}{\alpha}{\left\lbrace\cosh(\alpha s) -1\right\rbrace}\\ =&\frac{2}{\alpha} \sinh^2(\alpha s/2)\\ T(s) =& \frac{1}{\alpha}\sinh(\alpha s)\\ =& \frac{2}{\alpha}\sinh(\alpha s/2)\cosh(\alpha s/2) \end{split} $$
とかけます。 (この運動についての詳細は 現代の相対性理論入門(講談社サイエンティフィック) 第?章 をご参照ください。)
a=var('a',latex_name="\\alpha")
assume(a > 0, 'real')
tau=var('tau',latex_name="\\tau")
assume(tau,'real')
#Z(a, tau)=(cosh(a*tau)-1)/a
#T(a, tau)=sinh(a*tau)/a
def Z(a, s, XO = 0):
return XO + (cosh(a*s)-1)/a
def T(a, s):
return sinh(a*s)/a
var('X0 s'); assume(X0,'real');assume(s,'real')
show("Z:", Z(a, s, X0), "\t dZ/ds:", diff(Z(a,s,X0),s))
show("T:", T(a, s), "\t dT/ds:", diff(T(a,s),s))
地上の観測者が見るロケットの速度を求めてみましょう。 $$V(s)=\frac{d Z}{d T} = \frac{\frac{d Z}{d s}}{\frac{d T}{d s}}$$ を使って計算します。
V(a,s)=(diff(Z(a,s,X0),s)/diff(T(a,s),s))
show(V)
V=V.reduce_trig()
show(V)
SageMathの微分演算子 $D$ を使って、次のように求めることもできます。 Dn は関数 $F$ の n-番目の引数(nは0始まり)による微分を返す汎函数です。
(D[1](Z)(a,s,X0)/D[1](T)(a,s)).reduce_trig()
相対論的な運動量 $p=\frac{v}{\sqrt{1-v^2}}$ も求めて見ましょう。
P(a,s)= (V(a,s)/sqrt(1-V(a,s)**2)).simplify_trig()
P(a,s)
ロケットの運動は相対論的な定加速運動(運動量の時間変化が一定の運動)になっていることを確認しましょう。 $$ \frac{d p}{dt} =\frac{d}{dt}\left(\frac{m_0 v}{\sqrt{1-v^2} }\right) = \mathbf{f} $$
(diff(P(a,s),s)/diff(T(a,s),s)).simplify_full()
空間 $M$ の中でこのロケットの軌跡をあらわす点を返す関数を定義してみましょう。
def RP(a, s, x0=0):
return M.point((T(a, s), Z(a, s, x0),),CC,name="R_P",latex_name="R_P")
RP(a,s,X0).coord()
時空点(pointオブジェクト) の座標値は.coordinates() メソッドを使って求めます。
show(RP(a,s,0).coordinates())
:note: 短縮名 .coord() も使えます。
R0=RP(a,0);show(R0.coord()) # R0は $s=0$ での ロケットRの時空点を与える。
軌跡あるいは世界線¶
この空間 $M$ の中で、このロケット(加速:$acl$, 初期位置:$x0$) の軌跡を表す曲線(curve, 世界線)を作る関数を作成します。
def Rc(acl, x0=0, s_min=-oo,s_max=+oo):
return M.curve(
{CC:[T(acl, s), Z(acl, s, x0)]},(s, s_min, s_max))
この関数によって作られたcurveオブジェクトは、指定されたパラメータから多様体$M$中の空間点を与える関数(正確に言えば呼び出し可能なオブジェクト)になっています。
R=Rc(a,0)
R(s).coord(CC), R(s).coord(MC)
R.display()
R.domain()
R.coord_functions()(s),R.coord_expr(),R.differential_functions()(s),R.tangent_vector_field().display()
R.coord_functions()(s) == R.coord_expr()
一方、座標系$\mathcal{CC}$で$x=x_0$に静止している点の世界線をあらわすオブジェクトを作る関数,$O_c$を次の様に定義します。 作成されたオブジェクト$O$はパラメータ$s$に対応する時空点のオブジェクトを返します。
def O_c(x0=0):
return M.curve({CC:[s, x0]}, (s, -oo, +oo))
O=O_c(0) # CCの空間座標xの原点 の世界線
O(t).coord(CC), O(t).coord(MC) # 時刻 tでのCCおよび MC での座標
(R(s).coord()[1].diff(s)/R(s).coord()[0].diff(s)).reduce_trig()
(R(s).coord(MC)[1].diff(s)/R(s).coord(MC)[0].diff(s)).simplify_full()
amb_chart=CC
acl_list=(0.1,0.2,0.5,1,2)
gls=[
Rc(acl).plot(
chart = amb_chart, ambient_coords = amb_chart[1:]+amb_chart[:1],
color=lprop["color"],
plot_points=200, prange=(0,5),imaginary_tolerance=1e-4,
legend_label=f'$\\alpha={acl:3.1f}$',
)
for acl,lprop in zip(
acl_list,
plt.rcParams['axes.prop_cycle']())
]
[g.legend(False) for g in gls]
gl=sum(gls)
gl.show(xmin=0, xmax=1,ymin=0, ymax=4.5,gridlines="automatic")
amb_chart=MC
amb_coords=amb_chart[1:]+amb_chart[:1]
gl=sum(
[ Rc(acl).plot(
chart=amb_chart, ambient_coords=amb_coords,
color=lprop["color"], plot_points=200,
parameters={v:0.5})
for acl,lprop in zip(
acl_list, plt.rcParams['axes.prop_cycle']()
)
]
)
gl.show(xmin=-2, xmax=2,ymin=0, ymax=10)
同時に少し離れたところ($X1=0.1$)から出発したロケット($R1$)の軌跡(破線)も同時に書いてみましょう。 軌跡の色の違いはロケットの加速力(0.1, 0.2, 0.5, 0.999)に対応しています。
x1=0.1
amb_chart=CC
amb_coords=amb_chart[1:]+amb_chart[:1]
gl=sum([Rc(acl,0).plot(chart=amb_chart, ambient_coords=amb_coords,
color=lprop["color"], plot_points=200,
label=f"$\\alpha={acl}$",
)
+Rc(acl,x1).plot(chart=amb_chart, ambient_coords=amb_coords,
color=lprop["color"], plot_points=200,
style="--",
)
for acl,lprop in zip(acl_list,
plt.rcParams['axes.prop_cycle']())]
)
gl.show(xmin=0,ymin=0, xmax=1, ymax=5, gridlines="automatic")
静止系$\mathcal{CC}$で観測する2台のロケットの距離は変わらないことが確認できます。
同じパラメータ$\tau$に対する ${\mathcal CC}$ での時刻は、$R$も$R1$も$\frac{\sinh(\alpha\tau)}{\alpha}$と同じです. 従って、この座標系${\mathcal CC}$で見た$R$と$R1$の空間距離は$x$座標の差となります。$\mathcal{CC}$での世界点の座標はそれぞれ:
var('X1')
assume(X1 > 0, 'real')
R=Rc(a,0)
R1=Rc(a,X1)
show(R(s).coord(), R1(s).coord())
これより、$\mathcal{CC}$での2台のロケットの距離は $t=\frac{\sinh(\alpha s)}{\alpha}$において、:
(R1(s).coord()[1] - R(s).coord()[1]).simplify_full()
と常に一定です。
次に、速度 $v$ で移動している系(${\mathcal MC}$)で見た、2台のロケット間の距離を求めてみましょう。 まずは、${\mathcal MC}$での軌跡をグラフで確認してみましょう。
amb_chart=MC
amb_coords=amb_chart[1:]+amb_chart[:1]
x1=0.2
gl=sum([
Rc(acl,0).plot(
chart=amb_chart, ambient_coords=amb_coords,
parameters={v:0.5},
color=lprop["color"], plot_points=200,
)+Rc(acl,x1).plot(
chart=amb_chart, ambient_coords=amb_coords,
parameters={v:0.5,X0:x1},
color=lprop["color"], plot_points=200,style="--",
)
for acl,lprop in zip(acl_list,
plt.rcParams['axes.prop_cycle']())
])
gl.rename("Plot name")
gl.show(xmin=-2, xmax=1,ymin=0, ymax=10, gridlines="automatic")
運動系$MC$でみたときには、同じ時刻 $t_1$ になるロケットRのパラメータ$s$ とロケットR1のパラメータ$s_1$ は異なっています。同じ$t_1$を与える$s$ と $s_1$ の関係を求め、二つのロケットの距離を導き出しましょう。
var('s1',latex_name="s_1"); var('phi');
assume(s1,'real');assume(phi,'real')
show(R(s).coord(MC))
show(R1(s1).coord(MC))
ここで、$v=\tanh(\alpha s_v)$ となる $s_v$ を導入して、上記の関係式を書き直してみましょう。
var('s_v');assume(s_v > 0,'real')
R(s).coord(MC)[0].subs(v=tanh(a*s_v)).simplify_trig().reduce_trig()
R1(s1).coord(MC)[0].subs(v=tanh(a*s_v)).simplify_trig().reduce_trig()
$$ \frac{{\mathrm{sech}}(\alpha\tau)}{\sqrt{1- {\tanh}^2(\alpha\tau)}} \equiv 1$$ であることに注意して、上の結果を整理してみましょう。(SageMathはこの関係に気がつかない様です)
(sech(a*s_v)/sqrt(1-tanh(a*s_v)**2)).simplify_trig()
まず、RとR1の$\mathcal{MC}$での時間座標を確認して見ましょう。
R(s).coord(MC)[0].subs(v=tanh(a*s_v)).simplify_trig().reduce_trig().subs(
sech(a*s_v)==sqrt(1+tanh(a*s_v))*sqrt(1-tanh(a*s_v))
).simplify_full().reduce_trig()
R1(s1).coord(MC)[0].subs(v=tanh(a*s_v)).simplify_trig().reduce_trig().subs(
sech(a*s_v)==sqrt(1+tanh(a*s_v))*sqrt(1-tanh(a*s_v))
).simplify_full().reduce_trig()
これから、$\mathcal{MC}$ で同時刻となる $s$ と$s_1$ の関係は次の様に求められます。
sol=solve(R(s).coord(MC)[0]== R1(s1).coord(MC)[0], s1)
show(sol)
rel=(sol[0].subs(v=tanh(a*s_v))*cosh(a*s_v)).simplify_trig()
show(rel)
両辺に$-\cosh(\alpha s_1)\sinh(\alpha s_v)$を加えて、整理します。
show(
rel.add_to_both_sides(-cosh(a*s1)*sinh(a*s_v)).reduce_trig()
)
関係式(rel)に同じ項を足すことで、この関係式を簡単に書き表すこともできます。
show(
(rel - cosh(a*s1)*sinh(a*s_v)).reduce_trig()
)# relの両辺から$\cosh(\alpha\tau_1)\sinh(\alpha\tau_v)$を引く。
これを整理すると $\mathcal{MC}$で同時刻($t_1$)を与える$s$と$s_1$の関係は: $$ \sinh(\alpha(s_1 -s_v)) = \sinh(\alpha( s - s_v)) + \alpha X_1 \sinh(\alpha s_v) $$ となります。
sol_s1=solve((rel - cosh(a*s1)*sinh(a*s_v)).reduce_trig() ,s1,ivar=(s,s_v))
show(sol_s1)
次に$R$と$R1$の$\mathcal{MC}$での空間座標をそれぞれ見て見ましょう。
R(s).coord(MC)[1].subs(v=tanh(a*s_v)).simplify_trig().reduce_trig().subs(
sech(a*s_v)==sqrt(1+tanh(a*s_v))*sqrt(1-tanh(a*s_v))
).simplify_full().reduce_trig()
R1(s1).coord(MC)[1].subs(v=tanh(a*s_v)).simplify_trig().reduce_trig().subs(
sech(a*s_v)==sqrt(1+tanh(a*s_v))*sqrt(1-tanh(a*s_v))
).simplify_full().reduce_trig()
${\mathcal MC}$の同時刻で観測した$R$と$R1$の空間距離($D_{MC}$)は
D_MC=(
R1(s1).coord(MC)[1]- R(s).coord(MC)[1]
).subs(v=tanh(a*s_v)
).simplify_trig().reduce_trig()
D_MC=D_MC.subs(sech(a*s_v)==sqrt(1+tanh(a*s_v))*sqrt(1-tanh(a*s_v))).reduce_trig()
show(D_MC)
これをまとめると、
$$ D_{MC}=| X_{1} \cosh\left({\alpha} s_{v}\right) + \frac{ \cosh\left({\alpha}\left( {s_1} - s_{v}\right)\right) - \cosh\left({\alpha}\left({s} - s_{v}\right)\right) } {\alpha}| $$ となっています。次の関係式と上記の$s_1 - s$の関係を持ちいて、$D_{MC}$を書き換えて見ましょう。
# 以下の式変形のヒント
show(sech(a*s_v)*cosh(a*s_v) == (sech(a*s_v)*cosh(a*s_v)).simplify_trig())
show((sech(a*s_v)/sqrt(1-tanh(a*s_v)**2)) == (sech(a*s_v)/sqrt(1-tanh(a*s_v)**2)).simplify_trig())
show(1/sqrt(1-tanh(a*s_v)**2) == 1/sqrt(1-tanh(a*s_v)**2).simplify_trig())
show(v/sqrt(1-v**2) == (v/sqrt(1-v**2)).subs(v==tanh(a*s_v)).simplify_trig())
show(1/sqrt(1-tanh(a*s_v)**2) == 1/sqrt(1-tanh(a*s)**2).subs(tanh(a*s)==v))
show(cosh(a*(s1-s_v)) == sqrt(1+sinh(a*(s1-s_v))**2).subs(sinh(a*(s1-s_v))==sinh(a*(s-s_v))+a*X1*sinh(a*s_v)).simplify_trig())
D_MC=D_MC.reduce_trig().subs(
cosh(-a*s1+a*s_v) == sqrt(1+sinh(a*(s1-s_v))**2)
).subs(sinh(a*(s1-s_v))==sinh(a*(s-s_v))+a*X1*sinh(a*s_v).simplify_trig() )
show(D_MC)
等価な結果を次のようにして、得ることもできます。
(R1(s1).coord(MC)[1]-R(s).coord(MC)[1]).subs(v=tanh(a*s_v)).simplify_trig().reduce_trig().subs(
sech(a*s_v)==sqrt(1+tanh(a*s_v))*sqrt(1-tanh(a*s_v))).reduce_trig().subs(sol_s1)
これより、$t=\frac{\sinh(\alpha(s -s_v))+\sinh(\alpha s_v)}{\alpha}$ における、2台のロケットの${\mathcal MC}$における距離は、$v=\tanh(\alpha s_v)$ として、
$$ |X_1\cosh(\alpha s_v) + \frac{1}{\alpha}\left[ \sqrt{1+ (\alpha X_1 \sinh(\alpha s_v)+\sinh(\alpha(s-s_v)))^2} - \cosh\left(\alpha( s - s_v)\right) \right]| $$
と求められます。この様に、${\mathcal MC}$ での2台のロケットの空間距離は一定ではなく、時刻に依存しています。
特に$s \rightarrow \infty$ では、この距離は $|X_1\cosh(\alpha s_v) + X_1\sinh(\alpha s_v)|=\frac{X_0}{\sqrt{1-v^2}}\left(1+v\right)$ に近づいていきます。 これを確認するために、第2項だけを取り出して、式を変形して見ましょう。
d= sqrt(1+(a*X1*sinh(a*s_v)+sinh(a*(s-s_v)))**2) - cosh(a*(s-s_v))
dd=(sqrt(1+(a*X1*sinh(a*s_v)+sinh(a*(s-s_v)))**2) + cosh(a*(s-s_v)))
dn=(d*dd).simplify_full()
show(dn/dd)
$s \rightarrow \infty$ でこの距離は $\alpha X_0 \sinh{\alpha s_v}$ に近づくことがわかります。
assume(X1 > 0, 'real')
limit(dn/dd,s = +oo).expand()
また、$s =s_v$ では、${\mathcal MC}$ でのロケット $R$ の速度が0となり、2台のロケットの距離は $$ \frac{X_1}{\sqrt{1-v^2}} + \frac{1}{\alpha}\left[\sqrt{1+(\alpha X_1)^2 } - 1\right] $$ となります。
座標系 ${\mathcal MC}$ で観測されるこれらのロケットの速度についても考えてみましょう。 Rocket $R$ については、その速度は次のように求められます。
(diff(R(s).coord(MC)[1],s)/diff(R(s).coord(MC)[0],s)).subs(v=tanh(a*s_v)).simplify_trig().reduce_trig()
これを整理すると、 $$ \tanh\left(\alpha \left( s - s_v \right)\right) $$ となります。
これは明らかに、$s = s_v$ で0となります。 一方、この座標系(${\mathcal MC}$)でのRocket$R1$の速度は、
(diff(R1(s1).coord(MC)[1],s1)/diff(R1(s1).coord(MC)[0],s1)).subs(v=tanh(a*s_v)).simplify_trig().reduce_trig()
すなわち $\tanh{\alpha(s_1 - s_v)}$ 、です。同時刻を与える$s$と$s_1$の関係を代入して相対速度は、
tanh(a*(s1-s_v)).subs((a*(s1-s_v)) == asinh(sinh(a*(s-s_v))+a*X1*sinh(a*s_v))).simplify_full()
tanh(a*(s1-s_v)).subs(sol_s1).simplify_trig().reduce_trig().simplify_full()
となります。
$s = s_v$ (つまり、$t=t_v=\sinh(\alpha s_v)/\alpha$ )では、 $\mathcal{MC}$で見た$R$の速度は$0$となるのに対して、$R1$の速度は、
$\displaystyle\frac{X_1\alpha \sinh(\alpha s_v)}{\sqrt{1+\alpha^2 X_1^2 (\sinh(\alpha s_v))^2}} =\frac{X_1\alpha v}{\sqrt{1+(\alpha^2 X_1^2 -1)v^2}} \ne 0$ (if $ \alpha X_1 \ne 0 {\,\text{and}\,} v\ne0$) です。
つまり、異なる地点を同時に出発して、同じ様に加速されている2台のロケットはお互いに相手が次第に遠ざかっていく様にみえることを示しています。(t,s,s_v, s_1の関係を示す図を用意すること)
ロケット$R$の二人めの乗員 $Q$¶
ここで、ロケット$R$の二人めの乗員 $Q$ の軌跡を考えてみましょう。
瞬時静止系 $\mathcal{SC_R}$¶
この乗員 $Q$ を正確に定義するために、まずは$R$ の瞬時静止系 $\mathcal{SC_R}$ を考えてみます。$R$の瞬時静止系とは、 つまり、その瞬間にロケットと同じ速度で慣性系に対して等速度で運動している系の一つということです。 この系での時刻原点は、この系での時刻が速度が一致する瞬間のロケットの固有時刻と一致するように選ぶとします。
この瞬時静止系は地上の観測者に対して一定速度で運動していますから、 慣性系とこの瞬間静止系は次のローレンツ変換で結ばれています。 $$ \begin{split}\begin{cases} x' = \gamma_\tau \left\lbrace (x - Z(s_R)) - V(s_R) (t - T(s_R)) \right\rbrace \\ t' - s_R= \gamma_\tau \left\lbrace (t - T(s_R)) - V(s_R) (x - Z(s_R)) \right\rbrace \\ \gamma_\tau = \frac{1}{\sqrt{1-V(s_R)^2}}\\ \end{cases}\end{split} $$
加速度$\alpha$ で運動しているロケットの固有時刻$s_R$での瞬間静止系座標 $\mathcal{SC_R}$ を定義します。
var('s_R')
SC_R.<t_R,x_R>=M.chart('t_R:t_R x_R:x_R')
CC_to_SC_R=CC.transition_map(
SC_R,
[ (((t-T(a, s_R)) - tanh(a*s_R)*(x-Z(a, s_R, 0)))*cosh(a*s_R) + s_R).simplify_trig(),
(((x-Z(a, s_R, 0))-tanh(a*s_R)*(t-T(a, s_R)))*cosh(a*s_R)).simplify_trig()]
)
SC_R_to_CC=CC_to_SC_R.inverse()
Rの固有時 $s_R$ での瞬間静止座標系 $SC_R$が作成できました。
SC_R
$SC_R$ の座標変数は $SC_R$ の要素 SC_R[index] として取り出すことができます。
SC_R[:]
これらの座標での計量を求めてみます。 $\mathcal{SC_R}$は静止系に対して等速$v_R=\tanh{\alpha s_R}$ で動いている系ですから、計量は静止系のそれと一致しているはずです。
g.display(SC_R)
この座標系でのロケットの$s=s_R$での座標値は、$(s_R, 0)$ であることを確認しておきましょう。 ロケットの静止系($CC$)での座標を確認してみます。
M.coord_change(CC,SC_R).display(), M.coord_change(SC_R,CC).display(),
show(R(s_R).coord(CC)) or show(R(s_R).coord(SC_R))
時空点 $R(s_R)$ の $SC_R$での座標を .coordメソッドで求めます。
座標系 $\mathcal{SC_R}$ では、常に R(s_R) は空間座標が 0 になっていることが確認できます。
$\mathcal{SC_R}$ でもその他の時間では、$R$の座標は0ではないことに注意します。
R(s_R).coord(SC_R), [e.reduce_trig() for e in R(s).coord(SC_R)]
座標系 $\mathcal{SC_R}$の定義から、この座標系で見たRの速度は0になるはずです。 速度を求めてみましょう
diff(R(s_R).coord(SC_R)[1],s_R)/diff(R(s_R).coord(SC_R)[0],s_R)
確かに0となっています。 次にこの系での時刻 $s_R$ の2台目のロケットの位置について考えます。 ロケット1の固有時$s1$の時空点が、$\mathcal{SC_R}$で$t_R=s_R$ を与えるとします。
R1(s1).coord(CC), R1(s1).coord(SC_R)
sol_s1=solve(
(solve(R1(s1).coord(SC_R)[0]==s_R, s1)[0]*cosh(a*s_R)-cosh(a*s1)*sinh(a*s_R)).reduce_trig(),
s1,ivar=s_R)
show(sol_s1)
R1(sol_s1[0].rhs()).coord(SC_R)
観測者 $𝑄$ : ロケット1の二人目の乗組員¶
さて、この瞬時静止系でロケットの原点からロケットの進行方向の位置 $L$ にいる観測者を考えましょう(この観測者を乗員 $Q$ と呼びましょう)。 瞬時静止座標系でみれば、この点の座標は$(s_R, L)$です。 この時空点の$\mathcal{CC}$の座標で見ると、次のようになります。
var('L'); assume(L,'real'); assume(L > 0)
M.coord_change(SC_R,CC)(s_R,L)
Rocket $R$ の固有時$s_R$に対して、$Q$がこの座標を持つように運動すれば、$Q$ は$R$から見て、常に同じ場所に見える($R$の瞬時静止座標系で同じ空間座標を持つ)ことになります。この運動の世界線を定義しましょう。
def Qc(acl, l):
return M.curve({CC:[(1+a*l)*sinh(a*s)/a,
((1+a*l)*cosh(a*s)-1)/a],},
(s, -oo, +oo))
Q=Qc(a,L)
show(Q(s_R).coord(CC)) or show(Q(s_R).coord(SC_R))
$\mathcal{SC_R}$ と $\mathcal{CC}$での座標を見てみましょう。 $R$と$Q$はどの$\mathcal{SC_R}$で見ても同じ位置に存在することがわかります。
Q(s_R).coord(SC_R),R(s_R).coord(SC_R)
次にこの乗員 $Q$ の慣性系$CC$ での座標を求めましょう。
QT(a,s_R,L) = Q(s_R).coord(CC)[0]
QZ(a,s_R,L) = Q(s_R).coord(CC)[1]
Q_coord(a,s_R,L)=Q(s_R).coord(CC)
Q_coord
QT, QZ
diff(Q_coord(a,s,L),s)
これから、Qの$\mathcal{CC}$での速度は$t=\frac{(1+L \alpha)\sinh(\alpha s)}{\alpha}$において、$v_q=\tanh(\alpha s)$となることがわかります。
ロケットの座標と比べると、この観測者も一定加速運動の軌跡であることがわかります。
# ロケット RのCCでの座標, QのCCでの座標
(T(a,s), Z(a,s,X0)), (QT(a,s,L), QZ(a,s,L)), Q_coord(a,s,L)[:]
Q(s_R).coordinates(SC_R), Q(s).coordinates(SC_R), R(s).coord(SC_R),R(s_R).coord(SC_R)
一方、ロケットの瞬時静止座標系 $SC_R$ で観測される速度は $0$ となることを確認しましょう。
(diff(Q(s).coordinates(SC_R)[1],s)/diff(Q(s).coordinates(SC_R)[0],s)).reduce_trig()
(diff(Q(s).coordinates(SC_R)[1],s)/diff(Q(s).coordinates(SC_R)[0],s)).reduce_trig().subs(s=s_R)
しかしこの観測者が受けている"加速"はロケット $R$ の"加速"($=\alpha$)とは少し異なっています。
VQ(a,s,L)=diff(QZ(a,s,L),s)/diff(QT(a,s,L),s)
VQ(a,s,L)
(diff(VQ(a,s,L)/sqrt(1-VQ(a,s,L)**2), s)/diff(QT(a,s,L), s)).simplify_full()
更に、この観測者の固有時$s_q$は、下に示す計算でわかる様に、 $$ d s_q = (1+ L \alpha) d s $$ であることがわかります。
(diff(QT(a,s,L),s)**2 - diff(QZ(a,s,L),s)**2).simplify_full().factor()
つまり、$ds_q = (1+L\alpha) ds$ の関係があります。 Rocketの静止座標系では$Q$は常にLの位置にあると見えますが、その瞬間のお互いの固有時間($s$ と $s_q$)はお互いに少しずつずれていってしまうということになります。
この $s_q=(1+L\alpha)s$ と $\alpha_q=\frac{\alpha}{1+L\alpha}$ を使うと、 $$ T_q(s)= \frac{1+L\alpha}{\alpha}\sinh(\alpha s ) = \frac{1}{\alpha_q}\sinh(\alpha_q s_q)\\ Z_q(s)= \frac{1+L\alpha}{\alpha}\left(\cosh(\alpha s) -1 \right) =\frac{1}{\alpha_q}\left(\cosh(\alpha_q s_q) -1 \right)\\ $$ と書くことができます。これは静止系の観測者からみた $Q$ の運動の加速が $\alpha_q=\frac{\alpha}{1+L\alpha}$で $Q$ の固有時が $s_q$ との解釈と一致しています。
Rc(a/(1+a*L),L)((1+a*L)*s).coord(CC) == Q(s).coord(CC)
静止系($\mathcal{CC}$)での$R$と$Q$の関係¶
$R$の静止系
静止系($\mathcal{CC}$)の時刻 $t$ でのロケット($R$)とこの観測者 $Q$ の空間的な距離がどうなるかを考えてみましょう。 静止系($\mathcal{CC}$)の時刻 $t$ での $R$ の固有時 $s$ と $Q$ の固有時 $s_q$ を求めます。 SageMathの使うバックエンドのライブラリ(sympy と maxima)によって、結果が異なる様に見えます。
# sympyによる解
var('s_q',latex_name="s_q")
assume(s,"real")
assume(s_q,"real")
sols_sympy=solve([QT(a,s_q) == t,
T(a,s) ==t],
s_q, s, algorithm="sympy",ivar=[t])
show(sols_sympy[-1])
# maximaによる解
var('s1',latex_name="s_1")
sols = solve(T(a,s) == t, s, algorithm="maxima")
sols += solve(QT(a,s_q) == t, s_q, algorithm="maxima",ivar=[t])
show(sols)
双曲線関数の定義に立ち戻ると、 $$\mathrm{arcsinh}(y) == \log\left(y+\sqrt{1+y^2}\right)$$ ですので、二つのアルゴリズム(sympy, maxima)の結果は等価であることがわかります。
assume(t,'real')
sinh(log(t+sqrt(1+t**2))).simplify_full() == sinh(arcsinh(t)).simplify_trig()
sympyとmaximaでは異なる表現となりますが、これらは等価であることが確認できました。
solve(T(a,s) == QT(a,s_q) , s_q, ivar=[s],algorithm="maxima")
つまり、同じ $t$ を与える、$s$と$s_q$ の関係は次の式で与えられます。
S_q(a,L,s)=arcsinh(a/(1+L*a)*T(a,s))/a
S_q
この解を用いて、時刻 $t$ でのロケット $R$ と 第二の観測者$Q$ の 座標系($\mathcal{CC}$)での座標を求めましょう。
Q(S_q(a,L,s)).coord(CC),[e.subs(sols) for e in Q(s_q).coord(CC)]
(QZ(a,s_q, L)).subs(sols).simplify_full()
(QZ(a,S_q(a,L,s), L)).simplify_full()
(Z(a,s,0)).subs(sols).simplify_full()
これらから、$\mathcal{CC}$ の同時刻の$R$と$Q$の距離$D_q$は、
D_q=(Q(s_q).coord(CC)[1] - R(s).coord(CC)[1]).subs(sols).simplify_full()
show(D_q)
$D_q$ の分子(numerator)第一項を目の子で整理すると次の式になります。
D_q=(sqrt((1+L*a)**2+a**2*t**2) - sqrt(1+a**2*t**2))/a
show(D_q)
このままでも、$t \rightarrow \infty$で0に近づくことはわかります。 しかし、より分かりよくするために分子分母に同じファクタをかけて整理しなおして見ましょう。
common_f=(sqrt((1+L*a)**2+a**2*t**2) + sqrt(1+a**2*t**2))
D_q=((D_q*common_f).simplify_full()/common_f).simplify_full().factor()
show(D_q)
結果を整理すると、時刻 $t$ での $R$ と $Q$ のCCでの空間座標 $x$ の差は: $$ \Delta_Q= \frac{\left(L\alpha+2\right) L} {\sqrt{(1+L\alpha)^2+\alpha^2 t^2} + \sqrt{1+\alpha^2 t^2}} \\ $$ であることがわかりました。静止系での観測($O$)では、時間が経つにつれて($t \rightarrow +\infty$) ロケット $R$ と観測者 $Q$ の距離は徐々に縮んでいく($\Delta_Q \rightarrow \mathcal{O}(1/t)$)ということです。 $Q$ と $R$ の $\mathcal{CC}$ で見た速度は次の様に求められます. これから、$V_q$は常に$V_r$ より小さい、つまり $Q$に$R$が徐々に追いつくように見えることが分かります。
limit(D_q,t = +oo).expand(), limit(t*D_q,t = +oo).expand()
#QとRのCCでの速度
"V_q", diff((QZ(a,s_q,L,X0)).subs(sols),t), "V_r",diff((Z(a,s,X0)).subs(sols), t)
DeltaV_q=(diff(QZ(a,s_q,L).subs(sols),t)- diff(Z(a,s).subs(sols), t)).simplify_full()
show(DeltaV_q)
limit(DeltaV_q,t = +oo).expand(),limit(t**2*DeltaV_q,t = +oo).expand()
$R$ と $Q$ の静止系$\mathcal{CC}$ での軌道の表示¶
$R$ と $Q$ (L=0.1 とL=-0.1) の静止系$\mathcal{CC}$ での軌道を見てみましょう。 同じ$s$で見た時の$R$ と $Q$の時空点も表示しています。
# c1,c2は curve オブジェクトを値とする関数.
def c_r(ac, xO=0): #X0を出発し、定加速 acで運動するロケットの世界線
return M.curve({CC:[T(ac, s),
Z(ac, s, xO)]},
(s, -oo, +oo) )
def c_q(ac, l ): #X0から出発したロケットの静止系で x=Lの位置の点
return M.curve({CC:[QT(ac, s, l),
QZ(ac, s, l)]},
(s,-oo, +oo))
def P_Q(a, s, l, pname="Q"):
return M.point((QT(a, s, l),
QZ(a, s, l),),
CC,
name=f"{{{pname}}}_{{tau}}",
latex_name=f"{{{pname}}}_\\tau")
amb_chart=CC
amb_coord=amb_chart[1:]+amb_chart[:1]
acl_list=(0.05, 0.2, 0.5, 1.0)
gl=(#CC.plot(ambient_coords=(t,x),max_range=2) +
sum(
[
sum([c_q(ac, 0.1).plot(amb_chart, ambient_coords=amb_coord,
parameters={a:ac, L:0.1}, plot_points =200,
color=lc["color"], style="--" ) ,
c_q(ac, -0.1).plot(ambient_coords=amb_coord,
parameters={a:ac, L:-0.1}, plot_points =200,
color=lc["color"], style="--" ) ,
R.plot(ambient_coords=(x,t),
parameters={a:ac, L:0.1},plot_points =200,
color=lc["color"], )
])
for ac, lc in zip( acl_list,
plt.rcParams['axes.prop_cycle']())
]
)
+
sum([R(2/(1+ac)).plot(ambient_coords=amb_coord,
color=lc["color"],
parameters={a:ac, X0:0},
label_offset=0.04, label=f"$R_{{\\alpha={ac:.2f}}}$" )
+Q(2/(1+ac)).plot(amb_chart, ambient_coords=amb_coord,
parameters={a:ac, L:+0.1},
color=lc["color"], label_offset=0.05,label="$Q_{+}$",)
+Q(2/(1+ac)).plot(amb_chart, ambient_coords=amb_coord,
parameters={a:ac, L:-0.1},
color=lc["color"],label_offset=0.05, label="$Q_{-}$",)
for ac,lc in zip(acl_list, plt.rcParams['axes.prop_cycle']())
]
)
)
gl.show(xmin=-0.1, xmax=1, ymin=0, ymax=3, gridlines="automatic")
一般化座標としてのロケットの静止系 Rindler coordinates¶
これまで考えてきた座標系は、ある固有時$\tau$ における瞬時静止系で、 この座標系自体は慣性系(静止系に対して、一定の速度で運動している座標系)の一つでした。
ここでは、ロケットの静止系を一般座標系として定義します。 一般座標系として、ロケットの固有時 $\tau$ と $\tau$ における瞬時静止系の空間座標の値 $\xi$ をその座標として採用することにしてみましょう。 Rindler coordinates Kottler–Møller coordinates
[#] 後で見る様に、この座標では、$M$ の全領域をカバーすることができません。
部分多様体 $U$ を定義して、そのチャートとして定義するのが本来の方法です。カバーできる領域としては、 $$ t-x -1/\alpha < 0 \\ t+x +1/\alpha > 0 $$
となります。この条件を満たす部分空間を $U$としましょう。これから取り扱う一般座標としての固有静止系座標(Proper reference frame) はこの部分空間でのみ定義されています。
U = M.open_subset('U',
coord_def={
CC:(
# x+1/a - t > 0 ,
# x+1/a + t > 0,
a*x+1 >0,
t < x + 1/a,
t > -x - 1/a,
#(1+a*x)**2-a**2*t**2 > 0
)
},
supersets=(M,)
)
U.atlas(),U.coord_changes()
R(s).coord(), R(s) in U
ここで固有座標系 $\mathcal{GC}$ を定義します。 $\mathcal{GC}$の座標は $\tau, \xi$ としましょう。
var('xi',latex_name="\\xi")
GC.<tau, xi> =M.chart(
'tau:(-oo,+oo):\\tau xi:(-1/a,+oo):\\xi' ,
coord_restrictions=[
xi+1/a > 0,
]
)
U.atlas(),U.coord_changes()
M.atlas(), M.coord_changes()
一般座標 $(\tau, \xi)$ は次の範囲で意味を持ちます。 $(1+\alpha \xi)^2 > \alpha^2 \tau^2 $ この条件は、座標系の制限条件として設定されていますが、座標それぞれの可変範囲としては次のようになっています。
GC.coord_range(), GC._restrictions
瞬時静止座標系と静止系の座標変換¶
$R$の固有座標系/静止座標系$\mathcal{GC}$は$R$の瞬時静止座標系$\mathcal{SC_R}$を通じて、定義されています。 $\mathcal{CC}$ の時空点 $(t,x)$ に対して、この時空点の$\mathcal{SC_R}$での時刻が$t_R=s_R$となるような$\mathcal{SC_R}$が通常は一つ定まります。この$\mathcal{SC_R}$の空間座標値$x_R$を持って、$\xi=x_R$とすることで、静止座標系$\mathcal{GC}$を定義しましょう。
まずは、ロケットRの瞬時静止座標系($sc_\tau$=$(\tau_r,x_r)$)と静止系($CC$)の座標変換を求めます。
M.coord_change(SC_R,CC).display()
SageManifoldsの座標変換オブジェクトからSageMathの数式表現を取り出します。
[e.simplify_full() for e in M.coord_change(SC_R,CC)(*SC_R)]
この座標変換から逆変換を計算してみます。これにより、CCから$sc_\tau$への座標変換が 多様体$M$に登録されます。
M.coord_change(SC_R,CC).inverse()
M.coord_change(CC,SC_R).display()
この逆変換についても、SageMathの数式表現を取り出してみます。
[e.simplify_full().reduce_trig() for e in M.coord_change(CC,SC_R)(*CC)]
$\mathcal{SC_R}$で $t_R = s_R$ の部分空間に対応する静止系の部分空間を考えてみます。 これは次の様にして、静止系の時空での直線となっています。
solve(M.coord_change(CC,SC_R)(*CC)[0] == s_R, t)
これを解くと、$(t,x)$ から $s_R$ を求める関係式が導かれます。
solve(
(solve(M.coord_change(CC,SC_R)(*CC)[0] == s_R,s_R)[0]/cosh(a*s_R)).reduce_trig(),
s_R)
結果は次の式にまとめられました。 $$ s_R= \frac{1}{\alpha}\tanh^{-1}\left(\frac{\alpha t}{1+\alpha x}\right) $$
実引数($y$)に対する $\tanh(y)$ は $ -1 \le \tanh\left(y\right) \le 1$ を満たします。 これより、 $$ -1 \le \frac{t}{x+1/\alpha} \le 1 $$ 従って この一般座標系で表現可能な$\mathcal{CC}$の領域は、 $$ -|x+1/\alpha| \le t \le |x+1/\alpha| $$ に制限されることがわかります。特に$\,x=-1/\alpha\,$ では $t\equiv0$となることがわかります。 (図を挿入)
一般座標系を、次のようにして定義していきます。 まず、$\mathcal{CC}$の座標 $(t,x)$ に対して、この点のRの瞬時座標系の中から、瞬時座標系での時刻が$t_R=s_R$となる、瞬間静止座標系 $\mathcal{SC_R}$ を 選びます($s=s_R$)。 その時の空間座標 $x_R$ が 一般座標の空間成分 $\xi$ であるとに定義します。 まず、この$\tau$ は、 $$ {\tau} = \frac{\operatorname{arctanh}\left(\frac{{\alpha} t}{{\alpha} x + 1}\right)}{{\alpha}} $$ で定められます。
sol=solve( M.coord_change(CC,SC_R)(*CC)[0] == s_R, s_R,)
show(sol)
sol_tau=solve((sol[0]/cosh(a*s_R)).reduce_trig(),s_R)
sol_tau
これに対応する$sc_\tau$の空間座標$\xi$は、次の式で計算されます。
M.coord_change(CC,SC_R)(*CC)[1].subs(sol_tau).simplify_full()
これを少し整理すると、(SageMathはsqrtを含む式の整理が苦手な様です)
$$ \begin{equation} \xi = \frac{(1+\alpha x)^2 - \alpha^2 t^2 - \sqrt{ (1+\alpha x)^2- \alpha ^2 t^2} }{\alpha \sqrt{(1+\alpha x)^2 - \alpha^2 t^2}}\\ = \frac{\sqrt{(1+\alpha x)^2 - \alpha^2 t^2} - 1} {\alpha }\\ = \frac{(2+\alpha x)\alpha x - \alpha^2 t^2 } {\alpha \left(\sqrt{(1+\alpha x)^2 - \alpha^2 t^2} + 1\right)} \end{equation} $$
となることがわかります。逆変換も $t_\tau=\tau$の条件での$sc_{\tau}$から$\mathcal{CC}$への変換そのものですから、次のように計算できます。(SC_Rは$\tau=s$での静止座標系であることに注意して、計算を続けます。)
M.coord_change(SC_R, CC)(s_R,xi)
$GC$ と静止座標系 $CC$ との変換規則¶
これで、一般座標系 $GC$ と静止座標系 $CC$ との変換規則は分かりましたので、これをSageManifoldに実装しましょう。 座標逆変換の結果が "failed" となっていますが、座標の制限 $1+\alpha x > 0$, $1+\alpha\xi >0$を考慮すれば、座標逆変換の結果は元に戻っていることに注意しましょう。
GC_to_GC=GC.transition_map(
GC, [tau, xi],
restrictions1=( a*xi + 1 > 0, ),
restrictions2=( a*xi + 1 > 0, )
)
CC_to_CC=CC.transition_map(
CC, [t, x]
)
CC_to_GC=CC.transition_map(
GC,
[arctanh(a*t/(1+a*x))/a,
#(sqrt((1+a*x)^2-a^2*t^2)- 1)/a
(- a*t^2 + (2+a*x)*x )/(sqrt(-a^2*t^2 + (1+a*x)^2)+1)
],
restrictions1=( a*x + 1 > 0 ,
t > -x - 1/a + X1,
t < x + 1/a - X1,
# (x+1/a)**2 - t**2 > 0
),
restrictions2=( a*xi + 1 > 0, )
)
GC_to_CC=GC.transition_map(
CC,
[(1+a*xi)*sinh(a*tau)/a, ((1+a*xi)*cosh(a*tau)-1)/a, ],
restrictions2=( a*x + 1 > 0 ,
t > -x - 1/a + X1,
t < x + 1/a - X1,
# (x+1/a)**2 - t**2 > 0
),
restrictions1=( a*xi + 1 > 0,)
)
show((GC_to_CC*CC_to_GC).display()) or show((CC_to_GC*GC_to_CC).display()) or show(GC_to_GC.display()) or show(CC_to_CC.display())
show(M.coord_change(GC, CC).display())
show(M.coord_change(CC, GC).display())
((M.coord_change(CC, GC)(t,x)[1]+1/a)**2 -M.coord_change(CC, GC)(t,x)[0]**2).simplify_full()
((M.coord_change(GC, CC)(tau,xi)[1]+1/a)**2 -M.coord_change(GC, CC)(tau,xi)[0]**2).simplify_full()
GC_to_CC=M.coord_change(GC,CC)
CC_to_GC=M.coord_change(CC,GC)
これらの座標変換を組み合わせて、 GCー>GC, CC->CCの変換を求めてみます。 $\mathcal{GC}$の座標の制限を考慮すると、これらの変換は恒等変換となっていることがわかります。
show((GC_to_CC*CC_to_GC).display())
show((CC_to_GC*GC_to_CC).display())
(arctanh(sinh(a*tau)/cosh(a*tau))/a).reduce_trig()
(Q(s).coord(CC)[0]**2-(Q(s).coord(CC)[1]+1/a)**2).simplify_full().factor()
show(Q(s).coord(CC))
show(arctanh(a*Q(s).coord(CC)[0]/(1+a*Q(s).coord(CC)[1])).reduce_trig()/a)
計量$g$ のそれぞれの座標系での表現を確認してみましょう。
show(g.display(CC))
show(g.display(GC))
$\mathcal{CC}\rightarrow\mathcal{GC}$の座標変換が非線形であることを反映して、 $\mathcal{GC}$の計量はMinkowski空間のそれではありません。
場合によっては、次のように式を整理してみると良いかもしれません。
g.apply_map(factor, frame=GC.frame(), chart=GC, keep_other_components=True)
g.display(GC)
この一般座標系で、接続および曲率を求めてみます。 接続は0でない成分を含みますが、曲率は0となりました。 これは空間がMinkowski空間であることの反映です。
nabla = g.connection()
g.christoffel_symbols_display(GC)
Ricci = nabla.ricci()
Ricci.display()
Ricci_scalar = g.ricci_scalar()
Ricci_scalar.display()
Qの世界線の再定義¶
これまでのQc/Qの定義は$\mathcal{SC_R}$で $s=s_R$の時点でしか意味を持ちませんでした。 $\mathcal{GC}$を使って、再定義します。
def Qc(acl, l,):
return M.curve({GC:[s,l],},
(s, -oo, +oo))
Q=Qc(a,L)
show(Q.display())
show(Q(s).coord(CC)) or show(Q(s).coord(GC))
((Q(s).coord()[1] + 1/a)**2 - (Q(s).coord()[0])**2).simplify_full()
((R(s).coord()[1] + 1/a)**2 - (R(s).coord()[0])**2).simplify_full()
座標系のグラフ表示¶
二つの座標系のグリッドをそれぞれの座標系で表示してみましょう。 $t=0$ に $x=0$ および $x=-1/\alpha$ を出た光の光円錐も黄色で追加しました。
def RC(l): # ロケット内部でx=Lにある点の世界線 #Qc
return M.curve({GC:(s,l)},(s, -oo,+oo))
var('epsilon',latex_name='\epsilon')
def OC(x): # CCで静止している点の世界線
eps=0.1e-6 # 不正なSQRTの取り扱いを避けるため。
return M.curve(
{CC:(s, x),},(s, -oo , +oo)
)
acl=0.3
xeps=1e-6
x_min=-1/acl+xeps
x_max= 2/acl-xeps
max_range=x_max
var('x0 s')
#x0=-1/acl+xeps
goptions=dict(
parameters={a:acl,L:0},
ranges={x:( x_min, x_max),
t:(-max_range, +max_range),
xi:( x_min, x_max),
tau:(-max_range, +max_range),
},
#max_range=max_range,
number_values=10
)
def LC_f(x0):
#s_max=min(1/a+x0,max_range)
#s_min=max(-1.0/a-x0,-max_range)
return M.curve({CC:(s, x0+s)},
(s, 0, +oo))
def LC_b(x0):
return M.curve({CC:(-s, x0+s)},
(s,0, +oo))
plot_chart=CC
plot_coords=plot_chart[1:]+plot_chart[:1]
gl_CC= CC.plot(CC,ambient_coords=(x,t),
color="red",
style={t: '--', x: '-.'}, thickness=0.5,
**goptions
)
gl_CC+= GC.plot(plot_chart, ambient_coords=(x,t),
color="blue",
style={tau: '--', xi: '-.'}, thickness=0.5,
**goptions
)
gl_CC+=(
LC_f(-1/acl+xeps).plot(plot_chart, ambient_coords=plot_coords,
color="gold",style="-.", thickness=2, **goptions)
+LC_b(-1/acl+xeps).plot(plot_chart,ambient_coords=plot_coords,
color="orange", style="-.", thickness=2, **goptions)
)
gl_CC+=(
LC_f(0.0).plot(plot_chart,ambient_coords=plot_coords,
color="gold", style="-.", thickness=2, **goptions)
+LC_b(0.0).plot(plot_chart, ambient_coords=plot_coords,
color="orange", style="-.", thickness=2, **goptions)
)
show(gl_CC, xmin=-1/acl, xmax=max_range, ymin = -max_range/2, ymax=max_range/2,)
さらにロケットの軌跡(緑の太線)と静止系の観測者の軌跡(茶色の太線)を重ね書きします。
eps=1e-6
show(OC(0)(s).coord(GC),OC(L)(s).coord(GC))
show(OC(eps)(s).coord(GC),OC(L)(s).coord(GC))
show(RC(L)(s).coord(GC),Qc(a,L)(s).coord(GC))
gl_CC+=RC(0.0).plot(plot_chart, ambient_coords=plot_coords,
color="green",
style="-", thickness=4, **goptions)
gl_CC+=RC(x_max/6).plot(plot_chart, ambient_coords=plot_coords,
color="green",
style="--", thickness=1, **goptions)
gl_CC+=RC(-x_max/6).plot(plot_chart, ambient_coords=plot_coords,
color="green",
style="-.", thickness=1, **goptions)
gl_CC+=OC(0.0).plot(plot_chart, ambient_coords=plot_coords,
color="brown",
style="-", thickness=4, **goptions)
gl_CC+=OC(x_max/6).plot(plot_chart, ambient_coords=plot_coords,
color="brown",
style="--", thickness=2, **goptions)
gl_CC+=OC(-x_max/6).plot(plot_chart, ambient_coords=plot_coords,
color="brown",
style="-.", thickness=2, **goptions)
show(gl_CC, xmin=-1/acl, xmax=max_range, ymin = -max_range/2, ymax=max_range/2,)
緑の細線はRの静止座標系で$\xi=\mathrm{一定}$となる点の軌跡を示しています。 上で見たように、これらの軌跡も静止系でみれば一定の運動量変化を持って運動しています。
次に一般座標系での静止座標系($CC$)のグリッドを表示してみましょう。
acl=0.3
xeps=1e-6
x_min=-1.0/acl+xeps
x_max= 5.0/(3.0*acl)
max_range=x_max
goptions=dict(
parameters={a:acl,L:0,x0:-1/acl+xeps,X0:-1/acl+xeps},
ranges={
x:(0, 8/5*x_max),
t:(x_min , 1/acl-xeps),
xi:(-1./acl+xeps, x_max),
tau:(-max_range, max_range)
},
max_range=max_range,
number_values=9)
amb_chart=GC
amb_coords=amb_chart[1:]+amb_chart[:1]
gl_GC=GC.plot(amb_chart, ambient_coords=amb_coords,
color="blue", style={tau: '--', xi: '-.'},thickness=0.5,
**goptions)
# show(gl_GC,xmin=x_min, xmax=x_max, ymin=-max_range/2, ymax=max_range/2)
# 右半分の座標グリッド
gl_GC+=CC.plot(amb_chart, ambient_coords=amb_coords,
color="red", thickness=0.5,style={t: '--', x: '-.'},
**goptions)
# show(gl_GC,xmin=x_min, xmax=x_max, ymin=-max_range/2, ymax=max_range/2)
# 左半分の座標グリッド
gl_GC+=CC.plot(amb_chart, ambient_coords=amb_coords,
color="red",thickness=0.5, style={t: '--', x: '-.'},
parameters={a:acl,L:0,x0:-1/acl+xeps},
ranges={
x:(2*x_min/3, 0),
t:(x_min/4, -x_min/4),
xi:(-1./acl+xeps, x_max),
tau:(-max_range, max_range)
},
max_range=max_range,
number_values=3
)
# show(gl_GC,xmin=x_min, xmax=x_max, ymin=-max_range/2, ymax=max_range/2)
# 左右の隙間を埋める
gl_GC+=CC.plot(
amb_chart, ambient_coords=amb_coords,
color="red",thickness=0.5,style={t: '--', x: '-.'},
parameters={a:acl,L:0,x0:-1/acl+xeps},
ranges={
x:(x_min/3, 0),
t:(x_min/2,-x_min/2),
xi:(-1./acl+xeps, x_max),
tau:(-max_range, max_range)
},
max_range=max_range,
number_values=2
)
# show(gl_GC,xmin=x_min, xmax=x_max, ymin=-max_range/2, ymax=max_range/2)
gl_GC+=(
LC_f(0,).plot(
amb_chart, ambient_coords=amb_coords,thickness=2,
color="gold", **goptions)
+LC_b(0,).plot(
amb_chart, ambient_coords=amb_coords,thickness=2,
color="orange", **goptions)
)
gl_GC+=(
LC_f(-1/acl+xeps).plot(
amb_chart, ambient_coords=amb_coords,thickness=2,
color="gold", **goptions)
+LC_b(-1/acl+xeps).plot(
amb_chart, ambient_coords=amb_coords,thickness=2,
color="orange", **goptions)
)
gl_GC+=(
LC_f(-0.5/acl+xeps).plot(
amb_chart, ambient_coords=amb_coords,thickness=2,
color="gold", **goptions)
+LC_b(-0.5/acl+xeps).plot(
amb_chart, ambient_coords=amb_coords,thickness=2,
color="orange", **goptions)
)
show(gl_GC,xmin=x_min, xmax=x_max, ymin=-max_range/2, ymax=max_range/2)
gl_RO=gl_GC+RC(0.0).plot(amb_chart, ambient_coords=amb_coords,
color="green",
style="-", thickness=4, **goptions)
gl_RO+=RC(x_max/5).plot(amb_chart, ambient_coords=amb_coords,
color="green",
style="--", thickness=2, **goptions)
gl_RO+=RC(-x_max/5).plot(amb_chart, ambient_coords=amb_coords,
color="green",
style="-.", thickness=2, **goptions)
show(gl_RO,xmin=x_min,xmax=x_max, ymin=-x_max/2,ymax=x_max/2)
eps=1e-6
gl_RO+=OC( 0.0).plot(amb_chart, ambient_coords=amb_coords,
prange=(-1/acl+eps, 1/acl-eps),
color="brown", style="-", thickness=4, **goptions)
gl_RO+=OC( x_max/5).plot(amb_chart, ambient_coords=amb_coords,
prange=(-(1)/acl-x_max/5+eps, (1)/acl+x_max/5-eps),
color="brown", style="--", thickness=2, **goptions)
gl_RO+=OC(-x_max/5).plot(amb_chart, ambient_coords=amb_coords,
prange=(-(1)/acl+x_max/5+eps,(1)/acl-x_max/5-eps),
color="brown", style="-.",thickness=2, **goptions)
show(gl_RO,xmin=x_min,xmax=x_max, ymin=-x_max/2,ymax=x_max/2)
以下では、 上記の図と同じですが、SageMath/SageManifoldの機能の使用例として 別の方法で同等の図を描きます。
acl=0.3
xeps=1e-6
x_min=-1.0/acl+xeps
x_max= 5.0/(3.0*acl)
max_range=x_max
amb_chart=GC
amb_coords=amb_chart[1:]+amb_chart[:1]
gl= sum(((achart).plot(
amb_chart, ambient_coords=amb_coords,
parameters={a:acl,L:0,x0:-1/acl+xeps},
ranges={
x:(0, 8/5*x_max),
t:(x_min , -x_min),
xi:(-1./acl+xeps, x_max),
tau:(-max_range+xeps, max_range-xeps)
},
number_values=9, style={t: '--', x: '-.',tau:'--',xi:'-.'}, color=lparm["color"]
)) for achart, lparm in zip((GC,CC), plt.rcParams['axes.prop_cycle']()))
show(gl,xmin=x_min, xmax=x_max, ymin=-x_max/2, ymax=x_max/2)
gl+=(LC_f(0).plot(amb_chart, ambient_coords=amb_coords,thickness=2,
color="gold", **goptions)
+LC_b(0).plot(amb_chart, ambient_coords=amb_coords,thickness=2,
color="orange", **goptions)
)
gl+=(LC_f(-1/acl+xeps).plot(amb_chart, ambient_coords=amb_coords,thickness=2,
color="gold", **goptions)
+LC_b(-1/acl+xeps).plot(amb_chart, ambient_coords=amb_coords,thickness=2,
color="orange", **goptions)
)
gl+=(LC_f(-0.5/acl+xeps).plot(amb_chart, ambient_coords=amb_coords,thickness=2,
color="gold", **goptions)
+LC_b(-0.5/acl+xeps).plot(amb_chart, ambient_coords=amb_coords,thickness=2,
color="orange", **goptions)
)
show(gl,xmin=x_min, xmax=x_max, ymin=-max_range/2, ymax=max_range/2)
gl_RO=gl+RC(0.0).plot(amb_chart, ambient_coords=amb_coords,
color="green", style="-", thickness=4, **goptions)
gl_RO+=RC(x_max/5).plot(amb_chart, ambient_coords=amb_coords,
color="green", style="-.", thickness=2, **goptions)
gl_RO+=RC(-x_max/5).plot(amb_chart, ambient_coords=amb_coords,
color="green", style="--", thickness=2, **goptions)
gl_RO+=OC(0.0).plot(amb_chart, ambient_coords=amb_coords,
prange=(-(1)/acl+1e-4,(1)/acl-1e-4),
color="brown", style="-", thickness=4, **goptions)
gl_RO+=OC(x_max/5 ).plot(amb_chart, ambient_coords=amb_coords,
prange=(-(1+acl*x_max/5)/acl+1e-4,(1+acl*x_max/5)/acl-1e-4),
color="brown", style="-.", thickness=2, **goptions)
gl_RO+=OC(-x_max/5 ).plot(amb_chart, ambient_coords=amb_coords,
prange=(-(1-acl*x_max/5)/acl+1e-4,(1-acl*x_max/5)/acl-1e-4),
color="brown", style="--",thickness=2, **goptions)
show(gl_RO,xmax=x_max, xmin=x_min, ymax=x_max/2, ymin=-x_max/2)
M.coord_change(CC,GC)(t,x)
# 左半分の座標グリッド
gl_RO+=CC.plot(amb_chart, ambient_coords=amb_coords,
color="orange",thickness=0.5, style={t: '--', x: '-.'},
parameters={a:acl,L:0,x0:-1/acl+xeps},
ranges={
x:(1*x_min/3, -3*x_min/3),
t:(2*x_min/4, -2*x_min/4),
xi:(-1./acl+xeps,0),
tau:(-max_range/2, max_range/2)
},
max_range=max_range,
number_values=5,
)
show(gl_RO,xmin=x_min, xmax=x_max, ymin=-max_range/2, ymax=max_range/2)
ちょっと寄り道-1: Kruskal‐Szekeres coordinates/NULL coordinate¶
この座標系($GC$)でカバーできるMの範囲は、$\xi$ と $\tau$ に対して、 $$ (1+\alpha x) + \alpha t = 2(1+\alpha \xi) e^{\alpha \tau} > 0 \\ (1+\alpha x) - \alpha t = 2(1+\alpha \xi) e^{-\alpha \tau} > 0 \\ $$ です。空間座標の $x$ に対して、$t$の許される範囲は、 $$ (1/\alpha + x) > t > -(1/\alpha +x) $$ また、時間座標が$t$に対しては、 $$ x > |t| $$
と $M(CC)$ の領域全体をカバーできるわけではありません。
Black hole時空の解析でよく使われる、Kruskal‐Szekeres coordinates/NULL coordinate に 習って、
$$ \begin{cases} u_{k} =\frac{t + x + 1/\alpha}{\sqrt{2}}\\ v_{k} =\frac{-t + x + 1/\alpha}{\sqrt{2}}\\ \end{cases} $$
で座標を定義してみます。この座標系では、ロケットの静止/固有座標系($GC$)で表現可能な空間($U$)は $$ \begin{cases} u_k > 0\\ v_k > 0 \\ \end{cases} $$ と表現することができます。
KK.<u_k, v_k> =M.chart(r'u_k v_k')
CC_to_KK=CC.transition_map(KK,
[(t+x+1/a)/sqrt(2),(-t+x+1/a)/sqrt(2)])
CC_to_KK.display()
KK_to_CC=CC_to_KK.inverse()
KK_to_CC.display()
座標変換の積を使って、GC_to_KK および KK_to_GC の座標変換を求めます。
これによって、これらの変換は $U$の座標変換表(coord_changes)に同時に登録されます。
GC_to_KK=CC_to_KK*GC_to_CC
KK_to_GC=CC_to_GC*KK_to_CC
show(GC_to_KK.display())
show(KK_to_GC.display())
M.atlas() ,U.atlas(),(CC.restrict(U), GC, KK)
list(M.coord_changes().values())
g.display(KK)
acl=0.3
x_min=-1.0/acl
x_max=5/3/acl
u_max=(2*x_max+1/acl)/sqrt(2)
amb_chart=CC
show(sum(((achart).plot(
amb_chart, ambient_coords=amb_chart[1:]+amb_chart[:1],
parameters={a:acl, L:0, x0:-0.99/acl},
ranges={
x:(-0.99/acl, x_max),
t:(-x_max, x_max),
u_k:(0, (2*x_max+1/acl)/sqrt(2)),
v_k:(0, (2*x_max+1/acl)/sqrt(2))
},
number_values=9,
color=lparm["color"])) for achart, lparm in zip( (KK, CC), plt.rcParams['axes.prop_cycle']()))
)
#
amb_chart=KK
gl_KK=sum(
(
achart.plot(
amb_chart, ambient_coords=amb_chart[1:]+amb_chart[:1],
parameters={a:acl, L:0, x0:-0.99/acl},
ranges={
x:(-0.99/acl, x_max),
t:(-x_max, x_max),
u_k:(0, (2*x_max+1/acl)/sqrt(2)),
v_k:(0, (2*x_max+1/acl)/sqrt(2))
},
number_values=9,
color=lparm["color"]
)
for achart, lparm in zip((KK, CC), plt.rcParams['axes.prop_cycle']())
)
)
# show(gl_KK,xmin=0,xmax=u_max,ymin=0,ymax=u_max)
#
gl_KK+=RC(0).plot(KK,ambient_coords=KK[1:]+KK[:1],
color="green", style="-", thickness=4, **goptions)
gl_KK+=RC(x_max/5).plot(KK, color="green", ambient_coords=KK[1:]+KK[:1],
prange=(0, 0.8*x_max),
style="--", thickness=2, **goptions)
gl_KK+=RC(-x_max/5).plot(KK, color="green", ambient_coords=KK[1:]+KK[:1],
prange=(0,1.2*x_max),
style="-.", thickness=2, **goptions)
gl_KK+=OC(0.0).plot(KK, color="brown", ambient_coords=KK[1:]+KK[:1],
line_style="-", thickness=4, **goptions)
gl_KK+=OC(x_max/5).plot(KK, color="brown", ambient_coords=KK[1:]+KK[:1],
style="--", thickness=2, **goptions)
gl_KK+=OC(-x_max/5).plot(KK, color="brown", ambient_coords=KK[1:]+KK[:1],
style="-.",thickness=2, **goptions)
show(gl_KK,xmin=0, xmax=u_max, ymin=0, ymax=u_max)
ちょっと寄り道-2:接続、曲率など¶
(この節は、一般相対性理論の基本となる一般座標と多様体に関する知識が必要です。以降の議論には関係しないので、 スキップしても構いません)。
SageManifoldでは、メトリックを与えれば、接続係数、曲率などの計算を実行してくれます。
元の空間はフラットな Minkowski空間なので、曲率が0なのは自明ですが、一応確認してみましょう。
曲率は0となりますが、ロケットの静止系(GC)では0でない接続の成分もあります。(一定加速度を表現している)
nabla = g.connection()
g.christoffel_symbols_display(GC)
Ricci = nabla.ricci()
Ricci.display()
Ricci_scalar = g.ricci_scalar()
Ricci_scalar.display()
有限長のロケットの内部¶
ここで少し視点を変えて、加速されたロケット上の観測者の静止座標系では、ロケット内の各点は常に($\tau$に無関係に)同じ空間座標($\xi$)と 観測されているとしてみましょう。
有限長のロケットのモデルとして、一端で力を受けて、棒の長さ方向に一定加速度で運動している状態を考えてみます。 ロケットの底から先頭までの長さを$L$とし,途中の位置を$\xi$とします。
非相対論的な場合¶
$$ \rho \delta l \frac{d^2 x}{d \tau^2}= F(l-\delta l/2) - F(l+\delta l/2) = \frac{d F}{d \xi} \delta l = \rho \delta l \alpha $$
$$ F(l) = \rho \alpha*(-L-l) $$
相対論的な場合¶
$$ F(l-\delta l/2) - F(l+\delta l/2) = \rho \delta l \frac{d}{d\tau_l}\left(\frac{1}{\sqrt{1-\frac{d \xi_l}{d\tau_l}^2}}\frac{d \xi_l}{d \tau_l}\right) = \rho \delta l \frac{\alpha}{1+l \alpha} $$
$$ \frac{d F(l)}{d l} = - \frac{\rho\alpha}{1+l \alpha}\\ F(l) = -\rho \log\left(1+l \alpha\right)+F(0)= \rho\log\frac{1+L\alpha}{1+l\alpha} $$ $F(0)$は$l = 0$で$F(L) = 0$の条件から定ります。 $$ F(0) = \rho\log{\left(1+L*\alpha\right)} $$
ロケットの長さをLとして、全体が同じ加速 $\alpha$ で運動するためには、 ロケットの長さ方向について各部分で働く推力(圧力)は、
$$ F(l)=\rho \log\left(\frac{1+ L\alpha}{1+l\alpha}\right)\\ \frac{\partial F}{\partial l}= - \rho \frac{\alpha}{1+l\alpha} $$
となります。ロケットの先端ではこの推力は0となりますが、無限小の後ろの壁からの推力で加速度 を得ます。 ロケットの先端での加速 $\beta$は、$\beta = \frac{\alpha}{1+\alpha L}$ なので、 $$ \alpha=\frac{\beta}{1-\beta L} \\ \\ \text{or}\\ \\ \frac{1}{\beta} - \frac{1}{\alpha} = L \\ $$ です。従って、 $$ F(l)= -\rho \log\left(1+ (l-L)\beta\right)\\ $$
ロケットの後端部の圧力は、$F(0)= -\rho\log\left(1-\beta L\right)$です。 この時、$L$ は $L < \frac{1}{\beta}$ を満たす必要があります。
ニュートン物理学で考えても、一本の剛体(弾性体?)の棒を後方から押して、 定加速度運動させているとき、棒の各断面に働く圧力は $$ F(x) = \rho \alpha(L-x) $$ なので、これは上の式(10)の非相対論的極限と一致しています。
並行して加速していくロケットの軌道¶
一台のロケットの中で、一緒に移動していく二人の観測者に加えて、静止系の $t=0,x=X_0$ から出発し、 最初のロケットと同じように加速されていくロケットの観測者 $R_1$ を考えます。 その固有時 $s_{r1}$ での静止系の座標は、次の様に与えられます。
var('s_r1');
assume(s_r1, 'real')
R1=Rc(a,X1) # Curve
R1(s_r1).coord(CC)
R1(s_r1).coord(SC_R)
R1.display()
$\mathcal{CC}$ での空間座標が $x$となるこの世界線の座標は、次の式で与えられます。
R1(acosh(1+(x-X1)*a)/a).coord(CC), R1(acosh(1+(x-X1)*a)/a).coord(GC)
R1(s).coord(GC)
[e.reduce_trig() for e in R1(s_r1).coord(SC_R)]
$\mathcal{SC_R}$での時刻が$s_R$となる$R1$の固有時間$s_{r1}$を求めます。 ($\mathcal{SC_R}$ は ロケットRの固有時刻が $s_R$の時の瞬時静止慣性系でした)
M.coord_change(CC,GC)(*CC[:])
sol_R1=solve(R1(s_r1).coord(SC_R)[0].reduce_trig()== s_R, s_r1)
show(sol_R1)
[e.subs(sol_R1) for e in R1(s_r1).coord(CC)]
[e.reduce_trig().subs(sol_R1) for e in R1(s_r1).coord(SC_R)]
[e for e in R1(sol_R1[0].rhs()).coord(SC_R)]
この時の座標系$\mathcal{CC}$での速度はつぎのようになります。Rの速度 $\tanh{\alpha s}$とは異なっています。
R1(s_r1).coord(CC)[0].subs(sol_R1),R1(s_r1).coord(CC)[1].subs(sol_R1)
V1=(diff(R1(s_r1).coord(CC)[1].subs(sol_R1),s_R)/diff(R1(s_r1).coord(CC)[0].subs(sol_R1),s_R))
show(V1)
show(V1.subs(sol_R1).reduce_trig())
(diff(R1(s_r1).coord(SC_R)[1].subs(sol_R1),s_R)/diff(R1(s_r1).coord(SC_R)[0].subs(sol_R1),s_R))
$s_{r1}$がR1の固有時となっていることを確認しましょう。
(diff(R1(s_r1).coord(CC)[0],s_r1)**2-diff(R1(s_r1).coord(CC)[1],s_r1)**2).simplify_full()
"""
t=0にx=X0を出発して、一定加速 a で加速されるロケット$R1$の固有時刻 s_r1での瞬時静止座標系SC_R1を定義する。
"""
SC_R1.<t_r1, x_r1>=M.chart(r't_r1:t_{R1} x_r1:x_{R1}')
CC_to_SC_R1=CC.transition_map(
SC_R1,
[
(((t-T(a,s_r1)) - tanh(a*s_r1)*(x-Z(a,s_r1,X1)) )*cosh(a*s_r1) + s_r1).simplify_full(),
(((x-Z(a,s_r1,X1))- tanh(a*s_r1)*(t-T(a,s_r1)) )*cosh(a*s_r1)).simplify_full()
]
)
SC_R1_to_CC=CC_to_SC_R1.inverse()
show(M.coord_change(CC,SC_R1).display())
show(R1(s_r1).coord(SC_R1), R1(s_r1).coord(CC))
[e.reduce_trig() for e in R1(s_r1).coord(SC_R)]
[e.reduce_trig() for e in R1(s_r1).coord(CC)]
R1(s_r1).coord(CC)
$\mathcal{CC}$では、2台のロケットのそれぞれの時計は同じように進んでいると観測されます。
solve(
R(s_R).coord(CC)[0] == R1(s_r1).coord(CC)[0], s_r1,ivar=(s_R,)
)
$R_1$の固有座標系$\mathcal{GC_1}$¶
$\mathcal{CC}$ と$\mathcal{GC_1}$の関係は、$\mathcal{CC}$ と$\mathcal{GC}$の関係を平行移動すれば良いので、 次のように座標系$\mathcal{GC_1}$と座標変換(CC_to_GC1など)を定義します。
assume(a > 0, 'real')
var('tau_1 xi_1')
assume(tau_1, 'real') ; assume(xi_1,'real')
GC1.<tau_1, xi_1> = M.chart(
'tau_1:(-oo,+oo):\\tau_1 xi_1:(-1/a,+oo):\\xi_1',
coord_restrictions=[
xi_1 + 1/a > 0,
]
)
GC1_to_GC1=GC1.transition_map(
GC1,
[tau_1, xi_1],
restrictions1=[xi_1+1/a > 0, ],
restrictions2=[xi_1+1/a > 0, ],
)
show(GC1_to_GC1.display())
CC_to_GC1=CC.transition_map(
GC1,
[
arctanh(a*t/(1+a*(x-X1)))/a,
(-a^2*t^2 +a*(x-X1)*(2+a*(x-X1)))/(sqrt(-a^2*t^2 + (1+a*(x-X1))^2,hold=True) +1)/a
]
,restrictions1=(
x-X1 +1/a >0,
#((x-X1) +1/a)**2 - t**2>0
t > -x - 1/a + X1,
t < x + 1/a - X1,
)
,restrictions2=(
xi_1 +1/a >0,
# tau_1 > -xi_1 - 1/a + X1,
# tau_1 < xi_1 + 1/a - X1,
)
)
#CC_to_GC1.set_inverse((1+a*xi_1)*sinh(a*tau_1)/a,
# ((1+a*xi_1)*cosh(a*tau_1)-1)/a+L
# )
GC1_to_CC=GC1.transition_map(
CC,
[(1+a*xi_1)*sinh(a*tau_1)/a, ((1+a*xi_1)*cosh(a*tau_1)-1)/a+X1]
,restrictions1=( a > 0, xi_1 +1/a >0,
)
,restrictions2=( a > 0, x-X1 + 1/a >0,
# ((x-X1) +1/a)**2 - t**2>0
t > -x - 1/a + X1,
t < x + 1/a - X1,
)
)
#GC1_to_CC.set_inverse(arctanh(a*t/(1+a*(x-X1)))/a,
# (-a^2*t^2 +a*(x-X1)*(2+a*(x-X1)))/(sqrt(-a^2*t^2 + (1+a*(x-X1))^2) +1)/a,
# )
(CC_to_GC1*GC1_to_CC).display(), (GC1_to_CC*CC_to_GC1).display()
[e.subs(abs(-X1*a+a*x+1)==-X1*a+a*x+1).simplify_full() for e in M.coord_change(CC,CC)(t,x)]
M.coord_change(CC,GC1).display()
M.coord_change(GC1,CC).display()
$\mathcal{GC}$ と $\mathcal{GC1}$¶
Rの固有座標系$\mathcal{GC}$とR1の固有座標系$\mathcal{GC1}$との相互の関係を調べます。$\mathcal{GC1}$が意味を持つ$M$の部分空間$U_1$も定義しておきます。
assume(a*X1 < 1);assume(a >0)
U1 = M.open_subset('U1',
coord_def={
CC:(
x - X1 + 1/a > 0,
#((x - X1) + 1/a )**2 - t**2 > 0 ,
## SageMathはcosh(tau)\pm sinh(tau) > 0を証明できない
t > -x - 1/a + X1,
t < x + 1/a - X1,
)
},
supersets=(M,)
); U1
M.subset_family(), U.subset_family()
U1 in M.subsets(), U1.intersection(M)
U1 in U.subsets(), U1.intersection(U)
M.intersection(U), U.intersection(U1),M.union(U),U1.union(U),U.is_subset(M),U1.is_subset(U)
GC→GC1の変換の存在確認¶
この段階では $\mathcal{GC} \rightarrow \mathcal{GC1}$の座標変換は存在しません。
try:
M.coord_change(GC,GC1).display()
except TypeError as m:
print(m)
the change of coordinates from Chart (M, (tau, xi)) to Chart (M, (tau_1, xi_1)) has not been defined on the 2-dimensional Lorentzian manifold M
GC->GC1¶
$\mathcal{CC} \rightarrow \mathcal{GC1}$と$\mathcal{GC} \rightarrow \mathcal{CC}$を組み合わせて$\mathcal{GC} \rightarrow \mathcal{GC1}$ を求めます。 この変換の逆も同様に求めます。
M.coord_change(CC,GC1)*M.coord_change(GC,CC)
show(M.coord_change(GC,GC1).display())
( M.coord_change(CC,GC)*M.coord_change(GC1,CC)).display()
逆変換の確認¶
求めた変換がお互いに逆変換になっていること確認してみましょう。
( M.coord_change(GC1,GC)*M.coord_change(GC,GC1)).display()
( M.coord_change(GC,GC1)*M.coord_change(GC1,GC)).display()
R1(s).coord(CC),R1(s).coord(GC),R1(s).coord(GC1)
R(s).coord(CC),R(s).coord(GC),R(s).coord(GC1)
$R$ の $U_1$に含まれる部分¶
以下のように、$R$の全体は$U_1$に含まれない部分を持っています。 $U_1$に含まれる(あるいは意味のある$GC$の)部分空間に属する世界線の 領域を特定しましょう。 $R_1$は三つの部分空間にガップリと含まれています。
R1(s) in M, R1(s) in U, R1(s) in U1
R(s) in M, R(s) in U, R(s) in U1
Q(s) in M, Q(s) in U, Q(s) in U1
$R$の$U_1$に含まれる範囲¶
R(s).coord(GC1)
この座標が意味を持つ(実数値となる)ためには、 $$1+\alpha^2 X_0^2 -2 \alpha X_1 \cosh(\alpha s) > 0$$ であることが必要となります。これから、 $$ |s| < \frac{1}{\alpha}\cosh^{-1}(\frac{1+\alpha^2 X_1^2}{2\alpha X_1}) $$ の範囲であることが確認できました。
show(R(s).coord(GC1)[1].denominator().operands()[0].operands()[0])
solve(R(s).coord(GC1)[1].denominator().operands()[0].operands()[0],s)
R1(s).coord(GC),R1(s).coord(GC1),R1(s_R).coord(SC_R)
Q(s)の$U1$に含まれる部分の特定¶
Q(s).coord(GC),Q(s).coord(CC),Q(s).coord(GC1)
Q(s).coord(GC1)[1].denominator().operands()[0].operands()[0]
sol=solve(Q(s).coord(GC1)[1].denominator().operands()[0].operands()[0],s,ivar=(L,X1,a))
show(sol[0])
sol[0].rhs().operands()[1].operands()[0].simplify_full()
同様に、$Q$の世界線についても考察します。 この座標が意味を持つ(実数値となる)ためには、 $$ {-2 \left(L {\alpha} +1\right) X_{1} {\alpha} \cosh\left({\alpha} s\right) + \left(L {\alpha} + 1\right)^2 + X_{1}^{2} {\alpha}^{2} }> 0$$ であることが必要となります。これから、 $$ |s| < \frac{1}{\alpha}\cosh^{-1}\left( \frac{\left(L {\alpha} + 1\right)^2 + X_{1}^{2} {\alpha}^{2} } {2\alpha X_1\left(1+\alpha L\right)} \right) $$ の範囲であることが求められます。
CCの静止した点¶
show(OC(L)(s).coord(GC1)) or show(OC(L)(s).coord(CC))
OC(L)(s).coord(GC1)[1].denominator().operands()[0].operands()[0]
show((OC(L)(s).coord(GC1)[1].denominator().operands()[0].operands()[0]).collect(s).collect(a))
solve((OC(L)(s).coord(GC1)[1].denominator().operands()[0].operands()[0])==0,s)
# GC の場合、
show((OC(L)(s).coord(GC)[1].denominator().operands()[0].operands()[0]).collect(s).collect(a))
solve((OC(L)(s).coord(GC)[1].denominator().operands()[0].operands()[0])==0,s)
GC1では、 $$ (L^2 -2 L X_1 + X_1^2 - s^2)\alpha^2 + 2(L-X1) \alpha +1 >0 $$ より $$ |s| < \frac{|(L-X_1) \alpha +1|}{\alpha} $$ GCでは $$ |s| < |\frac{1+ \alpha L}{\alpha}| $$
Q:
$$ |s| < \frac{1}{\alpha}\cosh^{-1}\left( \frac{\left(L {\alpha} + 1\right)^2 + X_{0}^{2} {\alpha}^{2} } {2\alpha X_0\left(1+\alpha L\right)} \right) $$
R:
$$ |s| < \frac{1}{\alpha}\cosh^{-1}(\frac{1+\alpha^2 X_0^2}{2\alpha X_0}) $$
O: $$ |s| < 1/a |(L-X_1) \alpha +1| $$
show(solve((R(s).coord(GC)[0]==Q(s1).coord(GC)[0])*cosh(a*s),s1))
show(solve((R(s).coord(GC)[0]==R1(s1).coord(GC)[0])*cosh(a*s),s1))
acl_list=(0.01, 0.2, 0.5, 1.0, 4)
Lp=0.1;Xp=0.1;x_max=1.2
amb_chart=CC
amb_coords=amb_chart[1:]+amb_chart[:1]
s1
gls=[]
for ac,lc in zip(acl_list, plt.rcParams['axes.prop_cycle']()):
gls += (
Qc(ac, Lp).plot(
amb_chart, ambient_coords=amb_coords,
parameters={a:ac,L:Lp},
prange=(0, acosh((1+ac*x_max)/(1+ac*Lp))/ac),
thickness=2, color=lc["color"], style="--" , plot_points =200,
),
Rc(ac,Xp).plot(
amb_chart, ambient_coords=amb_coords,
parameters={a:ac,L:Lp}, prange=(0, acosh(1+ac*(x_max-Xp))/ac),
thickness=2, color=lc["color"], style="-.", plot_points =200,
),
Rc(ac, 0).plot(
amb_chart, ambient_coords=amb_coords,
parameters={a:ac,L:Lp}, prange=(0, acosh(1+ac*(x_max-0))/ac),
thickness=2, color=lc["color"], style="-", plot_points =200,
),
Rc(ac,0)(2/(1+ac)).plot(
plot_chart, ambient_coords=amb_coords,
color=lc["color"], label_offset=0.02, size=20,
label= f"$R_{{a={ac:.2f}}}$",
parameters={a:ac,L:Lp}
),
Rc(ac,Xp)(2/(1+1*ac)+asinh(a*Xp*sinh(2/(1+1*ac)))).plot(
plot_chart, ambient_coords=amb_coords,
color="purple", label_offset=0.02,size=20,
label= f"$R_1$",
parameters={a:ac,L:Lp, }
),
Qc(ac, Lp)(2/(1+1*ac)).plot(
plot_chart, ambient_coords=amb_coords,
color=lc["color"], label_offset=0.02,size=20,
parameters={a:ac,L:Lp,},
label=f"$Q$",
)
)
gl=sum(gls)
gl.show(gridlines="automatic",xmin=-0.1, xmax=x_max, ymin=0, ymax=2)
次に示す図は、1のロケットの瞬時静止系での同様のそれぞれの時空点の軌跡を描画しています。
SageManifoldでambient_coords の設定を変えることで異なる座標系での軌跡を描画します。
def plot_worldlines(ac, line_color, plot_chart=GC, Xp=Lp):
amb_coords=plot_chart[1:]+plot_chart[:1]
label_R=f"$R_{{\\alpha={ac:.2g} }}$"
gls=(
Qc(ac,Xp).plot(plot_chart, ambient_coords=amb_coords,
style="-.", thickness=2, plot_points =200,
color=line_color, parameters={a:ac,L:Xp,X0:Xp} )
, Rc(ac, Xp).plot(plot_chart, ambient_coords=amb_coords,
style=":", thickness=2, plot_points =200,
color=line_color, parameters={a:ac,L:Xp,X0:Xp})
, Rc(ac, 0).plot(plot_chart, ambient_coords=amb_coords,
style="--", thickness=2, plot_points =200,
color=line_color, parameters={a:ac,L:Xp,X0:Xp},)
, Rc(ac, 0)(2/(1+ac)).plot(
plot_chart, ambient_coords=amb_coords, parameters={a:ac,L:Xp,X0:Xp},
color=line_color, size=20,label_offset=0.001,
label=label_R,
)
, Rc(ac, Xp)(2/(1+1*ac)+asinh(a*Xp*sinh(2/(1+1*ac)))).plot(
plot_chart, ambient_coords=amb_coords,parameters={a:ac,L:Xp,X0:Xp},
color="purple", label_offset=0.001, size=20, label=f"$R_1$",
)
, Qc(ac, Xp)(2/(1+1*ac)).plot(
plot_chart, ambient_coords=amb_coords, parameters={a:ac,L:Xp,X0:Xp},
color=line_color, label_offset=0.001, size=20, label=f"Q",
)
)
return sum(gls)
acl_list=(0.01, 0.2, 0.5, 0.99, 1.0, 2.0
)
## CC
gls=(plot_worldlines(ac, lc["color"], plot_chart=CC, Xp=0.1)
for ac,lc in zip(acl_list,
plt.rcParams['axes.prop_cycle']())
)
gl=sum(gls)
gl.show(gridlines="automatic",ymax=2, ymin=0, xmax=1, xmin=-0.1)
# GC
gl=sum((plot_worldlines(ac, lc["color"],plot_chart=GC, Xp=0.1)
for ac,lc in zip(acl_list,
plt.rcParams['axes.prop_cycle']())
))
gl.show(gridlines="automatic", ymin=0, xmax=0.25, xmin=-0.05,ymax=2.5)
この様に、$R$の固有座標系でみれば、$Q$はロケット内の同じ位置にあるように見えます。 一方$R1$は時間の経過とともに遠ざかってしまいます。
2台目のロケットの静止座標系からみた運動¶
R-GCと同様にR1の静止座標系$\mathcal{GC_1}$を考えましょう。$\mathcal{GC_1}$でカバーできる部分多様体をU1としましょう。U1はCCでみて、Uを空間方向にX1だけシフトした部分空間になっています。
ここで$X_1$はU1を定義する定数としての意味を持ちます。
R1(s_r1).coord()
R1(s_r1) in M, R1(s_r1) in U, R1(s_r1) in U1
assume(a*L < 1);assume(tau < -log(a*L));assume(tau > log(a*L))
R(s) in M, R(s) in U, R(s) in U1
Rの軌跡は、一部だけがU1に入ります。 $\alpha X_1 >=1$ の場合、U1に入るRの軌跡は存在しません。 $\alpha X_1 <1$の場合には、 $$ |s| < \frac{\operatorname{arcosh}\left(\frac{1}{2} \, X_{1} {\alpha} + \frac{1}{2 \, X_{1} {\alpha}}\right)}{{\alpha}} $$ に相当するRの軌跡がU1に入ります。
show(R(s).coord(GC1)[1])
sol_s=solve(R(s).coord(GC1)[1].denominator().operands()[0].operands()[0]==0,s)
show(sol_s[0])
show(R(s).coord(GC1)[0])
amb_chart=CC
amb_coords=amb_chart[1:]+amb_chart[:1]
eps=1e-6
ac=0.2
GC1.plot(amb_chart,amb_coords,color="blue",
ranges={
tau_1:(-1/ac+eps,1/ac-eps),
xi_1:(-1/ac+eps,2/ac/3-eps),
},
parameters={a:ac, X1:1},
number_values=7,
)
amb_chart=GC
amb_coords=amb_chart[1:]+amb_chart[:1]
ac=0.2
CC.plot(amb_chart,amb_coords,color="blue",
ranges={
x:(-1/ac/3+eps, 3/ac/3-eps),
t:(-2/ac/3+eps,2/ac/3-eps),
},
parameters={a:ac, X1:1},
number_values=9,
).show(xmin=-1/ac,xmax=1/ac,ymin=-10,ymax=10)
amb_chart=GC1
amb_coords=amb_chart[1:]+amb_chart[:1]
ac=0.2
x_min= -1/ac/3+eps
x_max=1/ac-eps
xi_max= 1/ac-eps
t_max=1/ac*tanh(ac*xi_max)*(1+ac*x_min)
xi_min=-1/ac+eps
CC.plot(amb_chart,amb_coords, color="blue",
ranges={
x:(0, x_max),
t:(-t_max,t_max), },
parameters={a:ac, X1:1},
number_values=7,
)
acl=0.2
eps=1e-6
l0=0.1;x0=0.2;xp=0.2
xi_max= 1/acl-eps
xi_min=-1/acl+eps
x_min= -1/acl/2+eps
x_max=1/acl+eps
t_max=1/acl*tanh(acl*xi_max)*(1+acl*x_min)
min_t=-t_max
min_xi_1= (-1/acl+xp)/3; min_tau_1=atanh(acl*min_t/(1-acl*xp))
max_xi_1= -min_xi_1 ; max_tau_1= -min_tau_1
amb_chart=GC
amb_coords=amb_chart[1:]+amb_chart[:1]
gl= sum(((achart).plot(
amb_chart, ambient_coords=amb_coords,
parameters={a:acl, L:l0, X1:x0, X0:x0},
ranges={
x:(x_min, x_max),
t:(-t_max,t_max),
xi:(xi_min, xi_max),
tau:(-t_max, t_max),
xi_1:(xi_min,xi_max),
tau_1:(-t_max,t_max)
},
number_values=7,
color=lparm["color"]
)) for achart, lparm in zip((CC,GC,GC1), plt.rcParams['axes.prop_cycle']()))
show(gl,xmin=-5, xmax=5,)
gl+=(LC_f(0).plot(amb_chart, ambient_coords=amb_coords,
prange=(0,2*max_range),
color="gold", parameters={a:acl, L:0.1, X1:0.1, X0:0.1},
number_values=7,)
+LC_b(0).plot(amb_chart, ambient_coords=amb_coords,
prange=(0,2*max_range),
color="orange", parameters={a:acl, L:0.1,X1:0.1, X0:0.1},
number_values=7,)
)
gl+=(LC_f(-0.5/acl+eps).plot(amb_chart, ambient_coords=amb_coords, thickness=2,
parameters={a:acl, L:0.1,X1:0.1, X0:0.1}, color="gold")
+LC_b(-0.5/acl+eps).plot(amb_chart, ambient_coords=amb_coords, thickness=2,
parameters={a:acl, L:0.1,X1:0.1, X0:0.1},color="orange")
)
gl+=(LC_f(-1/acl+eps).plot(amb_chart, ambient_coords=amb_coords, thickness=2,
parameters={a:acl, L:0.1,X1:0.1, X0:0.1}, color="gold")
+LC_b(-1/acl+eps).plot(amb_chart, ambient_coords=amb_coords, thickness=2,
parameters={a:acl, L:0.1,X1:0.1, X0:0.1},color="orange")
)
show(gl,xmin=-5,xmax=5,ymin=-2,ymax=2)
def Draw_CahrtPlot(acl=0.2,
amb_min=0,
amb_max=5,
amb_chart=GC,
xp=0.1):
eps=1e-2
min_x = -1/acl/3 ; min_t= -3/5*amb_max
max_x= amb_max ; max_t=-min_t
min_xi= min_x ; min_tau= atanh(acl*min_t)/acl
max_xi= max_x ; max_tau= -min_tau
min_xi_1= (-1/acl+xp)/3; min_tau_1=atanh(acl*min_t/(1-acl*xp))
max_xi_1= -min_xi_1 ; max_tau_1= -min_tau_1
gl= sum(
((achart).plot(
amb_chart, ambient_coords=amb_chart[1:]+amb_chart[:1],
parameters={a:acl,
X1:xp,
L:xp,
},
ranges={
x:(min_x, max_x),
t:(min_t/2 , max_t/2),
xi:(min_xi/2, max_xi/2),
tau:(min_tau/2, max_tau/2),
xi_1:(min_xi_1, max_xi_1),
tau_1:(min_tau_1, max_tau_1),
},
number_values=7,
color=lparm["color"]
)
) for achart, lparm in zip([CC, GC, GC1],
plt.rcParams['axes.prop_cycle']()))
gl.xmax(x_max);gl.xmin(x_min);
gl.ymax(x_max);gl.ymin(x_min);
return gl
acl=0.3
Xp=0.1
show(Draw_CahrtPlot(acl,amb_chart=CC, xp=Xp).show())
show(Draw_CahrtPlot(acl,amb_chart=GC, xp=Xp).show())
show(Draw_CahrtPlot(acl,amb_chart=GC1,xp=Xp,).show())
R,Q,R1の世界線をR,R1の固有座標系で見てみましょう¶
$\mathcal{GC1}$では、$R$ や $Q$の世界線はその一部しか、$\mathcal{GC1}$がカバーする空間$U1$に含まれません。世界線を表示する際には、$U1$に含まれる範囲を明確に指定する必要があります。
# 一台目のロケットの固有時刻\tauでの瞬時静止座標系で見た、ロケット1の時空点
def P_R1_U1(ac, s, x_0=0, pname="$P_{R1}$"):
"""
欲しいのは、ロケットの固有時が\\tauの時に、その瞬時静止系での時刻 が\\tauとなるロケット_1のCCでの座標(t,x)です。
T(a,tau1)=(X0+Z(a,tau1)+1/a)*tanh(a*tau)
を満たす\\tau1が求まれば、よいことになります。
これは上記の計算から
tau1=(tau+arcsinh(X0*a*sinh(a*tau))/a)
となります。
"""
s1=(s+arcsinh(x_0*ac*sinh(ac*s))/ac)
return M.point(
(T(ac, s1), Z(ac, s1, x_0)),
CC,
name=f"{pname}_{{tau1}}",
latex_name=f"{{{pname}}}_{{\\tau1}}"
)
plot_chart=GC1
amb_coords=plot_chart[1:]+plot_chart[:1]
ac=0.2;L0=0.2
#assume(ac, ac*L0 < 1)
gl=Rc(ac,0.0).plot(plot_chart, ambient_coords=amb_coords,
thickness=2, style="-", color="gold",
parameters={a:ac, L:L0, X1:0.0} )
gl+=Rc(ac,L0).plot(plot_chart, ambient_coords=amb_coords,
thickness=2, style="--", color="green",
parameters={a:ac, L:L0, X1:L0 } )
gl+=Qc(ac,L0).plot(plot_chart, ambient_coords=amb_coords,
thickness=2, style="-.", color="red",
parameters={a:ac, L:L0 , X1:0} )
gl.show(gridlines="automatic", xmin=-1, xmax=1, ymin=0, ymax=2)
Q(s).coord(GC1)
solve(((Q(s).coord(GC1)[1].denominator()-1)**2).simplify_full(),s,ivar=(L,X1,a))
plot_chart=GC1
amb_coords=plot_chart[1:]+plot_chart[:1]
ac=0.5;L0=0.2
sqmax=acosh( (2*(1+L0*ac)*L0*ac+1)/2/(1+L0*ac)/L0/ac)/ac-eps
gl=Qc(ac,L0).plot(plot_chart, ambient_coords=amb_coords,
thickness=2, style="--", color="green", plot_points=1000,
prange=(-sqmax,sqmax),
parameters={a:ac, X1:L0,L:L0 } )
gl.show(gridlines="automatic", xmin=-2, xmax=0.1,ymin=-10,ymax=10 )
var('X0')
OC(0)(s).coord(GC1)
var('X')
show( ((OC(X)(s).coord(GC1)[1].denominator()-1)**2).factor())
solve(((OC(X)(s).coord(GC1)[1].denominator()-1)**2).simplify_full() == 0,s)
#次のようにしても、SQRTの中の式を取り出すことができます。
show(OC(X)(s).coord(GC1)[1].denominator().operands()[0].operands()[0])
solve(OC(X)(s).coord(GC1)[1].denominator().operands()[0].operands()[0] == 0, s)
show((Qc(a,L)(s).coord(GC1)[1].denominator()-1)**2)
solve( (Qc(a,L)(s).coord(GC1)[1].denominator()-1)**2, s, ivar=(a,L,X1))
show((Rc(a,L)(s).coord(GC1)[1].denominator()-1)**2)
solve((Rc(a,L)(s).coord(GC1)[1].denominator()-1)**2 == 0, s,ivar=(a,L,X1))
show(OC(L-eps)(s).coord(GC1))
solve(
OC(L)(s).coord(GC1)[1].denominator().operands()[0].operands()[0]
, s)
plot_chart=GC1
amb_coords=plot_chart[1:]+plot_chart[:1]
ac=0.4;l0=0.1;x0=0.1
eps=1e-6
#smax=sqrt(1+2*(l0-x0)*ac+(l0-x0)**2*ac**2)/ac-eps
smax=1/ac+(l0-x0)-eps
sqmax=acosh(((1+l0*ac)**2+X0**2*ac**2)/(1+l0*ac)/(2*ac*x0))/ac-eps
sr1max=acosh(((l0-x0)**2*ac**2+1)/(2*ac*(l0-x0)))/ac-eps
srmax=acosh((x0**2*ac**2+1)/(2*ac*x0))/ac-eps
gl = OC(eps).plot(
plot_chart, ambient_coords=amb_coords,
thickness=2, style="--", color="blue",
plot_points=4000, prange=(-smax+1.005*l0,smax-1.005*l0),
parameters={a:ac, X1:x0, L:l0, X0:x0 } )
gl.show(gridlines="automatic", xmin=-4. , xmax=0.2, ymin=-20, ymax=20)
plot_chart=GC1
amb_coords=plot_chart[1:]+plot_chart[:1]
ac=0.4;L0=0.1;X0=L0
eps=1e-2
L0=0.1
smax=abs(1/ac+X0-L0)-eps
sqmax=acosh(((1+L0*ac)**2+X0**2*ac**2)/(1+L0*ac)/(2*ac*X0))/ac-eps
sr1max=acosh(((L0-X0)**2*ac**2+1)/(2*ac*(L0-X0)))/ac-eps
srmax=acosh((X0**2*ac**2+1)/(2*ac*X0))/ac-eps
gl=OC(eps).plot(plot_chart, ambient_coords=amb_coords,
thickness=2, style="--", color="blue",
plot_points=500, prange=(-1/ac+L0+eps,1/ac-L0-eps),
parameters={a:ac, X1:X0, L:X0, X0:0} )
gl+=Rc(ac,L0).plot(plot_chart, ambient_coords=amb_coords, plot_points=2000,
style="-.", thickness=2, color='red',
prange=(-sr1max,sr1max),
parameters={a:ac,X1:X0,L:L0})
gl+=Rc(ac,0).plot(plot_chart, ambient_coords=amb_coords, plot_points=2000,
style="-.", thickness=2, color='red',
prange=(-srmax,srmax),
parameters={a:ac,X1:X0,L:L0})
gl.show(gridlines="automatic", xmin=-4, xmax=0.2, ymin=-10, ymax=10)
# Rac=0.5 GC:Rの固有座標系
plot_chart=CC
amb_coords=plot_chart[1:]+plot_chart[:1]
L0=0.1;X0=0.1
ac=1
smax=1/ac-eps
gl=OC(eps).plot(plot_chart, ambient_coords=amb_coords,
style=":",thickness=2,
color="blue", parameters={a:ac,L:L0,X1:X0,X0:X0} )
gl +=Qc(ac, L0).plot(plot_chart, ambient_coords=amb_coords, style="--",thickness=2,
plot_points=2000,
color="green", parameters={a:ac,L:L0,X1:X0} )
gl +=Rc(ac, 0.0).plot(plot_chart, ambient_coords=amb_coords, style="-",thickness=2,
plot_points=2000,
color="red", parameters={a:ac,L:L0,X1:X0}, )
gl +=Rc(ac, X0).plot(plot_chart, ambient_coords=amb_coords, style="-.",thickness=2,
plot_points=2000,
color="gold", parameters={a:ac,L:L0,X1:X0}, )
gl.show(gridlines="automatic", xmin=-0.1, xmax=2, ymin=0,ymax=2)
plot_chart=CC
amb_coords=plot_chart[1:]+plot_chart[:1]
L0=0.2;X0=L0
smax=1/ac-eps
show(Qc(ac,L0).plot(plot_chart, ambient_coords=amb_coords,
style="--", thickness=2, color="green", plot_points=2000,
prange=(-smax,smax),
parameters={a:ac, X1:X0, L:L0} ))
plot_chart=CC
amb_coords=plot_chart[1:]+plot_chart[:1]
ac=1;L0=0.2;X0=L0
smax=1/ac-eps
sp=1/(1+5*ac)
gls=sum(
(OC(0).plot(plot_chart, ambient_coords=amb_coords,
style="-", thickness=2, color="blue", plot_points=2000,
parameters={a:ac, X1:L0, L:L0} )
, Qc(ac,L0).plot(plot_chart, ambient_coords=amb_coords,
style="--", thickness=2, color="green", plot_points=2000,
parameters={a:ac, X1:X0,L:L0} )
, Rc(ac,L0).plot(plot_chart, ambient_coords=amb_coords, plot_points=2000,
style="-.", thickness=2, color='red',
parameters={a:ac, X1:X0,L:L0})
, Rc(ac,0).plot(plot_chart, ambient_coords=amb_coords, plot_points=2000,
style="-", thickness=2, color="magenta",
parameters={a:ac, X1:X0,L:L0}, )
,Rc(ac,0)(sp).plot(plot_chart, ambient_coords=amb_coords,
color="magenta",
parameters={a:ac, X1:L0,L:X0, X0:X0},size=20,
label_offset=0.01, label="R"
)
, Rc(ac,L0)(sp+arcsinh(X0*ac*sinh(ac*sp)/ac)).plot(
plot_chart, ambient_coords=amb_coords,
color="red", parameters={a:ac, X1:L0,L:X0, X0:X0}, size=20,
label_offset=0.005, label="R1",
)
,Q(sp).plot(plot_chart, ambient_coords=amb_coords,
color="green", parameters={a:ac, X1:L0,L:X0, X0:X0}, size=20,
label_offset=0.005,label="Q",
#label=f"a={ac:.2f}\ntau={2/(13+ac):.2f}"
)
))
show(gls,xmin=0,xmax=2,ymin=0, ymax=4)
def plot_worldlines2(ac, line_color, plot_chart=GC1, L0=L0,X0=0):
amb_coords=plot_chart[1:]+plot_chart[:1]
eps=1e-6
smax=1/ac-L0-eps
sqmax=acosh(((1+L0*ac)**2+X0**2*ac**2)/(1+L0*ac)/(2*ac*X0))/ac-eps
sr1max=acosh(((L0-X0)**2*ac**2+1)/(2*ac*(L0-X0)))/ac-eps
srmax=acosh((X0**2*ac**2+1)/(2*ac*X0))/ac-eps
sp=1/(1+0.5*ac)
gls=(
OC(eps).plot(plot_chart, ambient_coords=amb_coords,
style=":", thickness=2, color="blue", plot_points=2000,
prange=(-smax,smax),
parameters={a:ac,X1:L0,L:L0,X0:X0} )
, Qc(ac,L0).plot(plot_chart, ambient_coords=amb_coords,
style="--", thickness=2, color="green", plot_points=2000,
prange=(-sqmax,sqmax),
parameters={a:ac,X1:X0,L:L0,X0:X0} )
, Rc(ac,L0).plot(plot_chart, ambient_coords=amb_coords, plot_points=2000,
style="-.", thickness=2, color='red',
prange=(-sr1max,sr1max),
parameters={a:ac,X1:X0,L:L0})
, Rc(ac,0).plot(plot_chart, ambient_coords=amb_coords, plot_points=2000,
style="-", thickness=2, color="magenta",
prange=(-srmax,srmax),
parameters={a:ac,X1:X0,L:L0}, )
, OC(eps)(sp).plot(plot_chart, ambient_coords=amb_coords,
color="blue",
parameters={a:ac, X1:L0,L:X0, X0:X0},size=20,
label_offset=0.01, label="O"
)
, Rc(ac,0)(sp).plot(plot_chart, ambient_coords=amb_coords,
color="magenta",
parameters={a:ac, X1:L0,L:X0, X0:X0},size=20,
label_offset=0.01, label="R"
)
, Rc(ac,L0)(sp+arcsinh(L0*ac*sinh(ac*sp)/ac)).plot(
plot_chart, ambient_coords=amb_coords,
color="red", parameters={a:ac, X1:L0,L:X0, X0:X0}, size=20,
label_offset=0.005, label="R1",
)
,Q(sp).plot(plot_chart, ambient_coords=amb_coords,
color="green", parameters={a:ac, X1:L0,L:X0, X0:X0}, size=20,
label_offset=0.005,label="Q",
#label=f"a={ac:.2f}\ntau={2/(13+ac):.2f}"
)
)
return sum(gls)
gl=plot_worldlines2(1, 'green', plot_chart=CC, L0=0.1,X0=0.1) # 静止系
gl.show(gridlines="automatic", xmin=-0.1, xmax=0.5, ymin=0, ymax=1)
gl=plot_worldlines2(1, 'green', plot_chart=GC, L0=0.1, X0=0.1) # Rの固有座標系
gl.show(gridlines="automatic", xmin=-0.5, xmax=0.2, ymin=0,ymax=1.5)
gl=plot_worldlines2(1.0, 'green', plot_chart=GC1, L0=0.1,X0=0.1) #R1の固有座標系
gl.show(gridlines="automatic", xmin=-0.9, xmax=0.1, ymin=0, ymax=4)
一台目のロケットの固有静止座標系でみた、時刻 sでのロケット1の時空点¶
一台目のロケットの固有静止座標系でみた、時刻$\tau$でのロケット1の時空点を与える関数 P_R1を定義します。
欲しいのは、ロケットの固有時が$\tau$の時に、その固有静止系での時刻 が$\tau$となる ロケット_1のCCでの座標(t,x)です。 T(a,s1)=(X1+Z(a,s1)+1/a)tanh(atau) を満たす$s1$が求まれば、よいことになります。 これは下記の計算から $$ s_1=\tau+\sinh^{-1}(X_1\,\alpha\,\sinh(\alpha\,\tau))/\alpha) \\ {s_1} = \frac{{\alpha} {\tau} + \operatorname{asinh}\left(X_{1} {\alpha} \sinh\left({\alpha} {\tau}\right)\right)}{{\alpha}} $$ となります。
P_R1(ac,s,X1)はR1(s+arcsinh(X1asinh(a*s))/a)と等価です。
solve((solve((R1(s1).coord(GC)[0] == tau) , s1)[0]*cosh(a*tau)).reduce_trig(),s1)
def P_R1(ac, s, x0=0, pname="$P_{R1}$"):
"""
"""
s1=(s+arcsinh(x0*ac*sinh(ac*s))/ac)
return M.point(
(T(ac, s1), Z(ac, s1, x0)),
CC,
name=f"{pname}_{{tau1}}",
latex_name=f"{{{pname}}}_{{\\tau1}}"
)
指定された座標系(plot_chart)で、複数の加速(acl_list)について、$R$, $Q$,$R1$の世界線を描画する関数
worldline3を定義します。 $Q$,$R1$の出発時の位置をX0で指定します。$\mathcal{CC}$の原点($x=0$)の世界線も$O$として描画します。
show(solve(Rc(a,0)(s).coord(GC)[0]==OC(-1e-7)(s1).coord(GC)[0],s1))
show(solve(Rc(a,0)(s).coord(GC1)[0]==OC(-1e-7)(s1).coord(GC1)[0],s1))
def worldlines3(plot_chart=GC1, X0=0.2, acl_list=(0.4, 0.8, 1.2)):
plot_chart=plot_chart
amb_coords=plot_chart[1:]+plot_chart[:1]
L0=X0
np=3000
max_range=1+1/0.2
eps=1e-6
smax=1/ac-eps
sqmax=acosh(((1+L0*ac)**2+X0**2*ac**2)/(1+L0*ac)/(2*ac*X0))/ac-eps
sr1max=acosh(((L0-X0)**2*ac**2+1)/(2*ac*(L0-X0)))/ac-eps
srmax=acosh((X0**2*ac**2+1)/(2*ac*X0))/ac-eps
gl = sum([
OC(eps).plot(plot_chart, ambient_coords=amb_coords,
prange=(0,1/ac-eps-L0),
style=":", thickness=2, color=lc["color"], plot_points=np,
parameters={a:ac, X1:L0,L:X0, X0:X0} )
+Qc(ac,L0).plot(plot_chart, ambient_coords=amb_coords,
prange=(0,
acosh(((1+L0*ac)**2+X0**2*ac**2)/(1+L0*ac)/(2*ac*X0))/ac-eps),
style="--", color=lc["color"], thickness=2,plot_points=np,
parameters={a:ac, X1:L0,L:X0, X0:X0})
+Rc(ac,L0).plot(plot_chart, ambient_coords=amb_coords,
prange=(0,
acosh(((L0-X0)**2*ac**2+1)/(2*ac*(L0-X0)))/ac-eps),
style="-.", color=lc["color"], thickness=2,plot_points=np,
parameters={a:ac, X1:L0,L:X0, X0:X0})
+Rc(ac,0).plot(plot_chart,ambient_coords=amb_coords,
prange=(0,
acosh((X0**2*ac**2+1)/(2*ac*X0))/ac-eps),
style="-", color=lc["color"], thickness=2,plot_points=np,
parameters={a:ac, X1:L0,L:X0, X0:X0} )
for ac, lc in zip(acl_list,
plt.rcParams['axes.prop_cycle']())]
)
#gl.show(gridlines="automatic", xmin=-0.3, xmax=0.1, ymin=0,ymax=2)
# 世界線の名前を追加します。
#sp_r=1/(1+ac)
#s_o=(1-ac*X0)/ac*tanh(ac*sp_r)+eps
gl += sum([Rc(ac,0)(1/(1+0.5*ac)).plot(plot_chart, ambient_coords=amb_coords,
color=lc["color"],
parameters={a:ac, X1:L0,L:X0, X0:X0},size=20,
label_offset=0.01, label="R"
)
for ac,lc in zip(acl_list,
plt.rcParams['axes.prop_cycle']())])
# gl.show(gridlines="automatic", xmin=-0.3, xmax=0.1, ymin=0, ymax=2)
gl += sum([
OC(eps)( tanh(ac/(1+0.5*ac))/ac+eps).plot(plot_chart, ambient_coords=amb_coords,
color=lc["color"],
parameters={a:ac, X1:L0,L:X0, X0:X0},size=20,
label_offset=0.01, label="O"
)
+Rc(ac,X0)(1/(1+0.5*ac)+arcsinh(X0*ac*sinh(ac/(1+ac)))/ac).plot(
plot_chart, ambient_coords=amb_coords,
color=lc["color"], parameters={a:ac, X1:L0,L:X0, X0:X0}, size=20,
label_offset=0.005, label="R1",
)
+Q(1/(1+0.5*ac)).plot(plot_chart, ambient_coords=amb_coords,
color=lc["color"], parameters={a:ac, X1:L0,L:X0, X0:X0}, size=20,
label_offset=0.005,label="Q",
#label=f"a={ac:.2f}\ntau={2/(1+ac):.2f}"
)
for ac,lc in zip(acl_list,
plt.rcParams['axes.prop_cycle']())]
)
#gl.show(gridlines="automatic", xmin=-0.25, xmax=0.1, ymin=0, ymax=2)
return gl
worldlines3(CC).show(gridlines="automatic", xmin=-0.1, xmax=1, ymin=0, ymax=2)
worldlines3(GC).show(gridlines="automatic", xmin=-0.6, xmax=0.3, ymin=0, ymax=1.0)
worldlines3(GC1).show(gridlines="automatic", xmin=-1.0 , xmax=0.11, ymin=0, ymax=4)
# 終了
end_process_time = time.process_time_ns()
end_time = time.perf_counter_ns()
# 経過時間を出力(秒)
print("elapsed time:{:4.6f}".format((end_time - start_time)*1e-9),"(sec) ",
"process time:{:4.6f}".format((end_process_time - start_process_time)*1e-9),"(sec) ")
elapsed time:101.932433 (sec) process time:115.157627 (sec)
Qの固有座標系¶
$Q$ は加速 $\alpha/(1+L*\alpha)$をもち、$t=0$に$x=L$から出発した観測者。その固有座標系$\mathcal{GC_Q}$を 考えてみましょう。 $\mathcal{GC}$,$\mathcal{GC_1}$と同様に定義することができます。$\mathcal{GC_Q}$の座標を$\tau_q,\xi_q$としましょう。
assume(a > 0, 'real')
var('tau_q xi_q')
assume(tau_q, 'real') ; assume(xi_q,'real')
GCq.<tau_q, xi_q> = M.chart(
'tau_q:(-oo,+oo):\\tau_q xi_q:(-(1+L*a)/a,+oo):\\xi_q',
coord_restrictions=[
xi_q + (1+L*a)/a > 0,
]
)
GCq_to_GCq=GCq.transition_map( # identity map.
GCq,
[tau_q, xi_q],
restrictions1=[xi_q+(1+L*a)/a > 0, ],
restrictions2=[xi_q+1/a > 0, ],
)
show(GCq_to_GCq.display())
$\mathcal{CC}$ と$\mathcal{GC_q}$の間の座標変換も$\mathcal{CC} \rightarrow \mathcal{GC}$と同様に 直ちに直ちに書き下せます。
CC_to_GCq=CC.transition_map(
GCq,
[
arctanh((a/(1+L*a))*t/(1+(a/(1+L*a))*(x-L)))/(a/(1+L*a)),
(-(a/(1+L*a))^2*t^2 +(a/(1+L*a))*(x-L)*(2+(a/(1+L*a))*(x-L)))/(sqrt(-(a/(1+L*a))^2*t^2 + (1+(a/(1+L*a))*(x-L))^2) +1)/(a/(1+L*a))
]
,restrictions1=(
x + 1/(a/(1+L*a)) - L > -t ,
x + 1/(a/(1+L*a)) - L > t ,
)
,restrictions2=(
xi_q + 1/(a/(1+L*a)) > 0,
)
)
GCq_to_CC=GCq.transition_map(
CC,
[(1+(a/(1+L*a))*xi_q)*sinh((a/(1+L*a))*tau_q)/(a/(1+L*a)),
((1+(a/(1+L*a))*xi_q)*cosh((a/(1+L*a))*tau_q)-1)/(a/(1+L*a))+L]
,restrictions1=(xi_q +1/(a/(1+L*a)) > 0,)
,restrictions2=(x + 1/(a/(1+L*a)) - L > -t,
x + 1/(a/(1+L*a)) - L > t,
)
)
CC_to_GCq.display(), CC_to_GCq(*CC[:])
GCq_to_CC.display(),GCq_to_CC(*GCq[:])
CC_to_GCqとGCq_to_CCが互いに逆変換となっていることを確認します。
(GCq_to_CC*CC_to_GCq).display()
(CC_to_GCq*GCq_to_CC).display()
(CC_to_GC*GCq_to_CC).display()
第2式の分子を因数分解して、$L\alpha+\alpha\xi_q+1 > 0$ であることを使えば、
(CC_to_GC*GCq_to_CC)(tau_q,xi_q)[1].numerator().factor()
(CC_to_GC*GCq_to_CC)(tau_q,xi_q)[1].factor().simplify()
(CC_to_GC*GCq_to_CC)(tau_q,xi_q)[0].reduce_trig()
$$ \tau = \frac{\tau_q}{1+L\alpha} \\ \xi = L+\xi_q $$ であることがわかります。