複雑な微分をするときは計算機に任せた方が良いように思う。
Scheme で微分するには次のようにする。
(define (deriv exp var)
(cond ((eq? exp var) 1)
((not (pair? exp)) 0)
((eq? (car exp) '-)
`(- ,(deriv (cadr exp) var)))
((eq? (car exp) '+)
`(+ ,(deriv (cadr exp) var) ,(deriv (caddr exp) var)))
((eq? (car exp) '*)
`(+ (* ,(deriv (cadr exp) var)
,(caddr exp))
(* ,(cadr exp)
,(deriv (caddr exp) var))))
((eq? (car exp) 'expt)
(let ((g (cadr exp))
(n (caddr exp)))
`(* (* ,n (expt ,g ,(- n 1))) ,(deriv g var))))
((eq? (car exp) 'sin)
`(* (cos ,(cadr exp)) ,(deriv (cadr exp) var)))
((eq? (car exp) 'cos)
`(* (- (sin ,(cadr exp))) ,(deriv (cadr exp) var)))
((eq? (car exp) 'tan)
`(* (+ 1 (expt ,exp 2)) ,(deriv (cadr exp) var)))
(else (error "not yet."))))
> (deriv '(expt (* (sin x) (cos x)) 1/2)) 'x) => (* (* 1/2 (expt (* (sin x) (cos x)) -1/2)) (+ (* (* (cos x) 1) (cos x)) (* (sin x) (* (- (sin x)) 1))))
`-‘ 演算子は単項演算子としてのみ使える。