Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[100]

где c - произвольная константа. Определите процедуру integrate-series, которая на входе принимает поток a0,ai,a2,..представляющую степенной ряд, и возвращает

поток ао, -ai, -02,... коэффициентов при неконстантных членах интеграла последовательности. (Поскольку в результате отсутствует постоянный член, он не представляет собой степенной ряд; при использовании integrate-series мы через cons будем присоединять к началу соответствующую константу.)

b. Функция x н-► ex равна своей собственной производной. Отсюда следует, что ex и интеграл ex суть одна и та же последовательность, с точностью до постоянного члена, который равен e0 = 1. Соответственно, можно породить последовательность для ex

(define exp-series

(cons-stream 1 (integrate-series exp-series)))

Покажите, как породить последовательности для синуса и косинуса, опираясь на то, что производная синуса равна косинусу, а производная косинуса равна минус синусу:

(define cosine-stream (cons-stream 1 (??)))

(define sine-series (cons-stream 0 (??)))

Упражнение 3.60.

Если степенной ряд представляется в виде потока своих коэффициентов, как в упражнении 3.59, то сумма последовательностей реализуется посредством add-streams. Завершите определение следующей процедуры для перемножения последовательностей:

(define (mul-series s1 s2)

(cons-stream (??) (add-streams (??) (??))))

Можете проверить свою процедуру, убедившись, что sin2 x + cos2 x = 1 с помощью последовательностей из упражнения 3.59.

Упражнение 3.61.

Пусть S будет степенным рядом (упражнение 3.59 с постоянным членом 1. Предположим, что мы хотим найти степенной ряд 1/S, то есть такой ряд X, что S • X = 1. Запишем S = 1 + Sr, где SR - часть S после постоянного члена. Тогда мы можем решить уравнение для X так:

Другими словами, X есть степенной ряд с постоянным членом 1, чьи члены с более высокими степенями определяются как минус произведение SR и X. Воспользовавшись этим, напишите процедуру invert-unit-series, которая вычисляет 1/S для степенного ряда S с постоянным членом 1. Вам потребуется mul-series из упражнения 3.60.

Упражнение 3.62.

При помощи результатов упражнений 3.60 и 3.61 определите процедуру div-series, которая делит один степенной ряд на другой. Div-series должна работать для любых двух рядов, при условии, что ряд в знаменателе начинается с ненулевого постоянного члена. (Если в знаменателе постоянный член равен нулю, div-series должна сообщать об ошибке.) Покажите, как при помощи div-series и результата упражнения 3.59 получить степенной ряд для тангенса.

через

S

(1 + Sr) X + Sr

X X X X

1 1 1

1 - Sr • X


3.5.3 Использование парадигмы потоков

Потоки с задержкой вычисления могут служить мощным инструментом моделирования. Они дают многие из преимуществ, обычно предоставляемых внутренним состоянием и присваиванием. Более того, они избегают некоторых из теоретических неудобств, связанных с введением присваивания в язык программирования.

Потоковый метод может изменять взгляд на вещи, так как он позволяет строить системы с другими границами модулей, не такими, как в системах, основанных на присваивании переменным состояния. Например, можно сосредоточивать внимание на всей временной последовательности (или сигнале), а не на значении переменных состояния в отдельные моменты. Оказывается удобно сочетать и сравнивать параметры состояния в различные моменты времени.

Итерация как потоковый процесс

В разделе 1.2.1 мы ввели понятие итеративного процесса, по мере исполнения изменяющего переменные состояния. Теперь мы узнали, что можно представлять состояние в виде «вневременного» потока значений, а не набора обновляемых переменных. Давайте примем этот взгляд и заново рассмотрим процедуру поиска квадратного корня из раздела 1.1.7. Напомним, что идея процедуры состояла в том, чтобы порождать последовательность все лучших и лучших приближений к квадратному корню ж, снова и снова применяя процедуру улучшения гипотезы:

(define (sqrt-improve guess x) (average guess (/ x guess)))

В исходной процедуре sqrt эти гипотезы были последовательными значениями переменной состояния. Вместо этого можно породить бесконечный поток гипотез, в голове которого стоит начальная гипотеза 1: 65

(define (sqrt-stream x) (define guesses (cons-stream 1.0

(stream-map (lambda (guess)

(sqrt-improve guess x)) guesses)))

guesses)

(display-stream (sqrt-stream 2)) 1

1.5

1.4166666666666665 1.4142156862745097 1.4142135623746899

Можно порождать все больше элементов потока, получая все лучшие приближения. Если нужно, можно написать процедуру, которая бы порождала гипо-

65Внутреннюю переменную guesses нельзя связать с помощью let, поскольку значение guesses зависит от нее самой. В упражнении 3.63 рассматривается вопрос, зачем здесь нужна внутренняя переменная.


тезы до тех пор, пока ответ не окажется достаточно хорош. (См. упражнение 3.64.)

Еще один итеративный процесс, который можно рассматривать подобным образом - аппроксимация числа п, основанная на знакочередующемся ряде, упомянутом в разделе 1.3.1:

п111

4=1-3 + 5-7+-Сначала мы порождаем поток элементов ряда (числа, обратные нечетным натуральным, с чередующимся знаком). Затем мы берем поток сумм все большего количества элементов (при помощи процедуры partial-sums из упражнения 3.55) и домножаем результат на 4:

(define (pi-summands n) (cons-stream (/ 1.0 n)

(stream-map - (pi-summands (+ n 2)))))

(define pi-stream

(scale-stream (partial-sums (pi-summands 1)) 4))

(display-stream pi-stream) 4.

2.666666666666667

3.466666666666667

2.8952380952380956

3.3396825396825403

2.9760461760461765

3.2837384837384844

3.017071817071818

Получается поток все более точных приближений к п, но сходятся эти приближения довольно медленно. Восемь членов последовательности поместили п между 3.284 и 3.017.

Пока что подход с потоком состояний не слишком отличается от потока с переменными состояния. Однако потоки дают нам возможность проделывать некоторые интересные трюки. Например, поток можно преобразовать с помощью ускорителя последовательности (sequence accelerator), преобразующего последовательность приближений в новую последовательность, которая сходится к тому же значению, что и исходная, но быстрее.

Один такой ускоритель, открытый швейцарским математиком восемнадцатого века Леонардом Эйлером, хорошо работает с последовательностями частичных сумм знакочередующихся рядов (рядов, знаки элементов которых чередуются). По методу Эйлера, если Sn есть n-й член исходного ряда, то ускоренная последовательность имеет элементы

g ($п+1 - Sn)2

Sn-1 - 2Sn + Sn+1

Таким образом, если исходная последовательность представлена как поток значений, преобразованная последовательность дается процедурой

(define (euler-transform s)

(let ((s0 (stream-ref s 0)) ; Sn-i



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32] [стр.33] [стр.34] [стр.35] [стр.36] [стр.37] [стр.38] [стр.39] [стр.40] [стр.41] [стр.42] [стр.43] [стр.44] [стр.45] [стр.46] [стр.47] [стр.48] [стр.49] [стр.50] [стр.51] [стр.52] [стр.53] [стр.54] [стр.55] [стр.56] [стр.57] [стр.58] [стр.59] [стр.60] [стр.61] [стр.62] [стр.63] [стр.64] [стр.65] [стр.66] [стр.67] [стр.68] [стр.69] [стр.70] [стр.71] [стр.72] [стр.73] [стр.74] [стр.75] [стр.76] [стр.77] [стр.78] [стр.79] [стр.80] [стр.81] [стр.82] [стр.83] [стр.84] [стр.85] [стр.86] [стр.87] [стр.88] [стр.89] [стр.90] [стр.91] [стр.92] [стр.93] [стр.94] [стр.95] [стр.96] [стр.97] [стр.98] [стр.99] [стр.100] [стр.101] [стр.102] [стр.103] [стр.104] [стр.105] [стр.106] [стр.107] [стр.108] [стр.109] [стр.110] [стр.111] [стр.112] [стр.113] [стр.114] [стр.115] [стр.116] [стр.117] [стр.118] [стр.119] [стр.120] [стр.121] [стр.122] [стр.123] [стр.124] [стр.125] [стр.126] [стр.127] [стр.128] [стр.129] [стр.130] [стр.131] [стр.132] [стр.133] [стр.134] [стр.135] [стр.136] [стр.137] [стр.138] [стр.139] [стр.140] [стр.141] [стр.142] [стр.143] [стр.144] [стр.145] [стр.146] [стр.147] [стр.148] [стр.149] [стр.150] [стр.151] [стр.152] [стр.153] [стр.154] [стр.155] [стр.156] [стр.157] [стр.158] [стр.159] [стр.160] [стр.161] [стр.162] [стр.163] [стр.164] [стр.165] [стр.166] [стр.167] [стр.168] [стр.169] [стр.170] [стр.171] [стр.172] [стр.173] [стр.174] [стр.175] [стр.176] [стр.177] [стр.178] [стр.179] [стр.180] [стр.181] [стр.182] [стр.183] [стр.184] [стр.185] [стр.186] [стр.187] [стр.188] [стр.189] [стр.190] [стр.191] [стр.192] [стр.193] [стр.194] [стр.195] [стр.196]