ラベル 微分解析機 の投稿を表示しています。 すべての投稿を表示
ラベル 微分解析機 の投稿を表示しています。 すべての投稿を表示

2014年12月15日月曜日

微分解析機

このブログの8月25日のにフロントラッシュの話を書き, 遊星歯車の話にもなった. また遊星歯車が話題だ.

微分解析機の加算器は差分歯車や遊星歯車を使うといわれているが, 理科大の微分解析機の加算器は見慣れない形をしていた. どうなっているのか.

下の図も一種の遊星歯車である. 左が軸方向から見た図. 同径, 同歯数の歯車6枚があり, Bの2枚とCの2枚は遊星キャリアに乗っている.

中央にあるAとDは, キャリアと同じ軸に乗っているが, A,D,キャリアは軸には固定されていない. 歯車による束縛条件はあるが, その下で自由に回転できる.

この図を左方から見たのが右の図で, 遊星歯車のBとCは見ての通り, 深さ方向にずれて配置されている. つまりAはBと左図の緑の点で接し, BとCは黒い点で接し, CはDと橙色の点で接している.


まずキャリアを固定し, Aを反時計方向に回転する. するとBは時計方向に, Cは反時計方向に回転する. ゆえにDは時計方向に回転するわけだ. 歯車の歯数が同じだから, 回転の角度も同じである.

隣同士の歯車は逆に回る. 中間歯車が1個なら同じ方向に回る. AとDは間に歯車が2個あるから, 逆に回る.

回転角を記述するのに, 反時計回りを正として, 歯車Aの回転角をφ, Dのをψ, キャリアのをθと表すことにする. そこでこれを

θ=0の時φ=-ψ

と書いておく.

キャリアがAと一緒に回転すると, この図がこのまま回転するから, DもAと同様に回転する.

φ=θ=αの時ψ=α

と書いておく.

すこし様子が分って來たが, もう少し図を示すと, 下図の0は上の図のA, 右上のB, 右下のCとDを書いたものだ. AとDが重さなっているから, A,B,CとB,C,Dと図を分割してある. 緑色の点はA,Bの接点, 黒の点はB,Cの接点, 橙色の点はC,Dの接点で, これも上の図と同様. 歯車やキャリアが回転すると, これらの点は付いて一緒に回る.


一段下って1の図はAを60度回転したものである(φ=60°.) Dは固定してある(ψ=0°.) すなわちDの橙色の点は0の図と同じ位置にある. するとキャリアは30度回転する(θ=30°.) キャリアの向きはAやDから見たBとCの接点の方向である.

図2はφ=120°, ψ=0° θ=60°の時だ.

3では今度はDを逆回転してみた. φ=120°, ψ=-60° θ=30°

4ではDを更に逆回転した. φ=120°, ψ=-120° θ=0°

つまり, この遊星歯車では φ+ψ=2θ となっている.

私の2010年1月4日のブログでは, 太陽歯車の半径r, 回転角φ, 内歯車の半径R, 回転角ψ, キャリアの回転角θとすると,

θ=φ*r/(R+r)+ψ*R/(R+r)

とした. 今回の歯車は遊星歯車を2段にし, 内歯車を太陽歯車と同様にした. だからr=Rとなり, それから上の式が導ける.

さて下は東京理科大の微分解析機の加算器の写真である. ベイとベイを繋ぐバスボックス内にある3本(手前からX,Y,Zとする)のスタブシャフトに設置してある.



中央のYに乗っているのが, 上述の遊星歯車である. 手前のXの歯車と噛んでいる平歯車と一緒になっている真鍮のがAである. その左, Aと噛んでいる手前と向こうのがB, Aからは離れているが, Bと半分の幅で噛んでいるのがC, Cの奥にDがあるのだが, それは見えていない. DはY軸に固定されている.

真鍮の歯車群の左にあるのがキャリアで, 2:1で向こう側のZ軸の平歯車と噛んでいる. φ+ψ=2θだったので, θを2θにしているわけだ.

これを図にしたのが次だ. 円内下端の数は歯数である. 軸が破線で描kてあるのは, 固定していないことを示す.



これまで何回ものブログで微分解析機の殆どの仕掛けが分ったように思う.

2014年8月25日月曜日

微分解析機

このブログでフロントラッシュの話を書いたのはもう1年も前だ.

今回の再生プロジェクトでは, 精度は二の次なので, フロントラッシュを取り付けるまでには至っていないが, Crankの本でその辺を読み直してみると, 出力軸は入力軸より10パーセント高速に回転すると書いてあった. どうしてそうなるか考えてみた.

前回 ブログに掲載したCrankの本の分解図は



だが, どうもきれいとはいえない図である. そこで描きなおしたのが下だ.



写真の右端のピンの部品は省いてある. その左のドラム, 遊星歯車キャリア, 出力軸に固定されている内歯車が, その順に描いてある. 歯車の歯は描いてないが, 歯車のつもりの円板の外径は相方の歯車の外径に合うようになっている.

さて入力軸の逆転時には, ピンがドラムのペグに当るまでの時間は, ドラムは入力軸と無関係に停止している.

しかしその左のキャリアは, 入力軸に固定されて回転しているから, キャリアの入力側の遊星は, 太陽歯車で自転させられながら, 公転する.

入力側の遊星歯車の自転はそのまま出力側の遊星歯車の自転になっている.

出力側の遊星歯車の公転と自転により, 内歯車が回転し, 出力軸も回転する仕掛けである.

上の図の太陽歯車, 入力側の遊星歯車, 出力側の遊星歯車, 内歯車の半径, つまり歯数は, 最初の写真の大きさに大体合せてある.

そこで, 入力軸に対して出力軸がどう回転するか見るための図を描いてみる.



太陽歯車 S
太陽歯車半径 SA r0
遊星歯車 P
入力側遊星歯車半径 PB r1
出力側遊星歯車半径 P'C'' r2
内歯車半径 SD'' r3

入力軸が反時計回りにθ0だけ回転すると, Pにあった遊星歯車はP'へ移動する. 入力側の歯車は始めABで合っていたが, A''B''で合うようになり, 先程のBはB'へ移動している. 弧AA''は弧B'B''と同じ長さだから, 遊星歯車の回転角θ1はr0θ0/r1である.

内歯車はキャリアに従って回転する他, 出力側遊星歯車の回転でさらにθ2だけ回転する. その角は青で示した弧の関係からr2θ1/r3になる.

従って内歯車=出力軸は, キャリア=入力軸がθ0回転するのに対してθ02回転する. θ2がθ0の10パーセントなら, Crankのいう通りだ.

上の図ではr0:r1:r2:r3が3:4:2:9になっているから, 1/6だけ速く回転していることになる. 実際のフロントラッシュの比率は, 理科大へ行って歯車の歯数を数えなければならないが, 近代科学資料館はアナコンの企画展の後, 夏休みになっているので, 再開したら見に行こう.


以下9月5日記

資料館が再開されたので, フロントラッシュの歯数を数えてきた.

太陽歯車 歯数 22
入力側遊星歯車 歯数 28
出力側遊星歯車 歯数 12
内歯車 歯数 62

従って
θ20r0r2/r1r3=0.15θ0

つまり 10パーセントではなく, 15パーセントの歯数比であった. (1/6とあまり違わないね.)

2014年6月30日月曜日

微分解析機

東京理科大学近代科学資料館で企画展「計算する器械たち」を開催中だ.

そこで毎日微分解析機を実演している. デモは例のサークルテストだが, やはり一周すると2パーセントくらいのエラーが出る.

このデモの様子を, 昔微分解析機を使っていらした, 渡辺勝先生にお見せしたら, 「サークルテストでの反転時のバックラッシュが小さいようにお見受けしております」というメイルを頂いた.

ところで手回し計算機や電動計算機が出回ると, Runge Kuttaという計算法で連立m元常微分方程式を解くようになった. 我々がプログラミングを勉強したケンブリッジ大学のEDSACの本の例題にRunge Kutta Gillがあったので, 当時のコンピュータ屋にはお馴染の方法である. この方法については「伊理正夫,松谷泰行,Runge-Kutta-Gill法について,情報処理,Vol.8,No.2,pp.103-107」に解説がある. 今回はそれを使ってサークルテストを計算してみた. Schemeのプログラムは次のようだ.
(define (runge-kutta-gill m h n)
 ;m 変数の個数, h 分点間隔, n 分点数
(let ((y (make-vector m)) (f (make-vector m))
  (q (make-vector m)) (k 0) (qi 0) (s 0) (r 0)
  (c0 (- 1 (/ 1 (sqrt 2)))) (c1 (+ 1 (/ 1 (sqrt 2)))))
 (define (inity)    ;yの初期値
   (vector-set! y 0 0)
   (vector-set! y 1 0)
   (vector-set! y 2 1))
 (define (calcf)    ;fを計算
   (vector-set! f 0 1)
   (vector-set! f 1 (vector-ref y 2))
   (vector-set! f 2 (- (vector-ref y 1))))
  (define (printy)  ;yの出力
   (display (list 
     (vector-ref y 0)
     (vector-ref y 1)
     (vector-ref y 2))) (newline))
  (newline) (inity)
  (do ((i 0 (+ i 1))) ((= i m)) (vector-set! q i 0))
   ;qiの初期化
  (calcf) (printy)
  (do ((j 0 (+ j 1))) ((= j n))
  (for-each (lambda (e c) 
   (do ((i 0 (+ i 1))) ((= i m))
    (set! k (* h (vector-ref f i)))
    (set! qi (vector-ref q i))
    (set! r (e))
    (set! s (vector-ref y i))
    (vector-set! y i (+ s r))
    (set! r (- (vector-ref y i) s))
    (vector-set! q i (+ qi (* 3.0 r) (* c k))))
   (calcf))
   (list (lambda () (- (* 0.5 k) qi))
     (lambda () (* c0 (- k qi)))
     (lambda () (* c1 (- k qi)))
     (lambda () (/ (- k (* 2.0 qi)) 6.0)))
   (list -0.5 (- c0) (- c1) -0.5))
  (printy))))

(runge-kutta-gill 3 (/ (atan 1) 2.5) 20)
普通とちょっと違うのはy[0]がxであることだ. 従ってf(というのはdy/dxのことだが)のf[0]=1にしてある.

yの初期値では, y[0](xのこと)=0, y[1](yのこと)=0, y[2](dy/dxのこと)=1. fの計算では f[0]=1, f[1]=y[2], f[2]=-y[1]とする.

Runge Kuttaでは分点を1個進めるのに, x, x+h/2, x+h/2, x+hについて4回fの値を計算するが, そのループはfor-eachで回している. ループごとに変る値については, (lambda (e c) ..)の引数で渡す. 特にeの値は, 呼ばれた時に計算する必要があるので, 引数の方は(lambda () ..)の形にし, 使う時に呼出す.

initiy, calcf, printfなどのサブルーチンが, 関数runge-kutta-gillの中で定義してあるのは, 問題ありだが, yやf読み書きするので, これで我慢している.

最後の行で呼び出しているが, 0から2πまでを20分割で計算する. つまりh=2π/20; πを4*(atan 1)で計算したいからh=(atan 1)/2.5としてある.

たったの20分割なのだが, 一周したときのy[2]が.999868...だから1万分の2の程度の精度だ.

その出力を貰ってサークルを描くPostScriptのプログラムは次の通り.

/ps[[0 0 1]
[.3141592653589793 .30899155257892935 .9510578492071948]
[.6283185307179586 .5877376828378169 .8090352529734782]
[.9424777960769379 .8089575954451165 .5878333484965556]
[1.2566370614359172 .9510010098334781 .30910245672629366]
[1.5707963267948966 .9999670230159169 1.2303914619280843e-4]
[1.8849555921538759 .9510645042444495 -.30886434562367165]
[2.199114857512855 .8090808881734999 -.5876187580148391]
[2.5132741228718345 .5879134969774285 -.8088585919500648]
[2.827433388230814 .3092092738117766 -.9509316169859521]
[3.141592653589793 2.4607017746574233e-4 -.9999340319806838]
[3.4557519189487724 -.30873714204448566 -.951071143410806]
[3.7699111843077517 -.5874998314987273 -.8091265072362017]
[4.084070449666731 -.8087595818584492 -.5879936306339407]
[4.39822971502571 -.9508622132841098 -.30931607883671747]
[4.71238898038469 -.9999010268957623 -3.6909309235748844e-4]
[5.026548245743669 -.951077766707203 .30860994184321267]
[5.340707511102648 -.8091721101619074 .5873809032915227]
[5.654866776461628 -.5880737494657694 .8086605651723112]
[5.969026041820607 -.3094228718001786 .9507927987297933]
[6.283185307179586 -4.921078894070952e-4 .9998680077626148]
] def
280 360 translate
/mv {200 mul exch 200 exch mul moveto} def
/ln {200 mul exch 200 exch mul lineto} def
ps 0 get dup 1 get exch 2 get mv
1 1 20 {ps exch get dup 1 get exch 2 get ln} for stroke
図はこのようだ.



2013年10月17日木曜日

微分解析機

前回の微分解析機のシミュレータの続きである.

実物の微分解析機には出力装置があり, 2つの変数軸をxとyに入れると解の図形が得られる.

MIT Schemeにあるscheme graphicsの最も簡単な使い方は
(define mydevice (make-graphics-device 'x))
で描画の装置を宣言する. 装置の描く場所の正方形は左右がx軸, 上下がy軸であり, 左端はx=-1, 右端はx=1, 下端はy=-1, 上端はy=1である. この座標系で(x0,y0)から(x1,y1) まで直線を引くには
(graphics-draw-line device x0 y0 x1 y1)
とする.

そこで前回のブログのsinz, coszを描くには
(define (draw device step x0 y0 x1 y1)
 (if (> step 0) (begin
  (graphics-draw-line device x0 y0
   (stream-car x1) (stream-car y1))
  (draw device (- step 1) (stream-car x1) (stream-car y1) 
    (stream-cdr x1) (stream-cdr y1)))))
を使う. (draw ..)が描画の関数で, deviceに対してstep回描画する. x0, y0は解の曲線の始点; x1, y1はstreamである.

一方 駆動する方は, 座標を描いた後
(for-each (lambda (y) (graphics-draw-line mydevice -1 y 1 y))
  '(-0.75 0 0.75))
(for-each (lambda (x) (graphics-draw-line mydevice x -1 x 1))
  '(-0.75 0 0.75))

(draw mydevice 6282 0 0.75
 (scale-stream sinz 0.75) (scale-stream cosz 0.75))
のようになっている. stepは積分がzの1/1000で進行し, 2πで一周するから6282ステップ. 次の0と0.75はxとyの初期値(つまり鉛筆を置く位置)で, 1だと画面すれすれになるので0.75倍にしてみた.

次のsinzとcoszが出力軸の変数で, こちらも0.75にギアダウンしている. そういうわけで, この呼び方も出力装置をシミュレートしているといえるであろう.

こうして描いたサークルテストの図が次である.



円の始点と終点の真上でちょっと食い違っているようにも見えるが....

次はezを描く. 描きたい範囲を-1と1の間に変換しなければならない. 下の図を見てほしい. 左と上が実際の座標で右と下がGraphicsの座標である. これによるとx軸は0.4倍すればよい. y軸の方は1が-0.2になっているから0.4倍してから0.6を引く.



従ってプログラムは次のようだ. 始めのfor-eachは座標を描く.

(for-each (lambda (y) (graphics-draw-line mydevice -1 y 1 y))
  '(-0.6 -0.2 0.2 0.6))
(for-each (lambda (x) (graphics-draw-line mydevice x -1 x 1))
  '(-0.8 -0.4 0 0.4 0.8))
 (scale-stream z 0.4) 
  (add-streams (scale-stream ez 0.4)
    (scale-stream ones -0.6)))
回数の1386は丁度上の端に相当するxの値がlog 4=1.386であることによる.



こういう図を描くと, e-zで左半分も描きたくなる.
(define e-z (integrator (delay (scale-stream e-z -1))
  (delay z)
 1.0))
を用意し,
(draw mydevice 2500 0 -0.2
 (scale-stream z -0.4) 
  (add-streams (scale-stream e-z 0.4) 
   (scale-stream ones -0.6)))
を追加すれば, 左も描ける.



2013年10月16日水曜日

微分解析機

8月30日のブログに「これらのシミュレーションにはSchemeのstream処理が適していると思うが, まだ手が付かずにいる.」と書いた.

やっとどうやらシミュレーションが出来るようになったので, 今回はその話題である.

SICPの206ページのintegral関数のように披積分関数を遅延にするのが味噌である. SICPの例題では独立変数がdtだけだが, 微分解析機では「回す」値になにが入るかわからないので, こちらもstreamに対応させなければならない.

独立変数に方は回転角の差が必要になるので, stream-cadrからstream-carを引いたものに, 披積分関数のstream-carを掛けることになる.

まずintegratorは次のようだ.
(define (integrator delayed-integrand delayed-variable 
 initial-value)
 (define (mult-streams a b)
  (cons-stream (* (stream-car a)
            (- (stream-car (stream-cdr b)) (stream-car b)))
    (mult-streams (stream-cdr a) (stream-cdr b))))
 (define int
  (cons-stream initial-value
   (let ((integrand (force delayed-integrand))
         (variable (force delayed-variable)))
   (add-stream (mult-streams integrand variable) int))))
int)
integratorが貰う引数は遅延になっており, intの計算のなかでforceを使って強制する.

次はシミュレーションに必要な補助関数である. これらはSICPにあるものだ.
(define (scale-stream stream factor)
  (stream-map (lambda (x) (* x factor)) stream))
(define (add-streams s1 s2)
 (stream-map + s1 s2))
(define (integers-starting-from n)
 (cons-stream n (integers-starting-from (+ n 1))))
(define integers (integers-starting-from 1))
さてこれらが用意できたら, 8月14日のブログにあった関数からやってみる. ブログの図を見ながらプログラムを眺めてほしい.

最初はsin zとcos z. 独立変数はzである. zは整数のstreamで, 1/1000にして使う. sin zのπ/4, つまり45度での値をstream-refで見ることにする.
(define z (scale-stream integers 0.001))
(define sinz (integrator (delay cosz) (delay z) 0))
(define cosz (integrator (delay (scale-stream sinz -1))
  (delay z) 1.0))
(display (stream-ref sinz 785)) ;=>.7071024791302126
値としてはよさそうである.

次はez.
(define z (scale-stream integers 0.001))
(define ez (integrator (delay ez) (delay z) 1.0))
(stream-ref ez 1000) ;=>2.716923932235898
z2とz3は次のようにする.
(define z (scale-stream integers 0.001))
(define izdz (integrator (delay z) (delay z) 0))
(define z2 (scale-stream izdz 2))
(define iz2dz (integrator (delay z2) (delay z) 0))
(define z3 (scale-stream iz2dz 3))
(stream-ref z3 500) ;=>.12499950000000003
(stream-ref z2 500) ;=>.25049999999999994
0.5の3乗が0.125, 2乗が0.25ならまぁ問題はない.

tan zは多少手強いが,
(define ones (cons-stream 1 ones))
(define z (scale-stream integers 0.001))
(define tanz (integrator (delay 1+tanzsq) (delay z) 0))
(define itanzdtanz (integrator (delay tanz) (delay tanz) 0))
(define tanzsq (scale-stream itanzdtanz 2))
(define 1+tanzsq (add-streams tanzsq ones))
(stream-ref tanz 785) ;=>.9979528633948679
(stream-ref tanz (quotient 3142 6)) ;=>.5761873674775257
テストしたのはtan π/4とtan π/6で, 1/√ 3=.5773502691896258だからこれも合格である.

1/zとlogezはzを1から積分する. z=1での初期値はどちらも0である.
(define z (scale-stream integers 0.001))
(define logez (integrator (delay 1/z) (delay z) 0))
(define 1/z (integrator (delay (scale-stream 1/z -1)) 
   (delay logez) 1))
(stream-ref 1/z 500) ;=>.6664863143078377
(stream-ref logez 1718) ;=>.999948126092027
1/zの500での値は1/1.5なので0.6666.... logezの1718はloge2.718だから1でいいわけである. zの値は1からのはずだが, 回転角の差を使うから, integersで構わない.

微分解析機には結果を描画する出力装置もついているから, 次はscheme-graphicsを駆動するようなプログラムにしたい.

2013年9月25日水曜日

微分解析機

微分解析機でバックラッシュを減らす仕掛けには, フロントラッシュ以外にも, ラッシュロック(lashlock)なるものがあった.

微分解析機では独立変数軸で回転されるディスクは, 被積分関数軸の値によって前後に動かされる. つまりディスクの載っている台座が, 被積分関数軸に繋がる送りネジ(lead screw)に嵌めたナットと一緒になっていて, 移動するわけだ.

被積分関数の値は結果の積分値に大きく影響するので, この送りネジの工作精度は重要で, ケンブリッジの微分解析機では, 送りネジの作製に微分解析機全体の1/10のコストがかかったという.

ここでもバックラッシュを減らす方法が検討されている. 東京理科大学に保存されている微分解析機にもラッシュロックがちゃんとあった.

下の図でハッチのあるのが送りネジである. それに左の大きいナットと右の小さいナットが嵌めてあり, 大きいナットの上(破線の上)に台座が固定されている. だから送りネジはこのナットを経て台座を動かす.



2つのナットの間には, 太い線で示すバネが挟んであり, 兩ナットを離そうとしている.

小ナットには縁に何か所が切れ目があり, 大ナットから突出した棒の先の爪が差し込めて, 小ナットの回転を防いでいる.

つまり送りネジのネジ山を両端に押してバックラッシュをなくそうとしているのである. なるほどすごい仕掛けだ.

Crank本によると, この仕掛けもトルクアンプと同じく, ベツレヘムスチール社のNiemanが発明したそうだ.

2013年9月11日水曜日

微分解析機

微分解析機ではバスシャフト, クロスシャフトに積分機, トルクアンプ, 入力卓, 出力卓, 加算器などが接続してある. しかし佐々木本によると, 「ガタ補正装置」というものもあったらしい.

これは一体なにかと思う一方, 理科大の微分解析機になにやら不思議な機器がついていた. Crank本で判明したのだが, その不思議なものこそガタ補正装置であった. 英語では「フロントラッシュ」という.

微分解析機の最大の泣き所はトルクアンプでのバックラッシュであったらしい.

バックラッシュとは, 通常の平歯車ではこう起きる. 次の図のように2つの平歯車MとNがかみ合っていて, Mが駆動する側, Nが駆動される側とする.



Mが右回転していると, MとNのかみ合う部分では, Mの歯の下がNの歯を上から押し下げてNを左回転させる. Mの歯の下とNの歯の上は常に接しているから連続的に駆動できる.

Mが停止し逆回転を始めると, 今度はMの歯の上がNの歯の下を押し上げることになるが, こちらには隙間があって, MがNに当たるまでNは逆回転を始めずに停止している. 従ってMとNの回転角の関係を図に描くと, 回転が逆になると違う関係になる. これがバックラッシュである.

トルクアンプでも逆回転が始まると, 逆側のドラムの回りの糸が締まるまでは出力が始まらず, しばらく不感時間があってバックラッシュ現象が生じる.

このバックラッシュを出来るだけ早くキャンセルしようとするのがフロントラッシュである. 名前からして結構ふざけているがなかなかの機構である.

次がフロントラッシュのメカの分解図である. Cambridge大学のWilkes先生のところで撮った写真だと断りがあった.



フロントラッシュはバスシャフトの間に入れ, バスシャフトの回転数を加速する機能を持つ.

右が入力シャフトで, その左に両隣のシャフトへの引掛りをもったベルトに挟まれたドラムがある. ベルトはドラムが勝手に回らないよう軽くブレーキをかけている. ドラムに入力シャフトが通っているが, 入力シャフトとドラムはシャフトの回りではフリーになっている.

ドラムの左は遊星歯車. そして左端に内歯車とそれと一体になった出力シャフトがある.

ドラムには右方にペグが2本. この挿入位置は円周上に点在し, 場所は変更し調整出来る. 一方入力シャフトにはペグにぶつかるピンがある.

通常は入力シャフトがピンでドラムのペグを押し, 同時回転し, 従って遊星歯車も同時回転し, 入力シャフトと出力シャフトは同時回転する. しかし入力シャフトが逆転すると, ピンがペグから離れ, もう一方のペグに当るまで, ドラムはバンドの摩擦で停止する.

ドラムと入力シャフトの回転速度に差があると, 遊星歯車の出力は加速され, 出力シャフトも少し早く回り, やがてピンがもう一方のペグに当たって通常の回転数に戻るという仕掛けである.

この辺の事情を図にしたのが下だ.



左の図で横軸が入力, 縦軸が出力である. DからAは入力と出力が一体となってある方向に回転しているところとする. Aで入力が逆転し始めるても, 出力はすぐには追従しないからBまでは出力は動かぬ. BからCで出力は入力にすこし遅れて逆転する.

右の図はフロントラッシュの場合で, 横軸は入力シャフトのまだ先にある真の回転角である. Bまでは逆転直後で入力軸が遅れているところ. やがて遊星歯車が回転して出力は真の回転角に追いつく様子を示す. 逆側のC, Dでも事情は同じである.

なんとしてもバックラッシュを防ごうとう努力の後が見えるではないか.

2013年8月30日金曜日

微分解析機

初等関数を積分機を使って作りだす方法で, 前回のブログの続きである.

tan z

tan zはπ/2で無限大になるから要注意

d tan z/dz =1+tan2だから
tanz=∫ 1+tan2z

tan2のつもりのtanzsqなる変数を用意し

tanz = ∫ (1 + tanzsq) dz
tanzsq = 2∫ tanz d tanz

tanzは1+tanzsqで「動かし」, zで「回す」.
tanzsqはtanzで「動かし」, tanzで「回し」2倍する.

図は次のようだ.



3本のバスシャフトにまたがる[・Σ・]のような記号は加算器で, ・のバスシャフトの値の和がΣのバスシャフトに出力される.

1/z, logez

logez = ∫ 1/z dz
1/z = -∫ 1/z d logez だから

logezは1/zで「動かし」, zで「回す」.
1/zは-1/zで「動かし」, logezで「回す」.

図は次に示す.



これらのシミュレーションにはSchemeのstream処理が適していると思うが, まだ手が付かずにいる.

2013年8月14日水曜日

微分解析機

微分解析機のことを調べようとすると, 参考になる文献は
城憲三「計算機械」共立全書
佐々木達治郎「計算機械」河出書房
くらいであった. 微分解析機を使われたり, 設計されたりした渡辺勝先生に先頃お目にかかったら, John CrankのThe Differntial Analyser(1947年刊)を読むべきだといわれた.

私が在職していた東大工学部計数工学科の図書室にあったので, さっそく読み始めた. まことに実用的な本であった. 英国のCambridge大学にあった微分解析機に基いて豊富な説明があった.



そこの微分解析機も, 積分機の円板の方を被積分関数に応じて動かす方式なので, 独立変数の入力は円板を`rotate'する(回す); 被積分関数の入力は積分機を`displace'する(動かす)と使い分けていて実に理解しやすい.

従って積分機の図も次のようで, 積分機を押し上るような矢印が被積分関数, 円板の横の一部網かけのドライブの軸が独立変数, 円板中央のT字状の軸が積分出力である. それらに繋がる縦の軸がクロスシャフト. 横の軸がバスシャフトである.



積分機を2台使ってsin, cosを発生させるのは, どこにでも例題があるが, もっと他の基本関数の発生法もなかなか面白かったので, 今回はそれが話題である.

本番で使うときは, 係数処理をしなければならないが, とりあえずどの関数は積分機何台で出来るかという一覧表があった. その中から:

sin z, cos z

d sin z/dz = cos z
d cos z/dz = -sin zだから
sin z = ∫ cos z dz,
cos z = ∫ -sin z dz

cos zで「動かし」, zで「回す」と sin zが得られ,
-sin zで「動かし」, zで「回す」と cos zが得られる.

図は上に示した通り. バスシャフトとクロスシャフトの交点が丸で囲んであるのは, クロスシャフトの回転を通常と反対にすることを示す.

z=0からπまでをプログラムでシミュレートしてみると(積分区間を1024分割した):

(define k 1024)
(define z 0) (define sinz 0) (define cosz 1) 
(define pi (* 4 (atan 1)))
(define dz (/ pi k))
(do ((i 0 (+ i 1))) ((> i k))
(set! z (+ z dz))
(set! sinz (+ sinz (* cosz dz)))
(set! cosz (- cosz (* sinz dz))))

(display (list z sinz cosz)) =>
(3.1423596439839487 -7.670673988518897e-4 -.9999994116371386)

ez

d ez/dz = ezだから
ez = ∫ezdz

ezで「動かし」, zで「回す」と, ezが得られる.

次の図のようだ.



z=0から1までをプログラムでシミュレートしてみると(積分区間を1024分割した):

(define k 1024)
(define z 0)
(define ez 1)
(define dz (exact->inexact (/ 1 k)))

(do ((i 0 (+ i 1))) ((> i k))
(set! z (+ z dz))
(set! ez (+ ez (* ez dz))))

z => 1.0009765625
ez => 2.719609006545993

z2, z3

z2 = 2 ∫z dz
z3 = 3 ∫z2 dz

zで「動かし」, zで「回し」, 2倍するとz2が得られ,
z2で「動かし」, zで「回し」, 3倍するとz3が得られる.



バスシャフト間を繋ぐ[1 2]や[1 3]は, 回転をそれぞれ2倍, 3倍する歯車を示す. z3はこのように積分機2台が必要である.

シミュレーションは不要であろう.

他の関数は次の機会にしよう.

この本を読んだ収穫のひとつが独立変数は「回す」, 被積分関数は「動かす」と言い分けることであった. 若き日のWilkes先生を含め, Cambridge大学の微分解析機のグループが, rotate, displaceを使うと意思の疎通が捗ると知り作業していたらしいことが想像できる.

大学院生のころよく読んだ海外誌がBSTJ(Bell System Technical Journal)であった. C.E.Shannonの通信理論の論文もBSTJに掲載された. BSTJの電話交換機の論文では, Sheといえば交換手, Heといえば加入者であって, 便利な使い分けだと感心したが, こういうこともコミュニケーションで大事なノウハウであろう.

2013年4月12日金曜日

微分解析機

前回のブログの微分解析機の絵は, 機素だけをつなげた, いわば回路図であった. 昔の微分解析機の論文を見ても, 解法にはこういう図しか示していない. 前回の接続図を佐々木達治郎著「計算機械」にある微分解析機の図解の絵のように描くと下のようになる. (情報処理学会誌Vol.52,No.3「微分解析機」の解説で使ったPostScriptのプログラムに手を加えた.)


トルクアンプのベルトは怪しいが, 佐々木の原図に従っている.

図の右半分にあるのが縦横にシャフトの並ぶ連結装置である. 解くべき微分方程式に従って, この部分は大々的に組み替える. 積分機や出力卓などと接続するクロスシャフトを持つ大小の ベイがバスボックスを介して配置されている. (ここでの説明に必要なベイまでしか描いていない.) 各ベイではクロスシャフトの上にバスシャフトを直角に置く. そのうちのある縦横軸対は, はすば歯車で連結される.

ベイとベイの間のバスボックスには数本のスタブシャフトが貫通しており, 隣り同士のベイのバスシャフトを連結する役目をはたす. スタブシャフトは普段は外さないらしい.

バスシャフトは両端にカプラーがはめてあり, カプラーの2本のネジを締めることでカプラーを介してバスシャフトとスタブシャフトは同時回転する. このネジを緩めるとカプラーをベイの内側の方へ滑らせて, バスシャフトを外すことが出来る.

積分機は今回の図では, 円板台に乗っている円板の方の位置が変るように描いた. 円板台を動かすのは平歯車n0を介している被積分関数軸である. この軸を回転すると, 円板の4時の方向に描いてあるナットにより, 円板台が左右に動く.

積分機0では回転子は円板の中心から左へ大きく離れているが(y'=1を示しているつもり), 右ネジに切れている被積分関数軸を連結装置側から見て反時計回りに回転すると, 円板は左へ移動し, 回転子と円板の中心の距離は減少する.

さて3本のバスシャフトは左下の出力卓でxに対するyとy'の曲線を描くように接続されている.

出力卓の上の方の3本の横軸は, 中央の右ネジのが水平移動軸で, xのバスシャフトで駆動され, 軸の左寄りにある滑り体が左右に動く. 滑り体にはyとy'の回転で垂直移動軸に取り付けた鉛筆を前後に動かすようにギアが付いている. 垂直移動軸は離れて2本あるが, 鉛筆は内側に設置され, 2つの鉛筆の先端のx座標が揃うようになっている.

ただ出力卓で描かれる2本の曲線が交差するとき, なにが起きるか, 衝突をどう避けるかがまだよく分らない. 例えば鉛筆を下の図のように取り付ければ, かすり傷かニアミスですれ違えるかも知れないがどうかな.


両移動軸のピッチが1ミリ, 描画可能領域が縦横それぞれ500ミリだとすると, 2πまで移動で, 前回の計算ではxは1600回転, yとy'は正負方向に460回転くらいするので, h0, h1, h2の平歯車はそれぞれ1/4,1/2,1/2に設定するのがよさそうである.

2013年4月6日土曜日

微分解析機

微分解析機の原理は分かっているし, Processingでシミュレータも書いたりしたが, 定量的にはどうか.

佐々木達治郎「計算機械」に解説はあるが, かつて東大理工研や阪大理学部で活躍し, 今は理科大で静態保存されている昭和航空計器製の微分解析機の数値をもとに自分で計算してみた.

下の図は積分機2台で正弦波d2y/dx2=-yを描く場合の機素の接続図である.



I0とI1が積分機で, Axは独立変数の縦軸(バスシャフト), xのA倍で回転する. By,-Dy''はI0の出力軸, I1の被積分関数軸でyのB倍で回転する. Cy'はyの1回微分の軸でI0の被積分関数軸, I1の出力軸だ. ダッシュ'が使えないプログラムではyをy0と, y'をy1 と書くことがある.

図でAx軸のすぐ下の斜め線はその縦軸の回転を, 1:1で積分機I0の変数の横軸(クロスシャフト)へ伝えるはすば歯車. その先の平歯車でm0倍になり円板を回転する. 平歯車の先の軸の回転角と円板の回転角は1:1で固定である.

Cy軸から積分機I0へ向かう横軸, 被積分関数は, n0倍になってから1回転が1ミリのピッチで円板と回転子の相対位置を変える. 図ではI0とI1の円板の位置が上下に揃い, 回転子がずれているが, トルクアンプの関係で, 通常は回転子が上下揃うように構成されている.

回転子は半径rで, j0の平歯車を経て出力軸と結ばれる.

下の積分機I1でも接続は同様だが, Byの軸の斜線の方向が違うのは, 被積分関数軸が縦軸に対して1:-1になっているからだ.

出力卓については次回のブログで説明しよう.

上の積分機I0で考えると, 回転子の円板の中心からの距離lはCy'n0ミリ. その状態でAx軸がdAxだけ回転すると, 円板がdAxm0だけ回転するから, 回転子の位置で円板は円周方向にdAxm0Cy'n0動き, 出力の横軸はdAxm0Cy'n0/rj0(=dBy)だけ回転することになる.

つまり, この値がByに足される.

この微分解析機にはまだ制約がある. rは32ミリ. 円板の半径は約120ミリ. 平歯車のギア比は4, 2, 1, 0.5, 0.25しかない.

そこでA, B, Cやギア比をいろいろ試行錯誤で計算してみると, m0=m1=2, n0=n1=0.25, j0=j1=4, A=256, B=C=448という使えそうな解があることが分かった.

もともとyやy'は-1≤y≤1だから, n0とn1が0.25だとBy,Cy'は, -112ミリから112ミリの間になり, 円板の範囲に収まる.

xを0から2πまで変えるとAxは0から512πまで変わる. yとy'の初期値はそれぞれ0と1だから, ByとCy'の初期値は0と448だ.

この1周の積分を1024分割で実行すると, dAxはπ/2である

これでシミュレートしてみる.
(define m 1) (define n 0.25) (define j 2)
(define a 256) (define b 448) (define c 448)
(define ax 0) (define by0 0) (define cy1 448) 
(define pi (* 4 (atan 1))) (define dax (/ pi 2))
(define r 32)
(define (integrator dx y) (/ (* m dx n y) r j))
(define (step i)
 (if (= (modulo i 16) 0)
  (begin (display (list i ax by0 cy1
    (+ (* (/ by0 b) (/ by0 b)) (* (/ cy1 c) (/ cy1 c)))))
   (newline)))
 (let ((dcy1 (integrator dax (- by0)))
       (dby0 (integrator dax cy1)))
  (set! ax (+ ax dax))
  (set! by0 (+ by0 dby0))
  (set! cy1 (+ cy1 dcy1))))
(do ((i 0 (+ i 1))) ((> i 1024)) (step i))
1024ステップ分出力するのは大変だから1/16つまり65行プリントした. 左からステップ番号, Ax, By, Cy', y2+y'2である.
(   0    0.00000    0.00000  448.00000 1.00000)
(  16   25.13274   43.92436  445.97712 1.00060)
(  32   50.26548   87.45205  439.65678 1.00121)
(  48   75.39822  130.16351  429.09730 1.00181)
(  64  100.53096  171.64681  414.39783 1.00241)
(  80  125.66371  211.50158  395.69748 1.00302)
(  96  150.79645  249.34290  373.17400 1.00362)
( 112  175.92919  284.80504  347.04204 1.00423)
( 128  201.06193  317.54493  317.55119 1.00483)
( 144  226.19467  347.24554  284.98349 1.00544)
( 160  251.32741  373.61893  249.65085 1.00604)
( 176  276.46015  396.40903  211.89195 1.00665)
( 192  301.59289  415.39414  172.06908 1.00725)
( 208  326.72564  430.38907  130.56463 1.00786)
( 224  351.85838  441.24697   87.77739 1.00847)
( 240  376.99112  447.86075   44.11879 1.00908)
( 256  402.12386  450.16415     .00887 1.00968)
( 272  427.25660  448.13236  -44.12771 1.01029)
( 288  452.38934  441.78236  -87.86579 1.01090)
( 304  477.52208  431.17271 -130.78379 1.01151)
( 320  502.65482  416.40305 -172.46777 1.01212)
( 336  527.78757  397.61316 -212.51543 1.01273)
( 352  552.92031  374.98162 -250.54001 1.01334)
( 368  578.05305  348.72414 -286.17396 1.01395)
( 384  603.18579  319.09147 -319.07260 1.01456)
( 400  628.31853  286.36704 -348.91733 1.01517)
( 416  653.45127  250.86423 -375.41882 1.01579)
( 432  678.58401  212.92338 -398.31976 1.01640)
( 448  703.71675  172.90852 -417.39737 1.01701)
( 464  728.84950  131.20387 -432.46556 1.01762)
( 480  753.98224   88.21016 -443.37676 1.01824)
( 496  779.11498   44.34079 -450.02335 1.01885)
( 512  804.24772     .01783 -452.33875 1.01946)
( 528  829.38046  -44.33200 -450.29802 1.02008)
( 544  854.51320  -88.28149 -443.91821 1.02069)
( 560  879.64594 -131.40702 -433.25816 1.02131)
( 576  904.77868 -173.29266 -418.41798 1.02192)
( 592  929.91143 -213.53415 -399.53811 1.02254)
( 608  955.04417 -251.74286 -376.79800 1.02315)
( 624  980.17691 -287.54947 -350.41438 1.02377)
( 640 1005.30965 -320.60761 -320.63922 1.02439)
( 656 1030.44239 -350.59717 -287.75730 1.02501)
( 672 1055.57513 -377.22738 -252.08351 1.02562)
( 688 1080.70787 -400.23970 -213.95984 1.02624)
( 704 1105.84061 -419.41026 -173.75205 1.02686)
( 720 1130.97336 -434.55206 -131.84624 1.02748)
( 736 1156.10610 -445.51682  -88.64505 1.02810)
( 752 1181.23884 -452.19640  -44.56390 1.02872)
( 768 1206.37158 -454.52385    -.02688 1.02934)
( 784 1231.50432 -452.47414   44.53723 1.02996)
( 800 1256.63706 -446.06438   88.69916 1.03058)
( 816 1281.76980 -435.35369  132.03323 1.03120)
( 832 1306.90254 -420.44265  174.12149 1.03182)
( 848 1332.03529 -401.47238  214.55776 1.03244)
( 864 1357.16803 -378.62318  252.95148 1.03306)
( 880 1382.30077 -352.11282  288.93159 1.03369)
( 896 1407.43351 -322.19447  322.15002 1.03431)
( 912 1432.56625 -289.15431  352.28509 1.03493)
( 928 1457.69899 -253.30872  379.04465 1.03556)
( 944 1482.83173 -215.00134  402.16889 1.03618)
( 960 1507.96447 -174.59970  421.43285 1.03680)
( 976 1533.09721 -132.49175  436.64863 1.03743)
( 992 1558.22996  -89.08210  447.66722 1.03805)
(1008 1583.36270  -44.78813  454.37993 1.03868)
(1024 1608.49544    -.03601  456.71951 1.03931)
axの最後の値は (* pi 512) => 1608.495438637974だ.

この出力をもとにサークルテストをしたのが下の図だ.



開始点と終了点である右端がちょっとずれている. 448と456だから2%くらいの誤差である.

2010年12月25日土曜日

微分解析機

今回は微分解析機といっても, トルクアンプ, 日本語では回転力増幅器の, それも図の話である.

微分解析機の積分機の出力は, 摩擦で生じる微少な力なので, これで他のものを駆動することは出来ない. ところがNewmanにより, トルクアンプが発明され, それによって微分解析機は実用になった.

トルクアンプは, 下の図のような構造である.



右のinputの軸の回転を, 左のoutputの軸から力を増幅して取り出すのである. その間にロープを書けたドラムが2組あり, ロープの端は, 入力と出力軸に取りつけたT字状のレバーの先に固定されている. ドラムは両端のプーリーにかけたベルトで, 矢印の方向に, 逆方向に回転している. 入力軸が回転しない時は, ロープはドラムの面を滑っている.

今, 入力軸が, 右に回転したとする. そうすると, 下のT字状のレバーが持ち上がり, 左のロープがドラムの上で締まり, ドラムとの間に摩擦が生じ, 上のT字状のレバーが押し下げられ, 出力軸が入力軸と同じ方向に回転する. 回転角が同じになれば, ロープは弛み, 再び滑り出す.

入力軸が反対に回る場合は, 右のドラムの摩擦が生じ, 出力軸はやはり入力軸と同回転する.

つまり, 回転するドラムが動力になり, 入力の微少な力を増幅するのである.

こういう仕掛けは船の碇を巻き上げる装置にもあるらしい.

さて, 上のような図で説明したが, 私としては, ロープを直線で描いたのが気に入らないのである. 図はなるべく正確に描きたいというからには, このようにドラムの縁で光の反射のような図はだめである.



そこで考えたのがこの図である. 上と下のT字状のレバーにロープが繋がっている点をAとEとする. 図の円はドラムの断面である. ロープは, AからBに至ってドラムに接し, BCDFBCDとドラムを1回とすこし回り, Dから離れてEでもう一方のT字状のレバーに辿り着く. 先ほどの図は, これを左から見たものだ. そうすると, ロープ上の点は, Aから下がり, ドラムの円の右半分を上がり, また下がるように見えるはずである. また左右の座標位置は, ロープの長さに比例して右へ移動するはずである.

その移動の様子を, 半径の右の, 点の列で示す. 赤はロープのAからBに対応する. 緑はBCDFBCDに対応, 最後の青はDからEである.

そういう解釈で, 最初の図を描き直すと下の絵になる.



ざっと見ると最初の図と左程違わないが, ドラム回りのロープは本当らしくなったのではないか.

2010年1月23日土曜日

微分解析機

遊星歯車の動き方のアニメーションを作りたいと思っていたが, やっとなんとかなったので, 公開することにした. 試作の順に番号をつけたので, planetary2planetary4とがある.

planetary2では


またplanetary4では


のような絵が得られる.

とりあえず動きを見るために作ったのがplanetary2で, 歯車を円で近似した. しかし, 歯車の廻るところも見たくなり, planetary4を書いた. ただ歯車は早く廻転すると, ストロボ効果で, 逆転のように見えるので, 結構遅く廻転させている.

下にある赤, 緑, 橙, 青の四角をクリックすると, いずれかの行動をする. そのパターンが

である. 赤線は太陽歯車の廻転角, 緑線は内歯車の廻転角, 青線は衛星キャリヤの廻転角である.

2010年1月4日月曜日

微分解析機

微分解析機の加算装置に, 車のデフ型でなく, 遊星歯車型の差動歯車を使う話を書いたが, 正月休みにもう少し定量的に理解したいと思った.

遊星歯車の動き方のアニメーションがここここにある. でもこのくらいは自分で描きたい.

まず各歯車の動き方を調べた. 下の図で, 周囲の大きい円が外側の内歯車(歯が内側を向いている), その半分の半径の中央の円が太陽歯車Sである. 右の小型の円が衛星歯車で, 真横にあるのが最初の位置Pである.



太陽と衛星歯車は, AとBで, 衛星歯車と内歯車は, CとDで接している. 太陽歯車がA'まで廻転し(回転角をφ), 衛星キャリヤがP'まで来た時, キャリヤの廻転角をθとする. この時, 遊星歯車と内歯車はC"とD"で接している. その移動中に接した歯車は円弧DD"とC'C"でこの長さは等しい. 一方AとBはすでにA'とB'まで移動していて, 今はA"とB"で接している. この方の移動中に接した歯車は円弧A"A'とB"B'でこれも前の長さに等しい.
内歯車, 太陽歯車, 遊星歯車の半径をそれぞれ, R, r, ρ; B"P'B'の角をαとする.
DD"=Rθ=C'C"=ρα=B"B'=A"A'=r(φ-θ)
従ってキャリアの廻転角は θ=φr/(R+r);
衛星歯車の廻転角は α=θR/ρ=φRr/(R+r)ρとなる.

一方, 太陽歯車を固定し, 内歯車をψだけ廻転すると, キャリヤの廻転角θも同様に計算出来る.

θ=ψ*R/(R+r);
α=-ψ*Rr/(R+r)ρとなる.

この両者を合わせ, 太陽歯車の廻転角 φと内歯車の廻転角 ψから, キャリヤの廻転角θは
θ=φ*r/(R+r)+ψ*R/(R+r);
遊星歯車の廻転角αは
α=(φ-ψ)*Rr/ρ(R+r).

前回の歯車の図や, 上の図ではR=200,r=100,ρ=50なので,
θ=φ/3+2*ψ/3;
α=4*(φ-ψ)/3となる.

例えば, 太陽歯車を90度進めると, φ=90からθ=30度, α=120度(上の図). 次に内歯車を90度進めて追い付くと, ψ=90からθ=60度, α=-120度で, キャリヤも90度まで進み, 衛星歯車も最初の接していた両側の点で再び接するようになる.

通信機用のバリコンのつまみは, 太陽歯車に相当し, バリコンはキャリヤ軸についていたとすると, 1/3の減速になるのであった.

2009年12月29日火曜日

微分解析機

微分解析機(differential analyzer)は変数の値を軸の廻転で表す. 変数同士の和は, 差動歯車(differential gear)を使うといわれている. 英語はおなじdifferentialでも意味は違う.

差動歯車は自動車の駆動装置に使われていることでよく知られている. 息子が小学校の上級のころ, プラモデルで無線操縦のレーシングカーを作るのを見ていたら, プラスティック製の差動歯車の部品があり, それで差動歯車を組み立て, 中にグリースを詰めて密封していた. こんなところまでこだわるのかと恐れ入った.

差動歯車の構造を下のようである.

四角で表す箱状のものに, かさ歯車が3つ入っている. 左右のかさ歯車はそれぞれ外部のx軸, y軸に連結している. 図に見るように, x軸とy軸は直接にはつながってはいない. 中央下のかさ歯車は, 左右のかさ歯車に噛み合い, 軸は箱状のものに刺っている. x軸, y軸が同方向に同速度で廻転すると, 中央のかさ歯車は, 自分の軸の周りには廻転せず, 箱状のものをx, y軸の周りに, 同速度で廻転させる. 箱状のものがx, y軸の周りに廻転すると, それと一体の歯車もxやyと同様に廻る.

xの廻転を止め, yだけ廻転させると, 下のかさ歯車が廻転しながら, 箱状のもの(z軸といおう)も廻転する. しかし今度はyの半分である. z=(x+y)/2なのだ.

作動歯車の動きを滑車で表すと次の図のaのようになる. 滑車に紐をかけ, 両端をxとyだけ引くと, 滑車(下のかさ歯車に相当)は廻転せずに同じ長さだけ下がる. bはxを引かない時で, 滑車は廻転し, yの半分だけ下がる.


滑車が廻転するのは, 紐が滑らないことなので, 紐の代りに滑らない棒を使っても同じなことをcは示す. これはxとyのかさ歯車を展開したものである.

図では箱状の歯車を半分の歯の歯車に噛ませて(2倍して), x+yが出来ることを示す.

自動車のいわゆるデフは, このx+yの軸が駆動軸で, 両車輪xとyを駆動する. エンジン(ミッション)からの駆動軸は車軸と直交するので, この歯車はかさ歯車である.

ところで通常デフといわれる装置は, 最初に書いたように, ディファレンシャルである. ディジタルをデジタルというのに似た変形である.

佐々木達治郎先生の「計算機械」(1947年刊)に東大航空研で試作した微分解析機の構造が説明してあり, その中に機素の加算に遊星歯車(planetary gear)を使うと書いてあった.

遊星歯車といえば, 内装式の自転車の変速機が有名である. 昔の通信機器は, 同調ダイアルにやはり遊星歯車を使っていた. つまり背後に丸い文字版があり, 手前に黒いつまみがある. つまみを廻しても, 文字版ははるかに遅く廻り, 微妙な同調が出来るようになっていた. 文字版には副尺もついていて, 高級感を出していた.

下が遊星歯車の図解である.

中央の太陽歯車の廻りに同じ大きさの遊星歯車があり, 遊星歯車は太陽と外側の(内向きに歯を持つ)歯車に噛み合う. また遊星歯車の軸は遊星キャリヤに乗っていて, 歯車の位置が変るとキャリヤの軸も廻転する. (こういう絵を描くのは楽しい.)

これでどうして差動歯車になるか, 即座には分からないが, もう1つの絵を描いてみると納得出来る.


これは太陽歯車と, 外側の歯車を1列に延したもので, 一応遊星歯車と等価を考えられる. 太陽歯車の廻転は下の棒状の歯車(ラック)の移動, 外側のは上の歯車の移動であり, キャリヤの軸の廻転は中央の歯車の軸の左右の移動と思えばよい.

歯車の場合は, 廻転角度が重要な情報だが, ラックでは移動の歯数で考えることになる.

こういう絵をみると, 上の差動歯車と同じになり, なるほど加算機構に使えるを分かる.

差動歯車の解説を読むと, かさ歯車のものより, 遊星歯車型の方が基本のように書いてあった. われわれは車の知識があるので, かさ歯車が一般的を思い込んでいたようである.

2009年12月21日月曜日

微分解析機

機械式の微分解析機では, 変数同士の乗算は, 積分機を2台と加算でするのだと思っていた. ところが図面に乗算卓というのがあり, 積分をせずとも乗算しているらしかった.

幾何学での乗算法はよく知られている.



点Pから半直線を引き, PA=a, PB=bとなる点A, Bをその上に取る. またPから別の半直線を引き, PC=1の点Cを取る. A,B,Cを通る円Oを描き, PCの延長上で円との交点をDとするとPDの長さxがa*bになっている.

これは方冪の定理による. その説明が次の図である.



PO2-AO2を考える. 正三角形POMでPythagorasの定理を使うと
PO2=PM2+OM2
同様に
AO2=AM2+OM2
辺々相引くと
PO2-AO2=PM2-AM2=(PM-AM)*(PM+AM)=PA*PB
つまりまえの図のPA*PB=a*b=PO2-AO2
=PO2-半径2=一定

である.

しかし微分解析機でこれをやっているか疑問であった. ところである文献に微分解析機の使い方の説明があり, 乗算卓の記号が下の図のようになっていた.



元々の記号に赤や青の色はない.

微分解析機からs, t, xの3本の軸で接続されている, s*t=xと出力が出るらしい.

x軸の右にはハンドルのような絵がある. そこで考えてみて, こうなっていると推測した. t軸が廻転すると, 軸に接続されている赤色のT型の足が円の中心を軸に振れる. 一方s軸の廻転で青い棒が左右に移動する. オペレータはハンドルを廻し, 青軸上のカーソルを赤線の上に保つのである. そのハンドルの廻転がx軸で出力される.

その説明が次の図だ.



円の中心がAの点である. tもsもAから左右に計測する. tが増えるとB点は左へ移動し, ABと直角についている腕, ADも一緒に廻転する. EDの長さをxとすると, 三角形ABCと三角形ADEは相似であり, ACの長さを1とすると, 1/t=s/x 従ってx=s*t である.

そういう乗算卓を使っていたとは面白い.

2009年12月12日土曜日

微分解析機

その昔, 微分解析機という低速のアナログ計算機があった. 1階の常微分方程式を解く機械式の積分機を何台かと, 入出力テーブルを持ち, その間の情報は多くの廻転軸で伝達した.

Wikipediaによれば, 原理を発明したのは1876年, James Thomsonで, 実用機の製作は1927年, MITのVannever Bushによる.

我が国にも2, 3台はあったらしい. 神楽坂にある東京理科大学の近代科学資料館にいくと, 展示されている. 私は1950年代に, 東大生産技術研究所にあった大型機を見学したことがある.

ないよりは数段ましの計算機だが, 大阪大学にいらした, 清水辰次郎先生(1887-1992)が微分解析機の使用経験を書かれたものを読むと, これを使うのは, 結構大変であったらしい.

清水先生の話は

d2x/dt2-μ(1-x2)dx/dt+x=0

を積分機2台の微分解析機でどう解いたかというものである. この微分方程式はVan der Polの式といって, 非線形屋さんの好きなものである.

2階の式は2つの変数に分け, 1階の連立にするのが常道である.
dx/dt=y      積分機0番
dy/dt=g(x,y)    積分機1番
where g(x,y)=μ(1-x2)y-x

xの初期値を1, yのを0, μを0.1にして, この結果をxとyとの図にしたのを下に示す.


今ではPCで簡単に図が描けるが, 昔は手間がかかったので, こういうきれいな図が得られると, 額にいれた飾っていた人もいた.


さて, 阪大の微分解析機は積分機が2台あったから, これで解けそうに見えるが, 問題はμ(1-x2)y-xの計算である. 微分解析機の変数は前述のように廻転軸なので, 最後の引き算は差分ギアを使えばよいし, 最初のμの掛け算はμが定数なので, ギア比で実行できる. xの自乗やそれにyを掛けるように, 変数同士の乗算があると, 微分解析機は積の微分の式を使い, 2台の積分機を使うことになるのだが, 阪大には余っている積分機はない.

そこで聞くも涙の話になるのだが, 清水先生は, 固定したμと, ある範囲のxとyとに対して, g(x,y)をあらかじめ計算し, 表か図にした.

適当な初期値から, (例えばx=1, y=0から,) 起動するとき, それに対応するg(x,y)を積分機1番に入力する. するとx, yが計算され, 出力テーブルにプロットされる; その値を読んで1人が叫ぶと, もう1人がそれに見合うg(x,y) を入力するという, 恐ろしいことをやった. この遅れが誤差になるのは承知の上だが, 傾向をみるだけにはそうするしかなかったのであろう.

私の興味は, g(x,y)はどういうものかにあった. 微分解析機では, f(x)のような1変数の入力なら, 入力テーブルにこの関数形を描いておき, 人手でトレースするなり, 生研の機械なら, 光電管で曲線を自動追尾するなりして, 入力出来るが, gは2変数関数なので, 3次元の入力装置を作れば自動化できたかも知れない. それで関数の形が知りたかったのである.

-4≤x,y≤4について, 0.2おきにg(x,y)を描いたのが下である. もちろん3次元には表示できないので, 高さを向こうへ倒して表現してある. つまりy=4は一番上の線で, 基準が赤線であり, x=-4のとき, g(-4,4)=-2と読む. 他の3つの隅の例では, g(-4,-4)=10, g(4,4)=-10, g(4,-4)=2である.


これならなんとか立体模型をつくり, 入力装置も出来たのではないかと想像する.

この後, この図を等高線で描いてみた. 等高線のプログラムは, 天気図を描きたいという人などが, 昔から挑戦しているが, 私は始めてプログラムしてみた.

それが次の図である.


さらに, 横倒しの図と等高線図を重ねたものも示す.



積分だけでなく, こういう描画も楽になったとつくづく思う.