Last active
January 2, 2016 16:09
-
-
Save Jamil/8327825 to your computer and use it in GitHub Desktop.
Multiple (indefinite) integration of a polynomial expression in Scheme
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #lang scheme | |
| (define (make-sum a1 a2) | |
| (list '+ a1 a2)) | |
| (define (make-product m1 m2) | |
| (list '* m1 m2)) | |
| (define (make-exponent e1 e2) | |
| (list '** e1 e2)) | |
| (define (term-var-integrate expr var) | |
| (define (term-var term) (cadr term)) | |
| (define (term-exp term) (caddr term)) | |
| (define (dependent? expr) ; test for dependence on integrating variable | |
| (cond ((empty? expr) #f) | |
| ((eq? (term-var (car expr)) var) #t) | |
| (else | |
| (dependent? (list-tail expr 1))))) | |
| (define (coeff expr) ; determine the divisor of the coefficient | |
| (cond ((empty? expr) 0) | |
| ((eq? (term-var (car expr)) var) | |
| (+ (+ (term-exp (car expr)) 1) (coeff (cdr expr)))) | |
| (else | |
| (coeff (list-tail expr 1))))) | |
| (define (product-terms expr) ; determine each product term after integrationq | |
| (cond ((empty? expr) empty) | |
| ((eq? (term-var (car expr)) var) | |
| (cons (make-exponent var (+ (term-exp (car expr)) 1)) (product-terms (cdr expr)))) | |
| (else | |
| (cons (car expr) (product-terms (list-tail expr 1)))))) | |
| (cond ((empty? expr) empty) | |
| ((dependent? (list-tail expr 2)) | |
| (cons '* (cons (/ (cadr expr) (coeff (list-tail expr 2))) (product-terms (list-tail expr 2))))) | |
| (else empty))) | |
| (define (integrate expr var-list) | |
| (define (var-integrate expr var) | |
| (cond ((empty? expr) empty) | |
| (else (cons | |
| (term-var-integrate (car expr) var) | |
| (var-integrate (cdr expr) var))))) | |
| (cond ((empty? var-list) expr) | |
| (else | |
| (integrate (var-integrate expr (car var-list)) (cdr var-list))))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment