|
158 | 158 | [(? number?) (taylor-exact brf)] |
159 | 159 | [(? symbol?) (taylor-exact brf)] |
160 | 160 | [`(,const) (taylor-exact brf)] |
161 | | - [`(+ ,args ...) (apply taylor-add (map recurse args))] |
| 161 | + [`(+ ,arg1 ,arg2) (taylor-add (recurse arg1) (recurse arg2))] |
162 | 162 | [`(neg ,arg) (taylor-negate (recurse arg))] |
163 | 163 | [`(* ,left ,right) (taylor-mult (recurse left) (recurse right))] |
164 | 164 | [`(/ ,num ,den) |
|
227 | 227 | (loop (+ n 1)) |
228 | 228 | n))) |
229 | 229 |
|
230 | | -(define (align-series . serieses) |
231 | | - ;(->* () #:rest (listof term?) (listof term?)) |
232 | | - (cond |
233 | | - [(or (<= (length serieses) 1) (apply = (map car serieses))) serieses] |
234 | | - [else |
235 | | - (define offset* (car (argmax car serieses))) |
236 | | - (for/list ([series serieses]) |
237 | | - (define offset (car series)) |
238 | | - (cons offset* |
239 | | - (λ (n) |
240 | | - (if (negative? (+ n (- offset offset*))) |
241 | | - (adder 0) |
242 | | - ((cdr series) (+ n (- offset offset*)))))))])) |
243 | | - |
244 | 230 | (define (make-series offset builder) |
245 | 231 | (define cache (make-dvector 10)) |
246 | 232 | (define fetch (curry dvector-ref cache)) |
|
252 | 238 | (dvector-ref cache n)) |
253 | 239 | (cons offset lookup)) |
254 | 240 |
|
255 | | -(define (taylor-add . terms) |
256 | | - ;(->* () #:rest (listof term?) term?) |
257 | | - (match-define `((,offset . ,serieses) ...) (apply align-series terms)) |
258 | | - (make-series (car offset) |
259 | | - (λ (f n) |
260 | | - (make-sum (for/list ([series serieses]) |
261 | | - (series n)))))) |
| 241 | +(define (taylor-add left right) |
| 242 | + ;(-> term? term? term?) |
| 243 | + (match-define (cons left-offset left-series) left) |
| 244 | + (match-define (cons right-offset right-series) right) |
| 245 | + (define target-offset (max left-offset right-offset)) |
| 246 | + (define (align offset series) |
| 247 | + (define shift (- offset target-offset)) |
| 248 | + (cond |
| 249 | + [(zero? shift) series] |
| 250 | + [else |
| 251 | + (λ (n) |
| 252 | + (if (negative? (+ n shift)) |
| 253 | + (adder 0) |
| 254 | + (series (+ n shift))))])) |
| 255 | + (define left* (align left-offset left-series)) |
| 256 | + (define right* (align right-offset right-series)) |
| 257 | + (make-series target-offset (λ (f n) (make-sum (list (left* n) (right* n)))))) |
262 | 258 |
|
263 | 259 | (define (taylor-negate term) |
264 | 260 | ;(-> term? term?) |
|
0 commit comments