抵抗ってなんだっけ Lispで分数計算(その2)

仕分け中
500マイル 藤原さくら(佐野さくら)

ドラマ『ラブソング』(2016)
ドラマに出演していた佐野さくら(藤原さくら)が歌ってた歌です。
劇中では、この動画の試聴回数1万回を目標に、菅田将暉が一生懸命さくらのビラを配ったりしてましたが、現実ではあっという間にミリオンです。

ところで、さくらが歌っているこの歌の500マイル。どのぐらいなのかピンと来ません。日本では使わないですからね。

1マイル=1609.344m
です

覚えにくい……。
単位につける接頭辞の方は、10進法での分量単位で共通単位ですのでわかりやすいです。たとえばk(キロ)がついたら、
1kmi(kマイル)=1609.344km
となり1000倍を表します。

この接頭辞の単位換算が、日本人はあまり得意ではないと学生時代に習いました。日常使うお金の単位が、千円、万円の単位だからです。
ドルの単位が
1サウザンド=1,000
1ミリオン=1,000,000
1ビリオン=1,000,000,000
と、3桁毎に単位が存在するのに対し、
円では、
1千=1,000
1万=10,000
1億=100,000,000
ご存知の通りのカンマの入り方になります。

k(キロ)や、m(ミリ)といった長さの単位も、コンピュータで使う、K(キロ)や、M(メガ)といった単位も、カンマが3桁毎に入ります。このような理由から、本当か嘘か、外国人は普段からお金を使うときに、3桁を意識しているから、日本人よりも単位換算が得意であると教わりました。

電子回路の世界でも当然、k(キロ)やm(ミリ)といった接頭辞が使えます。オームの法則の計算をする時も、各単位の逆数に当たる単位を覚えてしまえば簡単です。

si

計算例です。

si-calc

さて、その1では、並列に接続した抵抗の値を求めましたが、抵抗が2つの時限定になってしまいます。
3個以上の抵抗値も求められるようにbash関数を改造していきましょう。

goshを起動して、足し算からおさらいします。

gosh> (+ 1 2)         
3
gosh> (+ 1 2 3 4 5)         
15

上記の形を変えてみます。’シングルクォートが登場しています。

gosh> (fold + 0 '(1 2 3 4 5))
15

上記式は以下のような手順で計算を行ないます。
① 1 + 0
② 2 + ①の結果
③ 3 + ②の結果
④ 4 + ③の結果
⑤ 5 + ④の結果

一方、シングルクォートは、(list 〜)の略です。先頭からいきなりデータが始まっている場合に使います。

gosh> (list 1 2 3 4 5)
(1 2 3 4 5)
gosh> '(1 2 3 4 5)
(1 2 3 4 5)
gosh> 

計算式をfoldを使った形に変えることで、なんだかややこしくなりましたが、このfoldを使って抵抗の逆数の計算も一度にすることで全体的には式が短くすみます。
次は逆数にして足し算を行う関数を作ります。

gosh> (define (rcalc r1 r2) (+ (/ 1 r1) r2))
rcalc

r1を逆数にして、それをr2と足し算する関数です。
この関数を+の代わりに使うことで、抵抗の計算をするわけです。

gosh> (/ 1 (fold rcalc 0 '(20 30)))
12

実験が上手くいったので、これをbash関数で作りましょう。

~$ r(){ gosh -E"define (rcalc r1 r2) (+ (/ 1 r1) r2)
" -E"print (/ 1 (fold rcalc 0 (list $*)))" -Eexit; }
~$ r 20 30
12
~$ 

2値だけでなく、たくさん並べてみます。50オームの抵抗が5個並ぶと、10オームになるはずです。

~$ r 50 50 50 50 50
10
~$ 

コメント

タイトルとURLをコピーしました