diff(integrate(f(s,x),s,t,x),x)を計算する過程で呼ばれる。
不定積分=>
定積分=> 積分と微分の交換、積分範囲で微分
(defmfun diffint (e x) ;; example ((%INTEGRATE . #1=(SIMP)) (($F . #1#) $S) $S 0 $T) $X
(let (a)
(cond
;;indefinite integral
((null (cdddr e))
(cond ((alike1 x (caddr e)) (cadr e))
((and (not (atom (caddr e))) (atom x) (not (free (caddr e) x)))
(mul2 (cadr e) (sdiff (caddr e) x)))
((or ($constantp (setq a (sdiff (cadr e) x)))
(and (atom (caddr e)) (free a (caddr e))))
(mul2 a (caddr e)))
(t (simplifya (list '(%integrate) a (caddr e)) t))))
;;definite integral
;;integrating variable = differential variable
((alike1 x (caddr e)) (addn (diffint1 (cdr e) x x) t))
;;integrating variable =/ differential variable
(t (print (simplifya (list 'b) t)))
(t (addn (cons
;; differentiate integrand with respect to x
(if (equal (setq a (sdiff (cadr e) x)) 0)
0
;; integrate a
(simplifya (list '(%integrate) a (caddr e) (cadddr e) (car (cddddr e))) t))
;; arguments are (integrand, integrating variable, integral range), differential variable, integrating variable
(diffint1 (cdr e) x (caddr e))) t)))))
(defun diffint1 (e x y)
(let ((u (sdiff (cadddr e) x)) (v (sdiff (caddr e) x)))
;;int_(caddr e)^(cadddr e) (car e)(y) dy
;;(mul2 'a 'b) => '((%mtimes) a b)
(list (if (pzerop u) 0 (mul2 u (maxima-substitute (cadddr e) y (car e))))
(if (pzerop v) 0 (mul3 v (maxima-substitute (caddr e) y (car e)) -1)))))
0 件のコメント:
コメントを投稿