9

これは宿題の質問ではありません。区間演算と演習 2.16 の意味についての理解に満足していないだけです。

セクション 2.14 で定義された区間演算は、通常の演算の特性を示しません。(r1*r2)/(r1 + r2) と 1/(1/r1 + 1/r2) の 2 つは同等の演算であり、異なる結果が得られます。この演習では、なぜそうなるのか、また、そうでない区間演算システムを構築できるかどうかを尋ねます。

このセクションでは、電気部品の抵抗の許容誤差の計算について説明しています。これらの用語で、間隔を乗算およ​​び除算することが何を意味するのか理解できません。2 つの間隔を乗算するアプリケーションは何ですか?

この例の問題なしに区間演算システムを構築することは可能ですか?

http://mitpress.mit.edu/sicp/full-text/book/book-ZH-14.html#%_sec_2.1.4

(define (make-interval a b)
  (cons a b))

(define (make-center-width c w)
  (make-interval (- c w) (+ c w)))

(define (make-center-percent c p)
  (make-center-width c (* c (/ p 100.0))))

(define (lower-bound i)
  (car i))

(define (upper-bound i)
  (cdr i))

(define (center i)
  (/ (+ (upper-bound i) (lower-bound i)) 2))

(define (width i)
  (/ (- (upper-bound i) (lower-bound i)) 2))

(define (percent i)
  (* 100.0 (/ (width i) (center i))))

(define (add-interval x y)
  (make-interval (+ (lower-bound x) (lower-bound y))
                 (+ (upper-bound x) (upper-bound y))))

(define (sub-interval x y)
  (make-interval (- (lower-bound x) (lower-bound y))
                 (- (upper-bound x) (upper-bound y))))

(define (mul-interval x y)
  (let ((p1 (* (lower-bound x) (lower-bound y)))
        (p2 (* (lower-bound x) (lower-bound y)))
        (p3 (* (lower-bound x) (lower-bound y)))
        (p4 (* (lower-bound x) (lower-bound y))))
    (make-interval (min p1 p2 p3 p4)
                   (max p1 p2 p3 p4))))

(define (div-interval x y)
  (if (= (width y ) 0) 
      (error "division by interval with width 0")
      (mul-interval x
                    (make-interval (/ 1.0 (upper-bound y))
                                   (/ 1.0 (lower-bound y))))))

(define (parl1 r1 r2)
  (div-interval (mul-interval r1 r2)
                (add-interval r1 r2)))

(define (parl2 r1 r2)
  (let ((one (make-interval 1 1)))
              (div-interval one
                           (add-interval (div-interval one r1)
                                         (div-interval one r2))))

(define (r1 (make-interval 4.0 3.2)))
(define (r2 (make-interval 3.0 7.2)))

(center (parl1 r1 r2))
(width (parl1 r1 r2))
(newline)
(center (parl2 r1 r2))
(width (parl2 r1 r2))
4

2 に答える 2

11

これは、区間演算の演算がフィールドの算術構造を持っていないために発生します。

Sussman が言うように、演習は難しいです。フィールド構造の各操作を確認し、どれが満たされていないかを確認する必要があります。

この演習では、区間演算が関数の範囲の演算ではないことを示すよう求めています。

ドメイン [-1, 1] で定義された f (x) = x^2 のような関数の範囲は [0,1] で、[-1,1] * [-1,1] = [- 1,1]、シンボルxをシンボルの定義域で置き換えることによって得られますx

f(x,y) = x * y のように、次元ごとに異なる変数を使用する同様の関数を定義すると、ドメイン [-1,1] * [-1 で定義されたときのこの関数の範囲,1] は、間隔 [-1,1] * [-1,1] = [-1, 1] と同じです。

関数 f(.., x, ..) が各変数で連続しているx場合、各シンボルが f の定義で 1 回だけ使用されている場合、範囲演算は区間演算と同一になります。

アリスの最初の式では、並列抵抗器は、変数 R1 の 2 倍と変数 R2 の 2 倍を繰り返して計算されます。同じ引数を使用すると、この関数の範囲は、次の式から得られる対応する間隔の積に含まれます。各名前を対応するドメイン間隔で置き換えますが、厳密には同じではありません。

書き換えられた関数の範囲が、書き換えられた関数の式を適用して得られた間隔と同じになるように関数を書き換え、名前が書き換えられた関数の対応する名前の定義域に等しい間隔で置き換えられるようにするか、またはこれが可能な関数ごとに不可能であることを示します。

この問題は依存性問題と呼ばれ、その理解はSICPの目的から外れている大きな問題であり、それを解くには多変数微分方程式が必要です。

この演習の目的は、Sussman 自身が言ったように、データを複数の方法でエンコードできることを示すことです。焦点は数学ではなく、データの抽象化です。

于 2013-01-03T00:03:49.763 に答える