Month: January, 2008

Решение упражнения 2.15 из SICP

22 January, 2008 (21:06) | Решения упражнений | 3 comments

Мы немножко забежали вперед в предыдущем упражнении и получили на примерах подтверждение утверждения Евы о том, что вторая процедура расчета сопротивления для параллельных резисторов (par2) дает более точные результаты при работе с пакетом интервальной арифметики, разработанным Лизой.
Но вернемся к более общей идее Евы о том, что формула для вычисления интервалов, которая использует Лизину систему, будет давать […]

Решение упражнения 2.14 из SICP

22 January, 2008 (20:38) | Решения упражнений | 1 comment

Действительно сначала попробуем повторить результаты Дайко экспериментально.
Создадим несколько интервалов в форме центр/проценты:
(define r100p1 (make-center-percent 100 1))
(define r100p5 (make-center-percent 100 5))
(define r1000p1 (make-center-percent 1000 1))
(define r1000p5 (make-center-percent 1000 5))
Попробуем провести вычисления для них по двум алгебраически эквивалентным формулам, как это сделал Дайко:
> (par1 r100p1 r100p1)
(48.51980198019802 . 51.52020202020203)
> (par2 r100p1 r100p1)
(49.49999999999999 . 50.5)
> (par1 r100p1 r1000p5)
(81.71155516941789 . 101.09628217349857)
> (par2 […]

Решение упражнения 2.13 из SICP

21 January, 2008 (22:37) | Решения упражнений | 1 comment

В этом упражнении программирования не будет совсем. Скорее что-то близкое к физике. Но не расслабляйтесь.
Итак, пусть у нас есть два интервала: x с центром cx и погрешностью в процентах px и y с центром cy и погрешностью в процентах py. Обозначая интервал в виде заключенной в квадратные скобки упорядоченной пары левой и правой границ и переходя […]

Решение упражнения 2.12 из SICP

21 January, 2008 (22:00) | Решения упражнений | 2 comments

Конструктор получается достаточно прямолинейно по формулам
lower-bound = center - center * percent / 100,
upper-bound = center + center * percent / 100:
(define (make-center-percent c p)
  (let ((w (* c (/ p 100))))
    (make-interval (- c w) (+ c w))))
Еще проще выразить конструктор через имеющийся make-center-width. 
Селектор для percent можно получить, воспользовавшись таким математическим результатом, выразив percent из […]

Решение упражнения 2.11 из SICP

21 January, 2008 (21:29) | Решения упражнений | 2 comments

Это упражнение простое, но требует внимания. Девять случаев, о которых сказано в условии, получаются путем комбинации трех вариантов расположения первого интервала относительно нуля с тремя вариантами расположения второго интервала относительно нуля.
Три возможных варианта следующие:

интервал лежит целиком справа от нуля (обе границы неотрицательны);
интервал лежит целиком слева от нуля (обе границы неположительны);
интервал содержит нуль (левая граница отрицательна, а правая […]

Решение упражнения 2.10 из SICP

19 January, 2008 (21:14) | Решения упражнений | No comments

Просто введем проверку на то, что нижняя и верхняя границы интервала-делителя не равны нулю и одного знака. Самый краткий способ записать это - сравнить произведение границ интервала с нулем (в случае положительного результата деление на интервал допустимо). Процедура div-interval с проверкой выглядит так:
(define (div-interval x y)
(if (<= (* (lower-bound y) (upper-bound y)) 0)
[…]

Решение упражнения 2.9 из SICP

19 January, 2008 (21:07) | Решения упражнений | 2 comments

Для удобства введем следующие краткие обозначения. Для интервала x будем обозначать его нижнюю границу l(x), верхнюю границу - u(x), а радиус - r(x) = (u(x)-l(x))/2.
Вначале покажем, что радиус суммы и разности интервалов зависит только от радиусов интервалов, которые складываются или вычитаются:
r(x+y) = [u(x+y) - l(x+y)] / 2 = [(u(x)+u(y)) - (l(x)+l(y))] / 2 = [(u(x)-l(x)) […]

Решение упражнения 2.8 из SICP

18 January, 2008 (22:11) | Решения упражнений | No comments

Давайте сначала уточним, почему при сложении двух интервалов мы суммируем соответствующие границы. Дело в том, что минимум суммы достигается на минимумах слагаемых, а максимум суммы достигается на максимумах слагаемых. Все просто.
Чтобы определить нижнюю и верхнюю границы при вычитании интервалов, нужно разобраться, когда достигаются минимум и максимум разности. Очевидно, что для большего значения разности нужно максимизировать […]

Решение упражнения 2.7 из SICP

18 January, 2008 (21:34) | Решения упражнений | 1 comment

После слегка головоломного упражнения 2.6 (кстати, всем, кто его не делал, рекомендую) в этом упражнении можно расслабиться. Имея определение make-interval, введенное в упражнении
(define (make-interval a b) (cons a b))
и предполагая, что нижняя граница интервала идет первым параметром, а верхняя вторым, мы можем легко записать селекторы таким образом:
(define (lower-bound interval) (car interval))
(define (upper-bound interval) (cdr interval))

Решение упражнения 2.6 из SICP

18 January, 2008 (21:20) | Решения упражнений | 5 comments

Мы уже сводили пары к процедурам и пары к числам в двух предыдущих упражнениях. Сейчас нам предстоит задача для истинных интеллектуальных гурманов: мы будем представлять числа как процедуры.
Имея определения zero и add-1 из условия упражнения
(define zero
  (lambda (f) (lambda (x) x)))
(define (add-1 n)
  (lambda (f) (lambda (x) (f ((n f) x))))) ,
вычислим one как подстановку […]