2025年8月1日金曜日

fx-CG50 : ローレンツ変換の計算にみる、計算精度の問題

 先日、テレビをダラリと見ておりましたら、ローレンツ変換によって、速度 V で移動し続ける事で、時間の流れがゆっくりとなり、結果として「時間の収縮」という現象が生じる、とやっておりました。

具体例として「時速 285km で走行する新幹線に 100万年(!)乗り続けると、1秒だけ時間が縮む」との事。
まあ「100万年も乗り続ける」というのは現実離れした話ではありますが、飽くまでも思考実験であります。
そこで、手持ちの電卓で、宇宙に思いを馳せるが如く、計算してみようという次第。

まだ勉強しているので、詳細は分かりませんが、ローレンツ変換により、つぎの式で時間が収縮する様子が計算される様です。

  t' = t sqrt(1-(v/c)^2)

但し、

  • v  ; 列車の移動速度 (285 km/h)
  • c  ; 光速度  (299792358 m/sec)
  • t  ; 列車に乗っている人の経過時間
  • t' ; ローレンツ変換により、収縮したあとの時間 

これを計算するのですが、まずは多くのグラフ電卓で利用できる upython を使ってみましょう。

import math

c=299792358.0
v=285.0*1000/3600
t=100.0*10000*365.25*24*3600
k=math.sqrt(1.0-(v/c)*(v/c))
td=t*k
print('a{:24.8f}'.format(t))
print('b{:24.8f}'.format(td))
print('d{:24.8f}'.format(t-td))
これくらいならば、どの upython 電卓でも動くでしょう。
実行結果は ...
a 31557600000000.0000
b 31557599999998.8984
d              1.1015

順番に、
(a) 100万年乗車の経過時間
(b) 100万年乗車の経過時間を車両の外部から観測した経過時間
(d)  (a)-(b) の差 ... 時間収縮の量
でありますネ。

テレビの言う通り、ほぼ 1秒程度の時間収縮が得られました。( 100万年走り続けて、これかよ )

計算の共通 platform として、upython を使用しましたが、fx-CG50 の計算機画面(もしくは BASIC)で行ったら、チョットばかりクルシイ結果が ... (a), (b) が同じ値で、(d) = (a)-(b) = 0 になってしまった ... ウーム。


6 件のコメント:

K さんのコメント...

(v/c)^2が小さすぎて消えてしまうみたいなので、kを近似でごまかして1-(v/c)^2/2とみなすことで、時間減少率1-kが(v/c)^2/2くらいになるので、これにaをかけてdとみなすと1秒ちょっとの値が出ました。いいのかなこれで……

akatuki さんのコメント...

K 様、ご来訪多謝であります。

> (v/c)^2が小さすぎて消えてしまうみたいなので、kを近似でごまかして1-(v/c)^2/2とみなすことで、時間減少率1-kが(v/c)^2/2くらいになるので、これにaをかけてdとみなすと1秒ちょっとの値が出ました。いいのかなこれで……

v が c と較べると大変小さい値で、仰る様に、本来ならば近似(級数展開)をするのが正しい、というか、値をうまく得られるのであります。

一方で、電卓の機能という部分で「チョット工夫をしないとならず」になってしまいますネ。
残念ながら、fx-CG100 では、何処まで改善されているのか解りかねますが、fx-CG100 などの ClassWiz シリーズで、10進計算の部分でこうした"結果"になると、これを使う学校現場では、近似の手法をも教える事になりそうです。
ガッコの先生も、チョット大変なようですね、ハイ。

python では、2進計算でありながら、そこそこの精度が期待できるのでありますが、これはこれで「0.1 の加算問題」があり、何とも複雑になっております。

今日の小中学生も、昔の様な呑気な教育環境ではないとかで、小学1年生から英語教育が始まるわ、スマートフォンの使いこなしやらはあるは ... 。
スマートフォンなぞは「携帯ゲーム機の延長」という意識なのかも知れません。スマートフォンなどのネット環境が物心ついた時から身辺にある世代、Net-native とか言われておりますけれども、こうした世代の"教育"は、何処まで淫してみたら良いものか、という奥深い問題が横たわっている様にも思えます。

こうした、世代間ギャップ、Heterogenous といったお題は、過去にも様々考えを巡らせられて来ましたが、生成 AI の様な道具立てまで出現してしまった今日、余程、腰を据えて掛からないとならない問題の様な気がしなくもありませんが、
そうした大げさな事を言う前に「テメェはもう少し考えたらどうか ?」などと言われたら、面目ない ...

こうした「チョット賢くなったかナ ?」程度の計算が簡単に出来て、数式、方程式の束をモリモリとpre-installして、様々な値を簡便に得られる、そんなプロ電が欲しいなぁ、などと邪な事を考えていて、非ぬ所へ行き着いてしまったようであります。

fx-5800P が、内蔵数式が充実した、最後のプロ電という位置付けだと思うのですが、個人的には、Multiple Equation Solver のメカがあったらウレシイなぁ、などと。

愚痴ばかりでありました、申し訳ない。

K さんのコメント...

>> (v/c)^2が小さすぎて消えてしまうみたいなので、kを近似でごまかして1-(v/c)^2/2とみなすことで、時間減少率1-kが(v/c)^2/2くらいになるので、これにaをかけてdとみなすと1秒ちょっとの値が出ました。いいのかなこれで……
>
> v が c と較べると大変小さい値で、仰る様に、本来ならば近似(級数展開)をするのが正しい、というか、値をうまく得られるのであります。

どのくらい正確なのかちょっと気になったので、自前の有理数計算モドキと多項式の根捻出モドキを使って、先の近似値の厳密な!?有理数と厳密解をfloatで表現できる限界まで近似した値を比較してみました。そうしたら、10進表記で上から14桁まで一致していたという……光速よりかなり遅いと例の近似は絶大な効果があるのですね。標準の計算モジュールが出した近似値は精度が10桁だったので、その範囲では厳密解と完全に一致していました。

ちなみに具体的な数値は
標準の計算モジュール: 1.100315635
pythonで計算した場合: 1.100315634775979
pythonで厳密解を捻り出した場合: 1.1003156347759981~4の間

厳密解の求め方: (1-d/t)^2=k^2となるdを挟み撃ちでfloatの限界まで突き詰めた。t, k^2の値および各計算は自前の厳密な汎用アルゴリズムを用いた。

> 残念ながら、fx-CG100 では、何処まで改善されているのか解りかねますが、fx-CG100 などの ClassWiz シリーズで、10進計算の部分でこうした"結果"になると、これを使う学校現場では、近似の手法をも教える事になりそうです。

まあ、普通にやってみておかしい値になっちゃったら、こうすればいいかな?的な技を使ってみる程度で、気楽に構えれば良いとは思います。

> python では、2進計算でありながら、そこそこの精度が期待できるのでありますが、これはこれで「0.1 の加算問題」があり、何とも複雑になっております。

pythonはintが無限に桁を伸ばせるので、気楽に有理数計算みたいなことがしやすくて、個人的に気になる値を厳密に調べたい、といったことをCG-50でチマチマ計算できるのはすごく楽しいです。無理数が絡んでくると途端に厳しくなるのが辛いところですが……今回の例はなんとか無理やり対処できました^^

生成AIみたいに電気とか資源をバカ食いしないで済むのが利点だと勝手に思っています^^

akatuki さんのコメント...

K 様、御来訪多謝であります !

> どのくらい正確なのかちょっと気になったので、自前の有理数計算モドキと多項式の根捻出モドキを使って、先の近似値の厳密な!?有理数と厳密解をfloatで表現できる限界まで近似した値を比較してみました。そうしたら、10進表記で上から14桁まで一致していたという……光速よりかなり遅いと例の近似は絶大な効果があるのですね。標準の計算モジュールが出した近似値は精度が10桁だったので、その範囲では厳密解と完全に一致していました。

オオッ ! そこまで追求されましたか !
これは痛み入ります。

> ちなみに具体的な数値は
> 標準の計算モジュール: 1.100315635
> pythonで計算した場合: 1.100315634775979
> pythonで厳密解を捻り出した場合: 1.1003156347759981~4の間
> 厳密解の求め方: (1-d/t)^2=k^2となるdを挟み撃ちでfloatの限界まで突き詰めた。t, k^2の値および各計算は自前の厳密な汎用アルゴリズムを用いた。

ウーム、なかなか考えさせられます。
やはり、精度を追求するには、挟み撃ち法でありますね。
今まで手抜き計算ばかりでありました、ハンセイ。

> まあ、普通にやってみておかしい値になっちゃったら、こうすればいいかな?的な技を使ってみる程度で、気楽に構えれば良いとは思います。

仰るとおりであります !
スクリプトを書けるという事は、それだけの自由度があるという事でもありますが、ただ、小中学生にそれを教える先生の負担は、チョットキツイ ?
まあ、教員の負担軽減ちう事で、最近ではプログラム教育塾の様なモノまで登場しているそうですが、
部活動のout-sourcing化の光と影、と言いますか、学校教育も、教育カリキュラムの爆発的増大、「分裂して、増えています」の模様。

> pythonはintが無限に桁を伸ばせるので、気楽に有理数計算みたいなことがしやすくて、個人的に気になる値を厳密に調べたい、といったことをCG-50でチマチマ計算できるのはすごく楽しいです。無理数が絡んでくると途端に厳しくなるのが辛いところですが……今回の例はなんとか無理やり対処できました^^

そうでありましたネ。
integer を多桁で使えるので、使いようで色々と遊べました。
仰るように、無理数/平方根はスクリプトを工夫する必要があり、大変であります、お疲れ様であります !
先日、手回し計算機で平方根を計算する動画を見たのですが、pythonを使えば、手回し部分を自動化出来るとは言え、スクリプトを考えないとなりません (それが「楽しい」部分ではありますが )

当方も、Machin 式で円周率を100桁程度求めるなんてやりましたのヨ。(HP Prime CAS ; XCAS の python script)
https://akatuki-724.blogspot.com/2021/04/hp-primecas.html
(Machin式は平方根計算がないのに加えて、収束が早いそうで、結構利用されているとか )

> 生成AIみたいに電気とか資源をバカ食いしないで済むのが利点だと勝手に思っています^^

仰るとおりであります !
ちまちまとキーを叩く手間はあれど、こうしたデバイスにて、手のひらの上でコードが動くの、楽しいですネ。

Krtyski (やす) さんのコメント...

akatuki様

本題とはズレた話で申し訳ありませんが、円周率を100桁求めるのって、以前凄く盛り上がったですよね! あのネタは 今回紹介してくださった machinのプログラウとは違ったと思いますが、あのプログラムを改めて Casio Pythonで書くとどうなるのかチョット興味があったりして...

akatuki さんのコメント...

Krtyski (やす) 様、御来訪多謝であります !

> 本題とはズレた話で申し訳ありませんが、円周率を100桁求めるのって、以前凄く盛り上がったですよね! 

その節は、大変お世話になりました。
言い出しっぺの当方が、議論について行けずで、早々に脱落してしまい ...

> あのプログラムを改めて Casio Pythonで書くとどうなるのかチョット興味があったりして...

あの時のコードは、内容としては Machin式だったのですが、多桁計算を行うため、10進floatの電卓メモリ配列を多数使って行うものでありました。

upython では 多桁のintegerが使えるので、小数点の部分に目を瞑れば、簡単に出来るのでありますネ。

def machin(n) :
s = 0
t1 = 10**n // 5
t2 = 10**n // 239

f = 0

for i in range(n):
d = 1+2*i
if f == 0 :
s = s + t1//d * 4
s = s - t2//d
t1 = t1 // 5 // 5
t2 = t2 // 239 // 239
else :
s = s - t1//d * 4
s = s + t2//d
t1 = t1 // 5 // 5
t2 = t2 // 239 // 239
f = 1 - f

print(s*4)

machin(100)


浮動小数点の配列で計算する場合、リストを使ってぶん回す事になると思われますが、すぐにアップアップしてしまうかも ?