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


集合と方程式



集合

BASIC や FORTRAN などのプログラミング言語を学んだことがあれば、 配列というデータ構造を知っていると思います。配列はデータ構造 としては非常に原始的なものです。数式処理では、データ構造として より柔軟な、集合やリストがよく用いられます。

最初に集合を取上げます。

■ 集合

MuPAD で扱える集合は有限集合です。その大きさは使用できるメモリにより 制限されます。集合は {2,3,5,7,11} のように要素を列挙して表現します。 空集合は { } と表します。

● {2,3,5,7,11};
                             {2, 3, 5, 7, 11}
● {};
                                    {}

集合の中に重複している要素がある場合は、重複している要素は削除されます。

● {11,2,3,2,2,7,5,11};
                             {2, 3, 5, 7, 11}

集合の場合、要素の並ぶ順番には特に意味はありませんので、MuPAD が処理しやすい ように順番に並べ変えてしまいます。(小さいものから順に並ぶわけではありま せん。)

● {1,10,100,1000};
                            {1, 100, 10, 1000}

集合の要素としては、さまざまなデータが扱えます。

● {PI,x-y,{1,2,3},ehime,(x+y)/x};
                  {            x + y                   }
                  { {1, 2, 3}, -----, x - y, ehime, PI }
                  {              x                     }

重複する要素は削除されるといいましたが、次の例のように見かけが異なる式は 同じものとは見なされないので注意ください。

● {x^2-1,(x+1)*(x-1)};
                           2
                         {x  - 1, (x + 1) (x - 1)}

■ 集合の生成

「10から40までの奇数の集合」や「1から100までの平方数の集合」のような 集合を扱いたいとき、要素を一個一個手で入力するのは個数が多い場合には大変です。

集合の要素が規則的に生成できる場合には次のような方法で入力できます。

● S1:={2*i+1 $ i=5..19};
       {39, 17, 19, 21, 23, 25, 27, 29, 31, 33, 11, 35, 13, 37, 15}
● S2:={i^2 $ i=1..10};
                  {16, 64, 1, 25, 49, 4, 100, 9, 81, 36}

数学で集合を { 2 i + 1 | i=5,6,…,19} や { i2 | i=1,2,…,10} のように表現する のによく似ています。MuPAD では「|」のかわりにドル記号「$」を用います。

同様な例として、小さいものから素数を10個とってできる集合を作るときは 次のようになります。

● S3:={ithprime(i) $ i=1..10};
                   {17, 19, 23, 2, 3, 5, 29, 7, 11, 13}

これらの例を見て、集合の要素が小さいものから順に並んでいたら 見やすいのになと思った方は、 後に述べるリストを使ってください。リストでも同様のことができます。

■ 集合の個数

集合の要素の個数をカウントするときは関数 nops を用います。

nops(A)     集合 A の要素の個数 |A|

上の3つの集合の個数を数えてみます。

● nops(S1); nops(S2); nops(S3);
                                    15
                                    10
                                    10

■ 集合の演算

和集合、共通集合、差集合の演算が用意されています。

A union B     和集合 A∪B
A intersect B     共通集合 A∩B
A minus B     差集合 A−B
● S1:={1,2,3,4,5}; S2:={3,4,5,6,7};
                              {1, 2, 3, 4, 5}
                              {3, 4, 5, 6, 7}
● S1 union S2;
                           {1, 2, 3, 4, 5, 6, 7}
● S1 intersect S2;
                                 {3, 4, 5}
● S1 minus S2;
                                  {1, 2}
● S2 minus S1;
                                  {6, 7}

また、ある要素が集合に属しているかどうかを判定する関数があります。

contains(A,x)   x∈A のとき TRUE, 他の場合は FALSE
● S3:={2,3,5,7,11};
                             {2, 3, 5, 7, 11}
● contains(S3,7);
                                   TRUE
● contains(S3,6);
                                   FALSE


方程式

ここでは方程式の解の求め方を説明します。 方程式を解くために用いる関数は solve です。

solve(eq, v)     方程式 eq を変数 v について解く

方程式は

x^2 - 5*x + 6 = 0

のように左辺と右辺を「=」で結びます。

2次方程式の例をあげます。

● solve(x^2-5*x+6=0,x);
                                  {2, 3}
● solve(x^2=8,x);
                                  1/2     1/2
                            {- 2 2   , 2 2   }
● solve(x^2+1=0,x);
                                 {- I, I}

この例のように、方程式の解は「集合」として得られます。

さらに変数を含む場合でも、

● solve(x^2+a*x=b,x);
               {               2 1/2                2 1/2 }
               {   a   (4 b + a )       a   (4 b + a )    }
               { - - - -------------, - - + ------------- }
               {   2         2          2         2       }

のように解が求まります。

次は3次方程式の例です。

● solve(x^3-2*x^2-x+2=0,x);
                                {-1, 1, 2}
● solve(x^3-4*x^2+5*x=2,x);
                                  {1, 2}

2つめの例では、1 と 2 の一方の解は重解になるのですが、どちらが重解かは これでは分かりません。解の重複度も知りたい場合は Multiple オプションを つけます。

● solve(x^3-4*x^2+5*x=2,x,Multiple);
                             {[1, 2], [2, 1]}

結果は { [解1, 重複度], [解2, 重複度], … } を意味しています。 従って、重解は 1 です。

次数が高い場合には、次のような解になることがあります。

● f1:=x^6+x^5+3*x^2+4*x+1;
                                  2    5    6
                         4 x + 3 x  + x  + x  + 1
● solve(f1=0,x);
                                           5
                        {-1, RootOf(3 x + x  + 1)}

この RootOf(…) は 5次以上の既約方程式で代数的には解が求められないこと を意味しています。

数値的な近似解が知りたいときは、次のようにします。

● float(hold(solve)(f1=0,x));
   {-0.3319890295, -1.0, - 0.839072433 + 0.9438515501 I,
   - 0.839072433 - 0.9438515501 I, 1.005066947 - 0.9372591567 I,
   1.005066947 + 0.9372591567 I}

■ 連立方程式

連立方程式を解く場合も同様に solve を用います。

solve({eq1,…},{v1,…})    連立方程式 {eq1,…} を変数 {v1,…} について解く

連立方程式

3 x + y = a
5 x + 2 y = b

を解いてみましょう。

● eq := {3*x+y=a, 5*x+2*y=b};
                       {3 x + y = a, 5 x + 2 y = b}
● solve(eq,{x,y});
                     {{x = 2 a - b, y = - 5 a + 3 b}}

2つの楕円

x2 + 3 y2 = 1
3 x2 + y2 = 1

の交点を求めてみましょう。

● eq := {x^2+3*y^2=1, 3*x^2+y^2=1};
                        2      2         2    2
                      {x  + 3 y  = 1, 3 x  + y  = 1}
● solve(eq,{x,y});
    {[x = 1/2, y = 1/2], [x = 1/2, y = -1/2], [x = -1/2, y = 1/2],
    [x = -1/2, y = -1/2]}

【演習問題】

(1) 集合 A={1,2,3,4,6,12}, B={1,2,3,6,9,18} に対して、次を計算せよ。

  1. 和集合 A∪B
  2. 共通集合 A∩B
  3. 差集合 A−B

(2) 次のような集合を求めよ。

  1. 1 から 50 までの整数のうち、6で割り切れる数の集合
  2. 1 から 50 までの整数のうち、4でも 6でも割り切れない数の集合
  3. 1 から 50 までの整数のうち、2, 3, 7 の少なくとも 1つで割り切れる数の集合

(3) 次の方程式の解を求めよ。重解を持つ場合はその重複度も求めよ。

  1. 12 x3 - 8 x2 - 13 x - 3 = 0
  2. x4 + x3 - 3 x2 - 5 x - 2 = 0

(4) 次の連立1次方程式を解け。

- x - 2 y + 3 z = 4
3 x + 6 y - 5 z = 0
2 x - y + 4 z = 12

(5) 方程式 x3 - 7 x2 + 9 x - 2 = 0 の近似解を求めよ。

(6) 双曲線 x2 - y2 = 9 と直線 y = 2 x - 6 の交点を求めよ。


【数式処理 MuPAD 入門】