数式処理システム Maple について
神戸大学 学術情報基盤センター
田村 直之

はじめに

0

カナダ Waterloo 大学で開発された数式処理システム Maple は数式処理，数値計算はもちろん，3 次元グラフィックス表示などの機能を持つ最も現代的かつ統合的な数学ソフトウェアです．理工系だけでなく様々な分野の研究・教育に役に立ちます．
神戸大学は， 2005 年度から Maple の六甲台地区のキャンパスライセンスを有し，2008 年度から全学で利用可能となっています．学術情報基盤センターの iMac での利用，および研究室のパソコンにインストールしての利用が可能です．詳しくは， 学術情報基盤センターの「Maple: 数式処理システム」をご覧下さい．
以下は，神戸大学 Maple ホームページ1 で公開している「Maple 入門」の内容を元に，Maple の基本的な使い方を説明したものです．

数値計算

1

まず，Maple に数の計算をさせてみましょう．まずは足し算からです．Mathematica と異なり，入力の最後に ; (セミコロン) が必要な点に注意してください．
>

123456789+987654321;
1111111110

次は掛け算です．Mathematica と異なり，* (アスタリスク) が必要です．
>

142857142857*7;
999999999999

では次に，100 の階乗を計算してみましょう (計算結果は一部省略)．
>

1000!;
4023872600.....0000000000

最後の桁まで正しく? (だれか確認してください :-) 求まっています． 1000! でも大丈夫! 上の 100! のところでマウスをクリックして書換えてみてください．

2 の 100 乗なんていうのでも，へっちゃらです．
>

2^100;
1267650600228229401496703205376

加減乗除以外にも，Maple にはさまざまな関数が用意されています．例えば，10! の平方根は，以下のようにすれば計算できます．ここで，sqrt(x) という記法で x の平方根を表していることに注意してください．
>

sqrt(10!);720 sqrt (7)1 http://bach.istc.kobe-u.ac.jp/maple/

7 の平方根が残っていますね． Maple は結果をできるだけ厳密なままで表現しようとします
ので，結果を勝手に数値に直すことはしません． 例えば，log(2) (2 の自然対数) を計算させてみても，もとのままです (log ではなく ln になっていますが同じ意味です)．
>log(2);ln (2)

次のようにすれば，この結果を数値に直すことができます (Mathematica では N でした)．
>

evalf(%);
0.6931471806

ここで，evalf(x) は x を数値に変換する Maple の関数です．また % は直前に実行した計算結果を表します．

関数 evalf の第 2 引数に精度を与えることによって，より高い精度の数値を求めることもできます．
>

evalf(log(2), 40);0.6931471805599453094172321214581765680755

同様に，円周率 (Maple では Pi で表す) の最初の 100 桁を求めたければ，以下のようにします (一部省略)．
>

evalf(Pi, 100);
3.1415926535.....5342117068

evalf や sqrt のように Maple にあらかじめ用意されている関数を組込関数と呼びます． Maple
9.5 には 5000 以上の関数が組み込まれています．
例えば，n 番目の素数を求める関数 ithprime(n) なんていうのも，用意されています．
>

ithprime(303);
1999

数式処理

2

まずは，簡単な計算から始めてみましょう．
>

2*a + 3*a;5a数式の展開を計算するには， expand を使います．
>

expand( (a+b)^5 );a5 + 5 a4 b + 10 a3 b2 + 10 a2 b3 + 5 ab4 + b5

因数分解を行うには， factor を使います．
>

factor( x^4+64 );( 2)()
x − 4 x + 8 x2 + 4 x + 8

その他，微積分や方程式の求解などさまざまな計算が可能です．たとえば int(expr, x) は式
expr を変数 x のもとで積分し，diﬀ(expr, x) は偏微分します． simplify(expr) は式 expr を簡単化した結果を返します．
>

int( x^2*sin(x)^2, x );2x2 (−1/2 cos (x) sin (x) + 1/2 x) − 1/2 x (cos (x)) + 1/4 cos (x) sin (x) + 1/4 x − 1/3 x3>

diff(%, x);

()222 x (−1/2 cos (x) sin (x) + 1/2 x) + x2 1/2 (sin (x)) − 1/2 (cos (x)) + 1/22>

2− 1/4 (cos (x)) + x cos (x) sin (x) − 1/4 (sin (x)) + 1/4 − x2
simplify(%);
2x2 (sin (x))

方程式を解くには，solve を使います．Mathematica では等号には == を用いますが，Maple
では = を使います．
>

solve( x^2 -7*x + 3*a = 0, x );7/2 + 1/2 sqrt (49 − 12 a) , 7/2 − 1/2 sqrt (49 − 12 a)

以下のようにして，連立方程式も solve で解くことができます．

solve( {x^3+y^3=1, x+y=2}, {x,y} );)({y = RootOf 6 Z 2 − 12 Z + 7, label = L1 ,()x = −RootOf 6 Z 2 − 12 Z + 7, label = L1 + 2}
答えが求まっていませんね．Maple では本当に必要となるまで求解を行いません．恐らく計>

算効率を上げるために，遅延評価と呼ばれるテクニックを使っているのだと思います．

求解を行わせるには allvalues を利用します (答の中の i は虚数単位を表しています)．
>allvalues(%);{y = 1 + 1/6 isqrt (6) , x = 1 − 1/6 i sqrt (6)} ,{y = 1 − 1/6 isqrt (6) , x = 1 + 1/6 i sqrt (6)}微分方程式には dsolve を使います．diﬀ(y(x),x,x) は y(x) の二階微分です．また，答の中のC1, C2 は積分定数です．
>

dsolve( diff(y(x),x,x) - k*y(x) = 1, y(x) );y (x) = esqrt(k)x C2 + e−sqrt(k)x C1 − k −1

シグマ計算も簡単に行えます．
>

sum( i^2, i=1..n );32

1/3 (n + 1) − 1/2 (n + 1) + 1/6 n + 1/6
因数分解すると，見慣れた形になります．
>

factor(%);
1/6 n (n + 1) (2 n + 1)

2 次元グラフィックス3

まず簡単なグラフを書かせてみましょう．
>

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

1.0

0.8

0.60.40.2KK3K21KKKK0123x0.2

0.4

0.6

0.8

色は Mathematica より単調ですね．gnuplot みたいです．西洋人好みでしょうか (ˆ ˆ)
なのは，図中の線などを右クリックすることで，スタイルを変更できる点です．

便利

もちろんオプションで変更することもできます．オプションのヘルプは ??plot[options] で表示されます．
また，plot コマンド自体のヘルプは，??plot で表示されます．
>
plot( sin(x^2), x=-Pi..Pi,axes=BOXED, # 軸を消し，枠表示
labels=["x", "sin(x^2)"], # ラベルを指定
labeldirections=[HORIZONTAL, VERTICAL], # ラベルの向きを指定
color=blue, # 曲線の色を指定
thickness=4 # 曲線の太さを指定);
1.00.80.60.4sin(x^2)

0.2

0.0KKKK

0.2

0.4

0.6

0.8

K3K2K10123x実は Maple では，任意の 2 次元図形を表示することが簡単にできます．plottools パッケージを利用します．
>

with(plottools) :>with(plots) :スマイリーマークのグラフィックスデータを定義します．なお，行末はセミコロンではなくコロンを使って，長ったらしいデータが表示されるのを抑制しています．

>>

smiley := ’PLOT’(circle([0,0], 1), # 顔の輪郭
ellipse([ 0.2,0.1], 0.05, 0.1, filled=true, color=black), # 右目
ellipse([-0.2,0.1], 0.05, 0.1, filled=true, color=black), # 左目arc([0,0], 0.7, -0.85*Pi..-0.15*Pi) # 口) :display(smiley, axes=NONE);

並べて描く．
>
display(seq(translate(scale(smiley, i, i), i^2, 0), i=1..5),
scaling=CONSTRAINED, axes=NONE);

3 次元グラフィックス

4

3 次元グラフィックスも 2 次元グラフィックスと同様に簡単にプロットできます．まずは z =sinx y のプロットです．
Mathematica と違って，マウスを使って 3 次元グラフィックスを自由に回転できます．便利ですね．
>

plot3d( sin(x*y), x=-Pi..Pi, y=-Pi..Pi );なんか間延びして見えるので，スケーリング (軸毎の拡大縮小) を禁止し，さらに，numpoints
オプションで計算する点 (デフォールトは 25ˆ2) を増やしてみます．
>
plot3d( sin(x*y), x=-Pi..Pi, y=-Pi..Pi,
numpoints=40^2, # 格子点の数を指定
scaling=CONSTRAINED # スケーリングをしない);

2 次元グラフィックスと同様に任意の図形を簡単に表示できます．
>

with(plottools) :手のあるてるてる坊主 (?) グラフィックスデータを定義します．
>
girl := ’PLOT3D’(sphere([0,0,0], 0.7), # 頭cone([0,0,0], 1, -2), # 体
rotate(cylinder([-1,0,-1], 0.2, 2), 0, Pi/2, 0)) :表示します．
>

display( girl, scaling=CONSTRAINED );# 腕アニメーション

5

アニメーションを表示させましょう．
>

with(plots) :>animate( plot, [sin(n*x), x=0..2*Pi], n=1..6 );n = 1.
1.00.50123456xK0.5

K1.0

図をクリックして，メニューバーに現れる再生ボタンを押せば OK です．
>
animate(plot3d,[sin(n*x)*sin(n*y), x=0..2*Pi, y=0..2*Pi, scaling=CONSTRAINED],n=0..2);

n = 0.

最小 2 乗法

6Maple で最小 2 乗法によりデータを解析する方法を説明します．これが，皆さんの勉強の助けになれば幸いです．

6.1

データの入力

まずデータを下のように入れていきます．新たにデータを入れる場合には，各行の終わりでShift-Return を入力してください．最後まで入れ終ったところで Return を入力します．
>
data := [>[0.05, 0.04],>[0.10, 0.06],>[0.15, 0.10],>[0.20, 0.14],>[0.25, 0.22],>[0.30, 0.26],>[0.35, 0.34],>[0.40, 0.38],>[0.45, 0.46],>[0.50, 0.58],>[0.55, 0.62],>[0.60, 0.74],>[0.65, 0.82],>[0.70, 0.86],>[0.75, 0.94],>[0.80, 1.06],>[0.85, 1.18],>[0.90, 1.22],>[0.95, 1.34],>[1.00, 1.42]>];
data := [[0.05, 0.04], ....., [1.0, 1.42]]

それぞれの行は，x 座標の値と y 座標の値の組を表します．たとえば最初のデータ点の x 座標値
は 0.05 で y 座標値は 0.04 です．

6.2

データのプロット

では，読み込んだデータをプロットしてみます．データのプロットするには，plot 関数を使います．
>

plot(data);
1.4

1.2

1.00.8

0.6

0.4

0.2

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1.0

データが線で結ばれているので style オプションを指定，thickness で点の大きさを指定，scalingでスケーリングを禁止します．
>

plot(data, style=POINT, thickness=3, scaling=CONSTRAINED);
1.4

1.2

1.0

0.8

0.6

0.4

0.2

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1.0

このグラフは後から使うので，変数 graph1 に代入しておきます．
>

graph1 := % :6.3

最小 2 乗法による近似

では，このデータに対して，最小 2 乗法で多項式を当てはめてみましょう．データを最小 2乗法で多項式近似するには，stats パッケージの関数 ﬁt を用いるので，そのパッケージを読み込みます．
>

with(stats) :さらに，リストのリストについて転置を求める Transpose を利用するために listTools パッ
ケージを読み込みます．
>

with(ListTools) :以下で関数名 f を利用するので，安全のために f の定義を消しておきます．
>

unassign(’f’);

2 次多項式で近似するには次のようにします>

fit[leastsquare[[x,y], y=a*x^2+b*x+c]](Transpose(data));y = 0.5974025974 x2 + 0.8822009569 x − 0.03847368421

後から使うために，右辺の式を関数 f として定義します．x を含んだ式 exp を x を引数とする関数とするには，unapply(exp, x) を利用します．
>

f := unapply(rhs(%), x);
f := x 7→ 0.5974025974 x2 + 0.8822009569 x − 0.03847368421

6.4

グラフのプロット

では，近似した関数のグラフを plot で描いて見ましょう．
>

plot(f(x), x=0..1);
1.4

1.2

1.00.8

0.6

0.4

0.2

00.2

0.4

0.6

0.8

1.0x

このグラフも後から使うので，変数 graph2 に代入しておきます．
>

graph2 := % :2 つのグラフ graph1 と graph2 を重ねて表示するには， display を使います．
>

display(graph1, graph2);

1.4

1.2

1.0

0.8

0.6

0.4

0.2

00.2

6.5

0.4

0.6

0.8

1.0

誤差の計算

2 乗誤差を求めるには次のようにします．
>

add( (f(data[i,1]) - data[i,2])^2, i=1..

nops(data) );0.009196049195
ここで add( xi, i=m..n ) は，変数 i を m から n まで変化させた時の xi の総和を求めます．また nops(data) は data の長さ，つまりデータの個数を求めています． data[i,1] は i 番目のデータ
点の x 座標値， data[i,2] は y 座標値を取り出しています．

7

おわりに以上のように，数式処理システム Maple は，多くの機能を持つソフトウェアです．キャンパス

ライセンス維持のためにも，皆さんの活用をぜひともお願いいたします．