数値的微分じゃなくて、記号的微分(Symbolic Differentiation)やろうぜって章に入りました。
最初はどうやってやるんだっていうか無理じゃねみたく思っていたのですが、簡単なヤツなら結構簡単にできるみたいです。簡単って言うのも、コロンブスの卵だと思うんですけど。
既に本文で
、
、
、
というルールは用意されていて、ここに
の規則を埋めろって課題です。
本文で何をすれば良いのかも書いてあるので、まずは構築子と選択子、述語を作って、
(define (exponentiation? x) ; 述語 (and (pair? x) (eq? (car x) '**))) (define (base p) (cadr p)) ; 選択子 (define (exponent p) (caddr p)) ; 選択子 (define (make-exponentiation base exponent) ; 構築子 (cond ((=number? exponent 0) 1) ((=number? exponent 1) base) (else (list '** base exponent))))
微分用関数はこれ。
(define (deriv exp var) (cond ((number? exp) 0) ((variable? exp) (if (same-variable? exp var) 1 0)) ((exponentiation? exp) (make-product (exponent exp) (make-product (deriv (base exp) var) (make-exponentiation (base exp) (- (exponent exp) 1))))) ((sum? exp) (make-sum (deriv (addend exp) var) (deriv (augend exp) var))) ((product? exp) (make-sum (make-product (multiplier exp) (deriv (multiplicand exp) var)) (make-product (deriv (multiplier exp) var) (multiplicand exp)))) (else (error "unknown expression type -- DERIV" exp))))
を微分してみると
(deriv '(** (+ (* 5 x ) y) 5) 'x) ; (* 5 (* 5 (** (+ (* 5 x) y) 4)))
という答えがでてきます。ちとシンプルじゃないな。