【数式処理 MuPAD 入門】
平田 浩一 / 1997年12月25日 
hirata@edserv.ed.ehime-u.ac.jp 
愛媛大学教育学部数学教室 


多項式の計算



多項式

ここでは、x5 - 2 x3 + 2 x - 3 のような多項式の処理について説明します。

多項式には、x のような変数が含まれますが、多項式の計算をする前に 変数記号 x に値が代入されていないことを確認します。

● x;
                                     x

もし、次の例のように何らかの値が代入されている場合は、 変数に NIL を代入し値を消去しておきます。

● x;
                                     6
● x:=NIL;
                                    NIL
● x;
                                     x

MuPAD での多項式の表し方は 2通りあります。

● (x+y)^2-3;
                                      2
                               (x + y)  - 3
● poly((x+y)^2-3,[x]);
                                    2    2
                      poly(2 x y + x  + y  - 3, [x])

前者は数学での表現と同じです。MuPAD は多項式を 自動的に展開することはしません。 展開したい場合は expand を用います。

後者は MuPAD 独自の表し方で、式は常に展開されます。 またどの変数に着目するかを [x] のように指定できます。 この表記法について知りたい場合はオンラインマニュアルを参照ください。 ここでは取り上げないことにします。

■ 多項式の演算

多項式の加減乗とベキは +, -, *, ^ で計算します。

除算については分数式を作る演算と、商と余りを求める演算があります。

p1 / p2 分数式
divide(p1,p2) 商と余りを求める
divide(p1,p2,Quo) 商を求める
divide(p1,p2,Rem)     余りを求める
● p1:=x^2+x+1;
                                     2
                                x + x  + 1
● p2:=x+3;
                                   x + 3
● p1/p2;
                                     2
                                x + x  + 1
                                ----------
                                  x + 3
● divide(p1,p2);
                                 x - 2, 7
● divide(p1,p2,Quo);
                                   x - 2
● divide(p1,p2,Rem);
                                     7

多変数多項式に対して divide を用いる場合は、どの変数に関する除算かを 指定する必要があります。

● p3:=x^3+x*y^2;
                                  3      2
                                 x  + x y
● p4:=x+y+1;
                                 x + y + 1
● divide(p3,p4,[x],Rem);
                                     2          2
                         (y + 1) (- y  - (y + 1) )
● divide(p3,p4,[y],Rem);
                               3            2
                              x  + x (x + 1)

最大公約多項式、最小公倍多項式の計算、展開と因数分解の関数が用意されています。

gcd(p,q,…)     最大公約多項式
lcm(p,q,…) 最小公倍多項式
expand(p) 展開
factor(p) 因数分解
Factor(p) 因数分解
● p5:=x^2+2*x+1; p6:=x^2-1;
                                      2
                               2 x + x  + 1
                                   2
                                  x  - 1
● gcd(p5,p6);
                                   x + 1
● lcm(p5,p6);
                                    2    3
                             - x + x  + x  - 1
● p7:=expand((x+1)^8-1);
                    2       3       4       5       6      7    8
          8 x + 28 x  + 56 x  + 70 x  + 56 x  + 28 x  + 8 x  + x
● factor(p7);
                               2                  2      3    4
    [1, x, 1, x + 2, 1, 2 x + x  + 2, 1, 4 x + 6 x  + 4 x  + x  + 2, 1]
● Factor(p7);
                             2                2      3    4
           x (x + 2) (2 x + x  + 2) (4 x + 6 x  + 4 x  + x  + 2)

■ 多項式の次数、係数等

多項式の次数、係数、項数を求める関数があります。

degree(p,[v,w,…])     変数 v,w,… についての次数
coeff(p,v,n) 変数 v についての n 次の係数
nterms(p,[v,w,…]) 変数 v,w,… についての項の数
● p8:=x^4*y+5*x^2*y+y^3;
                             3      2      4
                            y  + 5 x  y + x  y
● degree(p8,[x,y]);
                                     5
● degree(p8,[y]);
                                     3
● coeff(p8,x,4);
                                     y
● coeff(p8,y,1);
                                    2    4
                                 5 x  + x
● coeff(coeff(p8,y,1),x,2);
                                     5
● nterms(p8,[x,y]);
                                     3
● nterms(p8,[y]);
                                     2

多項式をある変数に関して整理する関数もあります。

collect(p,[v,w,…])     変数 v,w,… で整理する
● collect(p8,[y]);
                             3         2    4
                            y  + y (5 x  + x )
● collect(p8,[x]);
                             3      2      4
                            y  + 5 x  y + x  y


有理式

有理式は有理数とは違い約分は自動的に行われません。 有理数を操作する関数としては次のものがあります。

normal(s) 1つの分数にまとめて約分
numer(s) normal で整理した有理式の分子
denom(s) normal で整理した有理式の分母
partfrac(s)     部分分数に分解
● s1:=1/(x+1)+x/(x^2-1);
                                1       x
                              ----- + ------
                              x + 1    2
                                      x  - 1
● normal(s1);
                                  2 x - 1
                                  -------
                                   2
                                  x  - 1
● numer(s1);
                                  2 x - 1
● denom(s1);
                                   2
                                  x  - 1
● partfrac(s1);
                               3           1
                           --------- + ---------
                           2 (x + 1)   2 (x - 1)


代入

次のような問題を考えてみます。

【例題 1】 多項式を f(x) =x5 + 5 x3 - 7 x2 + x - 1 とするとき、(1) f(3) を求めよ。
(2) f(x2+1) を求めよ。

まず、

● f:=x^5+5*x^3-7*x^2+x-1;
                                2      3    5
                         x - 7 x  + 5 x  + x  - 1

とおき、この多項式の変数 x に 3 や x2+1 を 代入しなければなりません。

このような代入操作のために subs という関数が用意されています。

subs(数式,[x=式1,y=式2,…])     代入

これを用いて、数式に x=式1, y=式2, … を代入できます。

● subs(f,[x=3]);
                                    317
● f1:=subs(f,[x=x^2+1]);
                 2       2     2       2     3     2     5
                x  - 7 (x  + 1)  + 5 (x  + 1)  + (x  + 1)
● expand(f1);
                      2       4       6      8    10
                   7 x  + 18 x  + 15 x  + 5 x  + x   - 1

次の例題はは多変数多項式への代入です。

【例題 2】  多項式を g(x,y,z) = (x + 2 y)2 + z3 とするとき、g(a,1,2) を求めよ。

例題1 と同様 subs を用いて計算します。

● g:=(x+2*y)^2+z^3;
                               3            2
                              z  + (x + 2 y)
● subs(g,[x=a,y=1,z=2]);
                                      2
                               (a + 2)  + 8


関数記号の定義

上の例では、subs を用いて代入し答えを求めました。 こんどは関数記号を定義し、それを用いて例題1 を解いてみましょう。

● f:=func(x^5+5*x^3-7*x^2+x-1, x);
                     func(x^5 + 5*x^3-7*x^2 + x-1, x)
● f(3);
                                    317
● f1:=f(x^2+1);
                 2       2     2       2     3     2     5
                x  - 7 (x  + 1)  + 5 (x  + 1)  + (x  + 1)
● expand(f1);
                      2       4       6      8    10
                   7 x  + 18 x  + 15 x  + 5 x  + x   - 1

実行例の1行目が関数記号 f の定義です。

f(x) = 数式

を定義するとき MuPAD では

f := func(数式, x);

のように入力します。

例題 2 のような多変数の関数

関数記号(変数1,変数2,…) = 数式

を定義する場合は次のようになります。

関数記号 := func(数式, 変数1,変数2,…);

関数記号 g を定義して例題 2 を解くと次のようなります。

● g:=func((x+2*y)^2+z^3, x,y,z);
                     func((x + 2*y)^2 + z^3, x, y, z)
● g(a,1,2);
                                      2
                               (a + 2)  + 8


微分・積分

微積分を計算する関数として

diff(f,v1,v2,…)     変数 v1,v2,… で微分
int(f,v) 変数 v で不定積分
int(f,v=a..b) 変数 v について区間 [a,b] で定積分

があります。

■ 微分

● f1:=x^7;
                                     7
                                    x
● diff(f1,x);
                                      6
                                   7 x
● diff(f1,x,x);
                                       5
                                   42 x
● f2:=x^5*y^3;
                                    5  3
                                   x  y
● diff(f2,x,x,y);
                                     3  2
                                 60 x  y

■ 不定積分

不定積分の計算には積分定数がつかないので注意してください。

● int(x^2, x);
                                     3
                                    x
                                    --
                                    3

積分定数を付けて、不定積分を繰り返し計算する場合は次のようになります。

● int(int(x^2,x)+C1,x)+C2;
                                           4
                                          x
                              C2 + C1 x + --
                                          12

■ 定積分

次に定積分の例です。

● int(x^3-x^2, x=0..1);
                                   -1/12
● int(1/(x^2+1), x=0..1);
                                    PI
                                    --
                                    4
● int(1/x, x=-1..1);
                                 undefined
● int(1/x^2, x=-1..1);
                                 infinity

積分区間に -∞ や ∞ が含まれる場合の定積分も計算できます。

● f:=1/(1+x^2);
                                    1
                                  ------
                                   2
                                  x  + 1
● int(f, x=-infinity..infinity);
                                    PI

最後に、2重積分の場合の例です。

● int(int(x^2+y, x=0..1), y=0..1);
                                    5/6

【演習問題】

(1) 次の多項式を因数分解せよ。

  1.  x3 + y3 + z3 - 3 x y z
  2.  (x + y + z) (x y + y z + z x ) - x y z

(2) 多項式 (x + 2 y + 1)10 を展開 したときの x4 y4 の係数を求めよ。

(3) 各式を x についての多項式とみて、商と余りを求めよ

  1.  (x10) ÷ (x2 + x + 1)
  2.  (x3 + y3 - 3 x y + 1) ÷ (x + y + 1)

(4) f(x) = x2 - 1, g(x) = x2 + 1 とするとき、 合成関数 f(g(x)) と g(f(x)) の展開式を求めよ。

(5) 関数 y = (x - a) (x - b)2 の x = a における微分係数を求めよ。

(6) 分数関数 y = (x + 1) / (x3 - x2 + x - 1) の 不定積分を求めよ。

(7) 関数 y = x4 / (x10 + 1) を区間 [0,∞) で 定積分せよ。


【数式処理 MuPAD 入門】