数学ソフトウェア Maple の紹介

示野信一
http://www.xmath.ous.ac.jp/~shimeno
shimeno@xmath.ous.ac.jp
岡山県教育センター研修講座
2003年8月7日
岡山理科大学理学部応用数学科

Mathematica や Maple などのコンピュータソフトウェアは数学の計算や探求を行うための革新的なソフトウェアです。これらのソフトウェアは、

  1 数値の計算

  2 数式の計算

  3 グラフィックス

を統合的に扱うことができる点に特徴があります。数式の計算が行える部分を強調した、「数式処理ソフトウェア」または「計算機代数システム」という呼び方をされることもあります。統合的なプログラミング環境も提供されています。様々な数学の関数やコマンドが用意されているので、BASIC, C などの伝統的なプログラミング言語に比べて容易に望む結果を得ることができます。

岡山理科大学では Maple のキャンパスライセンスを有しているので、キャンパス内のコンピュータで自由に Maple を使うことができます。

Maple とは?

Maple (メイプル)は1980年代にカナダの Waterloo 大学で開発され、現在は Waterloo Maple 社が開発・販売している数学ソフトウェアです。パソコンやワークステーション上で使用することができます。現在の最新バージョンは Maple 8 です。応用数学科の実習室には Maple V Release 5 の日本語版がインストールされています。

Maple はメニューやマニュアル、オンラインで参照できるヘルプの日本語化が進められています。開発元のホームページでは、科学技術分野、教育分野など幅広い分野における Maple の使用例が公開されており、日本の代理店 サイバネットシステムのホームページでも日本語で参照できる利用例が公開されています。

Maple と同等の機能を持つソフトウェアには、 Mathematica や MuPAD があります。

Maple の特徴

 数式の計算 (整式、方程式、微分積分)

 数値の計算 (任意精度)

 グラフィックス (平面、空間、アニメーション)

 プログラム言語

 ワークシートインタフェースで対話的に利用できる (マウスとキーボード)

 多くの拡張パッケージ (線形代数、数学学習、統計、整数論、科学単位など)

 ワークシート、グラフィックスの外部出力

 ウェブで多くの情報が提供されている

 岡山理科大学では Maple のキャンパスライセンスを有しているので、キャンパス内のコンピュータで自由に Maple を使うことができる

数の計算

簡単な計算

百聞は一見にしかず、実際に Maple を使ってみましょう。

1. Maple のアイコンをダブルクリックする (Maple の起動)

2. プロンプト > からコマンドを入力する

3. エンターキーを押す (コマンドの実行)

簡単な計算を実行してみましょう。

>    1+1;

2

割り算には / を使います。

>    1/3+1/2;

5/6

Maple は自動的に通分した結果を返します。

掛け算には * を使います。

>    13*17;

221

ベキ乗には ^ を使います。

>    2^100;

1267650600228229401496703205376

厳密な数と近似値

evalf ( ) コマンドにより近似値を計算することができます。

>    evalf(1/3);

.3333333333

数に小数点が含まれていると自動的に近似値が得られます。

>    2.0+1/7;

2.142857143

次の結果と比較してみて下さい。

>    2+1/7;

15/7

平方根は sqrt ( ) 関数により与えられます。

>    sqrt(26);

26^(1/2)

>    evalf(sqrt(26));

5.099019514

 evalf ( ) コマンドに桁数を与えることにより、標準の値 10 桁から変更することができます。

>    evalf(sqrt(26), 20);

5.0990195135927848300

円周率

>    Pi;

Pi

>    evalf(Pi, 100);

3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068

数式の計算

Maple は式の計算や微分積分など様々な計算ができます。

文字式の展開には expand ( ) 、因数分解には factor ( ) を使います。

(a+b)^2  の展開

>    expand((a+b)^2);

a^2+2*a*b+b^2

(a+b)^3  の展開

>    expand((a+b)^3);

a^3+3*a^2*b+3*a*b^2+b^3

x^6-1  の因数分解

>    factor(x^6-1);

(x-1)*(x+1)*(x^2+x+1)*(x^2-x+1)

x^4+64  の因数分解

>    factor(x^4+64);

(x^2-4*x+8)*(x^2+4*x+8)

結果はちょっと意外だったかもしれません。

分数式の計算をすることもできます。

>    1/x-1/(x+1);

1/x-1/(x+1)

式を通分するには normal ( ) を使います。直前の結果は入力し直さなくても %  により参照することができます。

>    normal(%);

1/(x*(x+1))

分数式   1/((a-b)*(a-c))+1/((b-c)*(b-a))+1/((c-a)*(c-b))   を通分してみましょう。

>    1/((a-b)*(a-c))+1/((b-c)*(b-a))+1/((c-a)*(c-b));

1/((a-b)*(a-c))+1/((b-c)*(b-a))+1/((c-a)*(c-b))

>    normal(%);

0

a^2/(a-b)/(a-c)+b^2/(b-c)/(b-a)+c^2/(c-a)/(c-b)   ではどうでしょうか。分子の2乗を3乗にするとどうでしょう。

関数のグラフ

関数のグラフを描くには plot  コマンドを使います。

y = x^2  の x = -1  から 1 までのグラフを描きます。範囲の指定の仕方に注意しましょう。

>    plot(x^2, x=-1..1);

[Maple Plot]

y = sin(x)  の  -Pi  から  Pi  までのグラフを描きます。関数の変数は ( ) で囲んでいること、 Pi  は Pi と入力していることに注意して下さい。三角関数の変数の単位は数学Cや数学IIIで学ぶ弧度法(ラジアン)を使っています。

>    plot(sin(x), x=-Pi..Pi);

[Maple Plot]

x 軸と y 軸の縦横比が 1:1 でないのが気になるようなら、グラフをクリックすると現れるメニューバー上の 1:1 ボタンを押すか、次のように scaling=constrained を付け加えます。

>    plot(sin(x), x=-Pi..Pi, scaling=constrained);

[Maple Plot]

式の形をいろいろと変えてグラフを描いてその結果を考察してみるとおもしろいでしょう。

>    plot(sin(2*x), x=-Pi..Pi, scaling=constrained);

[Maple Plot]

>    plot(2*sin(x), x=-Pi..Pi, scaling=constrained);

[Maple Plot]

>    plot(sin(x)+cos(x), x=-Pi..Pi, scaling=constrained);

[Maple Plot]

>    plot(sin(x)^2, x=-Pi..Pi, scaling=constrained);

[Maple Plot]

{ } で囲んで与えることにより、複数のグラフを一緒に描くこともできます。

>    plot({x^2+2*x+1, 2*x+1}, x=-4..4);

[Maple Plot]

高等学校の範囲外ですが、 plot3d  コマンドを使うと、3次元空間の曲面を描くこともできます。 x  と y  の式、 x  の範囲、 y  の範囲を plot3d  コマンドに与えます。axes=boxed により箱型の座標軸を付け加えます(axes=normal とすると通常の座標軸が表示されます)。

>    plot3d(x^2-y^2, x=-2..2, y=-2..2, axes=boxed);

[Maple Plot]

マウスで図をクリックしたままドラッグすると、曲面を動かしていろいろな方向から見ることができます。

>    plot3d(sin(x)*sin(y), x=-2*Pi..2*Pi, y=-2*Pi..2*Pi);

[Maple Plot]

いろいろな曲線

数学Cで学ぶいろいろな曲線を Maple を使って描いてみましょう。

最初に次のように入力しておきます。

>    with(plots): setoptions(scaling=constrained):

Warning, the name changecoords has been redefined

媒介変数で表された曲線

媒介変数で表された曲線を描くには、 x  座標、 y  座標、媒介変数の範囲を [ ] で囲んで、 plot  コマンドに与えます。

例1 x = cos(t)  ,   y = sin(t)

>    plot([cos(t), sin(t), t=0..2*Pi]);

[Maple Plot]

例2 x = cos(7*t)   ,   y = sin(3*t)

>    plot([cos(7*t), sin(3*t), t=0..2*Pi]);

[Maple Plot]

cos の中の 7 や sin の中の 3 を別の値に変えてみるとどうなるでしょう。

例3 x = sin(2*t) ,   y = sin(3*t)

>    plot([sin(2*t), sin(3*t), t=0..2*Pi]);

[Maple Plot]

例4 x = cos(t)+5*cos(3*t) ,   y = 6*cos(t)-5*sin(3*t)

>    plot([cos(t)+5*cos(3*t), 6*cos(t)-5*sin(3*t), t=0..2*Pi]);

[Maple Plot]

極方程式で与えられた曲線

>    with(plots): setoptions(scaling=constrained):

極方程式で与えられた曲線を描くには polarplot  コマンドを使います。

例1 r = 1

>    polarplot(1);

[Maple Plot]

例2 r = sin(4*theta)

>    polarplot(sin(4*theta));

[Maple Plot]

theta (シータ) と打ち込むのは面倒なら、偏角に別の記号を使っても構いません。以下では t  を使います。

例3 r = t

>    polarplot(cos(t));

[Maple Plot]

偏角の範囲を指定することもできます。

例4 r = t   ( t = 0 .. 2*Pi )

>    polarplot(t, t=0..2*Pi);

[Maple Plot]

問題  次の極方程式で与えられる曲線を描いてみてください。

r = 2+sin(8*t)+sin(64*t)/t

r = exp(sin(t))-2*cos(4*t)+sin(t/12)^15   ( t = 0 .. 24*Pi )

Maple では、 exp(sin(t))  は exp(sin(t))  と入力します。

アニメーション

Maple を使ってアニメーションを作るのはとても楽しいものです。

アニメーションの原理はテレビや映画と同じ原理で、連続した絵が次々とすばやく表示されると絵が動いて見えるという訳です。

plots パッケージのコマンド animate  によってアニメーションを作ります。たとえば、次の例は y = sin(a*x)  のグラフで a を 1 から 2 まで少しずつ変化させた一連のグラフィックスを表示します。

>    restart;

>    with(plots):

Warning, the name changecoords has been redefined

>    animate(sin(a*x), x=0..2*Pi, a=1..2);

[Maple Plot]

アニメーションを再生するには、まず得られた図をクリックして選択し、上方に現れたメニュー上の再生ボタンを押します。

次の3つの例では、パラメータ a を変化させて放物線を動かしています。

>    animate(a*x^2, x=-3..3, a=-4..4);

[Maple Plot]

>    animate(x^2+a, x=-3..3, a=-4..4);

[Maple Plot]

>    animate((x-a)^2, x=-12..12, a=-4..4);

[Maple Plot]

極方程式で与えられた曲線のアニメーションの例。オプション coords=polar により極方程式であることを指定しています。

numpoints を増やすと計算する点の数が増えて曲線が滑らかになります。

>    plot(sin(3*theta), theta=0..2*Pi, coords=polar);

[Maple Plot]

>    animate(sin(a*theta), theta=0..2*Pi, a=1..16, coords=polar, numpoints=500);

[Maple Plot]

>    animate(a+sin(3*theta), theta=0..2*Pi, a=0..1.5, coords=polar, numpoints=200);

[Maple Plot]

>    animate(cos(5*theta)+a*cos(theta), theta=0..2*Pi, a=-5..5, coords=polar, numpoints=200);

[Maple Plot]

問題   思い思いの式を入力してアニメーションを作ってみて下さい。期待通りのアニメーションが得られたでしょうか?


animatecurve
コマンドを使うと、曲線を描いていく様子をアニメーションにすることができます。アニメーションを再生するには、図をクリックすると現れるメニュー上の再生ボタンを押します。

例1 y = sin(x)

>    animatecurve(sin(x), x=-Pi..Pi);

[Maple Plot]

例2 x = cos(t)+5*cos(3*t) ,   y = 6*cos(t)-5*sin(3*t)

>    animatecurve([cos(t)+5*cos(3*t), 6*cos(t)-5*sin(3*t), t=0..2*Pi], numpoints=200);

[Maple Plot]

ここでは numpoints は曲線を描く際に計算する媒介変数の分割数を 200 に指定しています。

>    animatecurve([cos(t), sin(t), t=0..2*Pi]);

[Maple Plot]

逆回り

>    animatecurve([cos(-t), sin(-t), t=0..2*Pi]);

[Maple Plot]

サイクロイド

>    animatecurve([t-sin(t), 1-cos(t), t=0..2*Pi], scaling=constrained);

[Maple Plot]

>    animatecurve([cos(t)+5*cos(3*t), 6*cos(t)-5*sin(3*t), t=0..2*Pi], numpoints=200, color=black);

[Maple Plot]

問題   点が (0,3) を出発して、原点を中心とする半径3の円周上を反時計回りに動くアニメーションを作ってみて下さい。

問題    x = (cos(t)+5*cos(3*t), y = 6*cos(t)-5*sin(3*t))  で与えられる曲線を animatecurve を用いて描いてみて下さい。

numpoints を増やした方がよいでしょう。

3次元のアニメーションは animate  の代わりに animate3d  を使って同様に描くことができます。

>    animate3d(sin(a*x)*sin(a*y), x=0..2*Pi, y=0..2*Pi, a=1..2);

[Maple Plot]

別の例

>    animate3d(sin(x*y*a), x=-2..2, y=-2..2, a=0..1, style=patchnogrid, shading=zgrayscale, orientation=[0,0]);

[Maple Plot]

反復グラフィックス

Maple を使ったグラフィックスプログラミングの例をやってみましょう。

縮小と平行移動の繰り返しによりできる図形 (フラクタル図形の一種) をMaple を使って描きます。例としてまず次の図形を描いてみましょう。

[Maple Plot]

最初にいくつかおまじないを記しておきます。(with コマンドでグラフィックス関連の plots, plottools パッケージを読み込む、setoptions で以下の図はすべて縦横比を実寸とし、図の色を青色 (blue) に設定する。別の好きな色にしてもよいでしょう。)

>    with(plots): with(plottools):

Warning, the name arrow has been redefined

>    setoptions(scaling=constrained, color=blue);


polygon コマンドは頂点の座標を与え、点を 「その順に」 結んだ多角形を作成します。
polygon は 「多角形」 を表す英単語です。

t := としているのは、作った多角形 (今の場合は三角形) に名前 t を付けるためです。

行の最後を ; ではなく : で終わっているのは、結果を表示しないためです。

>    t := polygon([[0,1],[1,1],[1,0]]):


作成したグラフィックスを見るためには display コマンドを使います。
display は 「表示する」 という意味の英単語です。

>    display(t);

[Maple Plot]


t の縦横とも 0.5 倍に縮小して、名前 tt をつけます。
scale は 「縮尺」 を表す英単語です。

>    tt := scale(t, 0.5, 0.5):


tt を x 軸方向に 0.5 平行移動して名前 tt1 をつけます。

translate は 「平行移動」 を表す英単語です。
y 軸方向にはずらさないので、移動する分を x, y の順に 0.5, 0 と与えています。

>    tt1 := translate(tt, 0.5, 0):

>    display(tt1, view=[0..1, 0..1]);

[Maple Plot]

オプション view を追加することにより、表示する x, y の範囲を指定しています。
単に display(tt1); とするとどうなるでしょう?

tt  を y 軸方向に 0.5 平行移動して名前 tt2 をつけます。

>    tt2 := translate(tt, 0, 0.5):

>    display(tt2, view=[0..1, 0..1]);

[Maple Plot]

tt を  を x 軸方向,y 軸方向にそれぞれ 0.5 平行移動して名前 tt3 をつけます。

>    tt3 := translate(tt, 0.5, 0.5):

>    display(tt3, view=[0..1, 0..1]);

[Maple Plot]

tt1, tt2, tt3 を一緒に表示します。

>    display({tt1,tt2,tt3});

[Maple Plot]

[Maple Plot] [Maple Plot] [Maple Plot]

左の図形 t を真中の図形に変える操作をもう1回繰り返すと右の図形になります。

これを行うプログラムを書いてみましょう。

1つの図形 x に対してそれを縦横とも 0.5 倍に縮小したものを対応させる関数 (写像) を s と名付けます。
-> は - と > を続けて打って、矢印を表しています。

>     s := x -> scale(x, 0.5, 0.5):


図形 x に、x を0.5倍に縮小したもの s(x) を平行移動した3つの図形の列を対応させる関数を f と名付けます。

>    f := x ->  (translate(s(x), 0.5, 0),
           translate(s(x), 0, 0.5),
           translate(s(x), 0.5, 0.5)):

f を1つの図形だけでなく、図形の集合 y のそれぞれの図形に適用させる対応を g と名付けます。

>    g := y -> map(f, y):


あとは g を {t} (最初の三角形 t を要素とする集合)に繰り返し適用して display で描くことができます。

gの4回の繰り返し(合成)は g@@4 と表します。

>    display((g@@4)({t}));

[Maple Plot]

繰り返しの回数を変えて試してみて下さい。あまり大きい値にすると計算時間が膨大になります。

問題

上の例を真似て、左の図形を右の図形に変える操作を繰り返すプログラムを作ってみてください。

[Maple Plot] [Maple Plot]

時間があったら、上と似ている別の例をやってみましょう。

[Maple Plot] [Maple Plot]

更に別の例 (最初の図形は正三角形)

3^(1/2)  は sqrt(3) と入力します。

[Maple Plot] [Maple Plot]

>    sqrt(3);

3^(1/2)

>   

>   

参考文献

Maple7 ラーニングガイド,シュプリンガー・フェアラーク東京,2002.

示野信一,Maple V で見る数学ワールド,シュプリンガー・フェアラーク東京,1999.