理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

問題 3-73 (3.5.3 Exploiting the Stream Paradigm)

遅延評価を使うと電子回路で言うフィードバック回路を構成することができます.時間 t のときの値が y_t = f(y_{t-1}) だから,それを入力として次の時間 t+1 のときの値は y_{t+1} = f(y_t) だなとかいう.こういう現実のモデル化は,まさに,SICP の Section 3.5 冒頭で言われていることですね.

Can we avoid identifying time in the computer with time in the modeled world? Must we make the model change with time in order to model phenomena in a changing world? Think about the issue in terms of mathematical functions. We can describe the time-varying behavior of a quantity x as a function of time x(t). If we concentrate on x instant by instant, we think of it as a changing quantity. Yet if we concentrate on the entire time history of values, we do not emphasize change -- the function itself does not change.

問題 3-73 では,直列 RC 回路の電圧を求めるそうです.
v=v_0 + \frac 1C\int_0^tidt+Ri
直列回路のどこにフィードバックが混ざってるの?バカなの?死ぬの?って感じですが,積分もまぁフィードバックですね.SICP では入力としてストリーム x=(x_i) と初期値 C,微小時間 \mathrm{dt} をとり,積算した部分和をストリームとして返す形で integral としています.実装を見るとフィードバックになってるのが分かりやすい.

(define (integral integrand initial-value dt)
  (define int
    (cons-stream initial-value
                 (add-streams (scale-stream integrand dt)
                              int)))
  int)

問題では RC 回路の抵抗とキャパシタンス,時間幅を指定して,ある関数を返すような関数 (ややこしいですね…) を作れという指定.ある関数というのは,各時間での電流値を示すストリームと電圧の初期値の 2 つを引数として,各時間における RC 回路の電圧値をストリームとして返す関数です.書いたのはこんな感じ.

(define (RC R C dt)
  (define (volt-RC i v0)
    (add-streams (scale-stream (integral i v0 dt) (/ 1 C))
                (scale-stream i R)))
  volt-RC)