Function: math-do-integral-methods
math-do-integral-methods is a byte-compiled function defined in
calcalg2.el.gz.
Signature
(math-do-integral-methods INTEG-EXPR)
Source Code
;; Defined in /usr/src/emacs/lisp/calc/calcalg2.el.gz
(defun math-do-integral-methods (integ-expr)
(let ((math-integ-expr integ-expr)
(math-so-far math-integ-var-list-list)
rat-in)
;; Integration by substitution, for various likely sub-expressions.
;; (In first pass, we look only for sub-exprs that are linear in X.)
(or (math-integ-try-linear-substitutions math-integ-expr)
(math-integ-try-substitutions math-integ-expr)
;; If function has sines and cosines, try tan(x/2) substitution.
(and (let ((p (setq rat-in (math-expr-rational-in math-integ-expr))))
(while (and p
(memq (car (car p)) '(calcFunc-sin
calcFunc-cos
calcFunc-tan
calcFunc-sec
calcFunc-csc
calcFunc-cot))
(equal (nth 1 (car p)) math-integ-var))
(setq p (cdr p)))
(null p))
(or (and (math-integ-parts-easy math-integ-expr)
(math-integ-try-parts math-integ-expr t))
(math-integrate-by-good-substitution
math-integ-expr (list 'calcFunc-tan (math-div math-integ-var 2)))))
;; If function has sinh and cosh, try tanh(x/2) substitution.
(and (let ((p rat-in))
(while (and p
(memq (car (car p)) '(calcFunc-sinh
calcFunc-cosh
calcFunc-tanh
calcFunc-sech
calcFunc-csch
calcFunc-coth
calcFunc-exp))
(equal (nth 1 (car p)) math-integ-var))
(setq p (cdr p)))
(null p))
(or (and (math-integ-parts-easy math-integ-expr)
(math-integ-try-parts math-integ-expr t))
(math-integrate-by-good-substitution
math-integ-expr (list 'calcFunc-tanh (math-div math-integ-var 2)))))
;; If function has square roots, try sin, tan, or sec substitution.
(and (let ((p rat-in))
(setq math-t1 nil)
(while (and p
(or (equal (car p) math-integ-var)
(and (eq (car (car p)) 'calcFunc-sqrt)
(setq math-t1 (math-is-polynomial
(nth 1 (setq math-t2 (car p)))
math-integ-var 2)))))
(setq p (cdr p)))
(and (null p) math-t1))
(if (cdr (cdr math-t1))
(if (math-guess-if-neg (nth 2 math-t1))
(let* ((c (math-sqrt (math-neg (nth 2 math-t1))))
(d (math-div (nth 1 math-t1) (math-mul -2 c)))
(a (math-sqrt (math-add (car math-t1) (math-sqr d)))))
(math-integrate-by-good-substitution
math-integ-expr (list 'calcFunc-arcsin
(math-div-thru
(math-add (math-mul c math-integ-var) d)
a))))
(let* ((c (math-sqrt (nth 2 math-t1)))
(d (math-div (nth 1 math-t1) (math-mul 2 c)))
(aa (math-sub (car math-t1) (math-sqr d))))
(if (and nil (not (and (eq d 0) (eq c 1))))
(math-integrate-by-good-substitution
math-integ-expr (math-add (math-mul c math-integ-var) d))
(if (math-guess-if-neg aa)
(math-integrate-by-good-substitution
math-integ-expr (list 'calcFunc-arccosh
(math-div-thru
(math-add (math-mul c math-integ-var)
d)
(math-sqrt (math-neg aa)))))
(math-integrate-by-good-substitution
math-integ-expr (list 'calcFunc-arcsinh
(math-div-thru
(math-add (math-mul c math-integ-var)
d)
(math-sqrt aa))))))))
(math-integrate-by-good-substitution math-integ-expr math-t2)) )
;; Try integration by parts.
(math-integ-try-parts math-integ-expr)
;; Give up.
nil)))