Gauche > Archives > 2013/02/28

2013/02/28 06:09:00 UTCiyanaha
#
Common LispのChatonで投稿したのと同じ内容のものを失礼ながら再投稿させていただきます。
#
PAIP(実用Common Lisp)について質問です。
8.6節「積分」のところで、因数を見つけて式yをxについて積分する一般的なアルゴリズムを示していますが、これがいまいち分かりません。
以下がそのアルゴリズムとなります。

1.yの因数を見つけ出してf(u)とする。
2.微分du/dxを計算する。
3.yをf(u)*du/dxで割って商をkとする。
4.kが定数(xを含んでいない)ならば、結果はk&f(u)duである。(&はインテグラルのつもりです)

例えば、&xsin(x^2)dxの場合、f(u)=sin(x^2),u=x^2,du/dx=2xとなるそうです。
ここで、ステップ1の因数の意味が分かりません。また、その求め方もわかりません。

一応、因数を求める関数らしきものの実行結果を下に示しておきます。
IMPLIFIER> (int x * sin(x ^ 2) d x)
1. Trace: (FACTORIZE '(* X (SIN (^ X 2))))
1. Trace: FACTORIZE ==> ((^ (SIN (^ X 2)) 1) (^ X 1))
1. Trace: (FACTORIZE '(* (^ (SIN (^ X 2)) 1) (* 2 (* (COS (^ X 2)) X))))
1. Trace: FACTORIZE ==> ((^ 2 1) (^ X 1) (^ (COS (^ X 2)) 1) (^ (SIN (^ X 2)) 1))
1. Trace: (FACTORIZE '(* (SIN (^ X 2)) (* 2 X)))
1. Trace: FACTORIZE ==> ((^ 2 1) (^ X 1) (^ (SIN (^ X 2)) 1))
1. Trace: (FACTORIZE '(* 1 (* (- (COS (^ X 2))) (^ 2 -1))))
1. Trace: FACTORIZE ==> ((^ -1/2 1) (^ (COS (^ X 2)) 1))
(-1/2 * (COS (X ^ 2))) 
SIMPLIFIER> (int sin(x ^ 2) d x)
1. Trace: (FACTORIZE '(SIN (^ X 2)))
1. Trace: FACTORIZE ==> ((^ (SIN (^ X 2)) 1))
1. Trace: (FACTORIZE '(* (^ (SIN (^ X 2)) 1) (* 2 (* (COS (^ X 2)) X))))
1. Trace: FACTORIZE ==> ((^ 2 1) (^ X 1) (^ (COS (^ X 2)) 1) (^ (SIN (^ X 2)) 1))
1. Trace: (FACTORIZE '(* (SIN (^ X 2)) (* 2 X)))
1. Trace: FACTORIZE ==> ((^ 2 1) (^ X 1) (^ (SIN (^ X 2)) 1))
1. Trace: (FACTORIZE '(* 1 (INT? (^ (SIN (^ X 2)) 1) X)))
1. Trace: FACTORIZE ==> ((^ (INT? (^ (SIN (^ X 2)) 1) X) 1))
((SIN (X ^ 2)) INT? X) 
SIMPLIFIER> (int x * sin(x ^ 2) + x * cos(x ^ 2))
1. Trace: (FACTORIZE '(* X X))
1. Trace: FACTORIZE ==> ((^ X 2))
(((X ^ 2) * (SIN (X ^ 2))) + (X * (COS (X ^ 2)))) 

なお、関数自体は、"http://www.norvig.com/paip/macsyma.lisp"のfactorizeを参照してください。