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