Степенныe ряды представленные в виде бесконечных потоков

В разделе 2.5.3 мы увидели, как реализовать систему арифметики многочленов, используя представление многочленов в виде списка термов. Подобным же образом можно работать со степенными рядами (power series), например

3.59_1

представленными в виде бесконечных потоков. Будем представлять последовательность a₀ + a₁x + a₂x² + a₃x³ + ··· как поток, элементами которого являются коэффициенты a₀, a₁, a₂, a₃, ... .

а. Интеграл последовательности a₀ + a₁x + a₂x² + a₃x³ + ··· есть последовательность

3.59_2

где c — произвольная константа. Определите процедуру integrate-series , которая на входе принимает поток a₀, a₁, a₂, ... , представляющую степенной ряд, и возвращает поток a₀, (1/2)a₁, (1/3)a₂, ... коэффициентов при неконстантных членах интеграла последовательности. (Поскольку в результате отсутствует постоянный член, он не представляет собой степенной ряд; при использовании integrate-series мы через cons будем присоединять к началу соответствующую константу.)

б. Функция x → eˣ равна своей собственной производной. Отсюда следует, что и интеграл суть одна и та же последовательность, с точностью до постоянного члена, который равен e⁰ = 1 . Соответственно, можно породить последовательность для через

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

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

(define cosine-series
  (cons-stream 1 <??>))
(define sine-series
  (cons-stream 0 <??>))

Комментарии отсутствуют.

Необходима авторизация

Вы должны авторизоваться для создания комментария.

Вход
(define (stream-car stream) (car stream))

(define (stream-cdr stream) (force (cdr stream)))

(define (stream-ref s n)
  (if (= n 0)
      (stream-car s)
      (stream-ref (stream-cdr s) (- n 1))))

(define (stream-map proc . list-of-stream)
    (if (null? (car list-of-stream))
        '()
        (cons-stream
            (apply proc 
                   (map (lambda (s)
                            (stream-car s))
                        list-of-stream))
            (apply stream-map 
                   (cons proc (map (lambda (s)
                                       (stream-cdr s))
                                   list-of-stream))))))


(define (mul-streams s1 s2)
    (stream-map * s1 s2))

(define (div-streams s1 s2)
    (stream-map / s1 s2))

(define (add-streams s1 s2)
  (stream-map + s1 s2))

(define ones (cons-stream 1 ones))

(define integers (cons-stream 1 (add-streams ones integers)))

(define (scale-stream stream factor)
  (stream-map (lambda (x) (* x factor)) stream))

(define double (cons-stream 1 (scale-stream double 2)))

(define s (integrate-series double))

(check-equal? (stream-ref s 0) 1)
(check-equal? (stream-ref s 1) 1)
(check-equal? (stream-ref s 3) 2)
(check-equal? (stream-ref s 7) 16)

(check-equal? (stream-ref sine-series 0) 0)
(check-equal? (stream-ref sine-series 1) 1)
(check-equal? (stream-ref sine-series 2) 0)
(check-equal? (stream-ref cosine-series 0) 1)
(check-equal? (stream-ref cosine-series 1) 0)
(check-equal? (stream-ref cosine-series 2) -1/2)