第 2 章 Maxima のデータとその操作
2.3 式について
2.3.11 総和と積
∑と∏
¶ ³
product(⟨式⟩,⟨添字変数⟩,⟨下限⟩,⟨上限⟩) sum(⟨式⟩,⟨添字変数⟩,⟨下限⟩,⟨上限⟩)
µ ´
product函数は⟨添字変数⟩の⟨下限⟩から⟨上限⟩迄の⟨式⟩の値の積を与えます. ⟨上限⟩が
⟨下限⟩より小になると空の積となり,この場合,product函数はエラー出力ではなく1を返します.
評価はsum函数と似ていますが,総和函数sumとは異なる点は,productの簡易化は無い事です.
product函数を制御する大域変数
¶ ³
変数名 初期値 概要
prodhack false product函数の簡易化を制御
µ ´
大域変数prodhackがtrueであれば,product(f(i),i,3,1)は1/f(2)となります. これはa>bの場 合,product(f(i),i,a,b) = 1/product(f(i),i,b+1,a-1)とする為です.尚,prodhackがデフォルトのfalse
で,a<bの場合, product(f(i),i,a,b)はエラーになります.
(%i12) prodhack:true;
(%o12) true
(%i13) product(f(x),x,5,1);
1
(%o13)
---f(2) f(3) f(4)
sum函数は⟨添字変数⟩を⟨下限⟩から⟨上限⟩迄の値の⟨式⟩の和を取ります. ⟨上限⟩と⟨下 限⟩が整数で異なっていれば,和の各々の項は評価されて互いに加えられます.
sum函数を制御する大域変数
¶ ³
変数名 初期値 概要
simpsum false sum函数の簡易化を制御
sumhack false 上限と下限の入換えの制御
sumexpand false 総和の積の処理を制御
cauchysum fale Cauchy積の適用を制御
genindex i sumやproductで利用される疑似変数名を設定
gensumnum false 疑似変数の番号
µ ´
大域変数simpsumがtrueの場合,sum函数を自動的に簡易化します.
(%i33) simpsum;
(%o33) false
(%i34) sum(x^n,n,0,m);
m
====
\ n
(%o34) > x
/
====
n = 0 (%i35) simpsum:true;
(%o35) true
(%i36) sum(x^n,n,0,m);
m + 1
x - 1
(%o36)
---x - 1
Is abs(x) - 1 positive, negative, or zero?
pos;
(%o37) inf
(%i38) sum(x^n,n,0,inf);
Is abs(x) - 1 positive, negative, or zero?
neg;
1
(%o38)
---1 - x
この様にsimpsumがfalseの場合,sum(xˆn,n,0,m)の簡易化は実行されませんが, simpsumが trueとなると,自動的に簡易化が実行されます.sum(xˆn,n,0,inf)の場合, xの絶対値から1を引い たものが正か負か零であるかを利用者が指定する事で簡易化が行えます.
大域変数sumhackがtrueの場合,sum(f(x),x,a,b)のa,bがa > bの場合, sum(f(x),x,a,b) を-sum(f(x),x,b-1,a+1)で置換えます.但し,sumhackがfalseの場合はエラーになります.
(%i12) sumhack:true$
(%i13) sum(f(i),i,3,1);
(%o13) -f(2)
(%i14) sum(f(i),i,5,1);
(%o14) -f(4)-f(3)-f(2) (%i15) sumhack:false;
(%o15) false
(%i16) sum(f(i),i,5,1);
Lower bound to sum: 5
is greater than the upper bound: 1
-- an error. Quitting. To debug this try debugmode(true);
大域変数sumexpandがtrueの場合,sum函数同士の積を纏めてsum函数の入れ子にします.
(%i1) sum(f(x),x,0,m)*sum(g(x),x,0,n);
m n
==== ====
\ \
(%o1) ( > f(x)) > g(x)
/ /
==== ====
x = 0 x = 0
(%i2) sumexpand:true;
(%o2) true
(%i3) sum(f(x),x,0,m)*sum(g(x),x,0,n);
m n
==== ====
\ \
(%o3) > > f(i1) g(i2)
/ /
==== ====
i1 = 0 i2 = 0
但し,この処理はinfやminfを含む総和に対して利用する事は危険です.
大域変数cauchysumは大域変数sumexpandと対で用います.大域変数sumexpandとcauchysum の両方がtrueの場合,総和の掛算を纏める際に,通常の積ではなくCauchy積が利用されます.
(%i1) sumexpand:true$
(%i2) cauchysum:true$
(%i3) sum(f(x),x,0,m)*sum(g(x),x,0,n);
m n
==== ====
\ \
(%o3) > > f(i1) g(i2)
/ /
==== ====
i1 = 0 i2 = 0 (%i4) sum(f(x),x,0,inf)*sum(g(x),x,0,n);
inf n
==== ====
\ \
(%o4) > > f(i3) g(i4)
/ /
==== ====
i3 = 0 i4 = 0
(%i5) sum(f(x),x,0,inf)*sum(g(x),x,0,inf);
inf i5
==== ====
\ \
(%o5) > > g(i5 - i6) f(i6)
/ /
==== ====
i5 = 0 i6 = 0
大域変数genindexと大域変数gensumnumはsum函数内部の疑似変数を生成する為に用いられ
る大域変数です.大域変数genindexには疑似変数のアルファベットが,大域変数gensumnumには 疑似変数の番号が各々設定されています.ここで,大域変数gensumnumはsum函数内部で疑似変 数を生成する度に,一つづつ増加します.
(%i1) sumexpand:true$
(%i2) gensumnum;
(%o2) 0
(%i3) sum(f(x),x,0,m)*sum(g(x),x,0,n);
m n
==== ====
\ \
(%o3) > > f(i1) g(i2)
/ /
==== ====
i1 = 0 i2 = 0 (%i4) gensumnum;
(%o4) 2
この例では,大域変数sumexpandをtrueにした為,総和の積が纏められてしまい, その結果,二 つの疑似変数i1とi2が新たに生成されています.この時,gensumnumは最初が0で,それから二つ の疑似変数を生成した為,2になっています.