2 数式処理
前回は主にMathematicaの基本操作,および四 則演算と初等関数の使い方について解説した.今 回はもう少し複雑な計算について解説するとと もに,いくつかMathemmaticaの内部で行われ ている処理に関して解説する.
2.1 Mathematica内の扱い
これまでに解説した関数,変数,記号,数字な
どはMathematica内部では全て「式」として扱
われている.Head関数を使うと様々な関数,変
数等がMathematica内でどのような「もの」と
して扱われているかが分かる.例えば
Head[E]
Head[2+I]
Head[2.1]
を実行してみよう.すると
In[1]:= Head[E]
Head[2+I]
Head[2.1]
Out[1]:= Symbol Out[2]:= Complex Out[3]:= Real
のようになる.それぞれ,ネピア数eは記号,2+i は複素数,2.1は実数であることを示している.
Symbol, Complex, Realなどに分類される基本 要素を総称して「原子式」という.
Head[a+b]
を実行してみよう.ただし,a, bは数字を入れる のではなく,アルファベットのまま実行する.す
ると,
In[1]:= Head[a+b]
Out[1]:= Plus
となる.実は,足し算も関数の形式で表すこと ができ,a+bは Plus[a,b] とPlus関数を用い て表すこともできる.ただ,足し算や掛け算な どの単純な演算は初回のプリントで解説したよ うに省略された記法の方が入力が簡単であるし,
数学の記法に近いので省略形を使うことをおす すめする.
Mathematicaは,変数を記号として計算する
こともできる.例えば,
Expand[(1+x)^3]
Factor[x^2-1]
を実行すると
In[1]:= Expand[(1+x)^3]
Factor[x^2-1]
Out[1]:= 1+3x+3x2 + x3 Out[2]:= (-1+x)(1+x)
と出力される.
PlusやHead,初回のプリントで解説したAbs やLogなど
h[a] やh[a,b]
などの形をしたものを「通常の式」という.hが 関数の名前で,式h[a]のHeadでもある.a, bは 数値であるとは限らず,関数h 次第では,変数 や他の関数を交えた「表現」が引数として入る.
ドキュメントセンター内の解説でもそうだが,こ のような「表現」のことを総称して「expr」と
expressionを省略して表記することが多い.
2.2 関数
Sineやcosineなどの数学的な意味での関数に限
らず,Mathematicaに評価をさせるには様々な
「関数」を所定の形式で入力して実行する.
例えばDivisors関数を使ってみよう.
Divisors[105]
を実行すると
In[1]:= Divisors[105]
Out[1]:={1,3,5,7,15,21,35,105}
のように105の約数が出力される.
これら関数をいかにして組み合わせるかが
Mathematicaの全てであると言っても過言では
ない.当然,Mathematicaで使える関数全てをプ リントに載せることはできないので,適宜ドキュ メントセンターやインターネットで調べよう.
2.3 List
Listとは読んで字のごとく,値のリストである.
先ほど使ったDivisors関数の評価結果も105の 約数をリスト形式で出力している.見たままの リストとしてだけでなく,Mathematica ではリ ストを用いて集合,ベクトル,行列なども表現 する.
{1,2,3}+{a,b,c} {1,2,3}.{a,b,c} {1,2,3}x
上の例を実行して,ベクトルの演算ができるこ とを確かめてみよう.なお,2つ目のセルに書 いてある「点」はピリオドである.
また,行列はリストの中にリストを組み込ん
で表現する.
a={{1,2},{3,4}}
MatrixForm[a]
上の例を実行すると,変数「a」が右辺の行列に よって定義されて,2行目で関数MatrixFormの 引数としてaを代入して評価する.MatrixForm は「いわゆる行列の形」に視覚上見せるための 関数である.この出力結果から行列を入力する ためには,行ごとにリストの中にリストを入力 すれば良いことが分かる.
課題 2.1. Mathematicaに以下の行列の掛け算 を計算させ,行列の形に表示させよ.
1 2 0
3 −1 2 0 5 −3
2 1 7
11 −4 13 0 3 25
リストを「集合の外延的記法」とみなして和 集合や共通部分を求めることもできる.
Intersection[{1,2,3},{3,4,5},{1,3}]
あるいは整理して
a={1,2,3}
b={3,4,5} c={1,3}
Intersection[a,b,c]
などを実行すれば共通部分を出力する.
関数によってはリストを引数として使えるも のもある.例えば
Sin[{0,(1/2)Pi, Pi}]
を実行すると,リストの各要素をSineに代入し
て得られた値がリスト形式で出力される.ある 関数がリストを引数として使えるかを確認する には
Attributes[関数名]
を実行し,出力されたリストの中にListableが あればリストを引数にできる.
その他Listと関連のある関数:
Length, Part, Take
2.4 Range, Map, Nest, Fold
リストの応用および作成法として4つの関数を 解説する.
Range
Rangeは引数をいくつ入れるかで意味が変わる.
課題 2.2. 以下の例を実行してRangeが引数の 数に応じて何をする関数か推測せよ.
Range[7]
Range[3,11]
Range[2,51,3]
Map Map は
Map[ f, {a,b,c}] の形式で入力し,
{ f[a], f[b], f[c]}
というリストを出力する.f は適当な関数であ る.例えば,Map[ Sin,{0, Pi, (3/2)Pi}]を実行
すると
In[1]:= Map[Sin,{0,Pi,(3/2)Pi}] Out[1]:={0,0,-1}
のように,入力したリストの左から順にSin へ 代入した値がリストとして出力された.
Nest
Nestは計算結果を関数に逐次的に代入して反復 計算をする関数である.
Nest[f,x,n]
の形式で入力し,実行すると x を f に代入し,
その結果をまたf に代入する,という操作を n 回繰り返し,最後に得られる値を出力する.例 えば,
Nest[Sin,1,3]
は
Sin[Sin[Sin[1]]]
と同じことである.また,NestでなくNestList にすると最後の値だけでなく,各繰り返しのス テップで得られた値をリスト形式で出力する.
Fold
Fold は「引数を2つとる関数 f」 ,「初期値 x」
,「適当なリスト」の計3つの引数をとる関数で ある.
Fold[ f, x,リスト]
の形式で入力する.入力したリストを{a,b,c}と おいたとき,
Fold[f,x,{a,b,c}] は
f[f[f[x,a],b],c]
と同じである.もちろん,リストの長さが3であ る必要はない.Nest の2変数バージョンのよう なものである.これも,FoldList にすると各ス テップでの結果も含めたリスト形式で出力する.
課題 2.3. Mathematicaで以下の値を計算せよ.
∑20 n=1
1 n2
ただし,和は Sum という関数を使えば簡単に 計算できるが,この課題においてはこれを使わ ずに,ここまでに解説した関数を組み合わせて 計算させよ.(ヒント:足し算も通常の式(h[a,b]
という形式)として表せたことを思い出そう).
2.5 微積分,極限
計算機を使った計算においては,一般的に「無 限」や「極限」といった概念が絡む計算は取り 扱いが非常に難しい.それは,最終的に計算結 果を出力するためにはどこかで計算を終了しな くてはならず,そうするためには計算を有限回 しかできないからである.当然,有限回で計算 を止めれば得られる値は基本的に「近似値」と なる.
しかし,Mathematicaは,これら抽象的概念
をある程度は厳密に扱うことができる.その例 として微分,積分,極限の計算を挙げる.
微分
Mathematicaでは多変数関数の偏微分を扱える
が,状況を簡略化するためにここでは,1変数 関数の微分のみ扱う.
D[Sin[x],x]
を実行すると
In[1]:= D[Sin[x],x]
Out[1]:= Cos[x]
のように微分が計算できる.上の例から関数D の一般的な入力形式は明らかであろう.なお,n 階の導関数を計算するためには
D[f(x),{x,n}]
とすればよい.
積分
積分を計算するにはIntegrate関数を使う.
Integrate[x^2,x]
を実行すると
In[1]:= Integrate[x^2,x]
Out[1]:= x33
となる.当然,これは不定積分なので任意定数 差は無視されている.区間[a, b]上での定積分を 計算するためには
Integrate[f(x),{x,a,b}] の形式で入力する.
極限
極限を計算させるためにはLimit 関数を使う.
Limit[x^2, x->0]
Limit[(1+(x/n))^n, n->Infinity]
を実行すると
In[1]:= Limit[x^2, x->0]
Limit[(1+(x/n))^n, n->Infinity]
Out[1]:= 0 Out[2]:= ex
と出力される.特に,変数が無限に発散すると きの極限も扱える.
2.6 関数の定義
数学においては sine, cosine などの初等関数と は別に頻出する関数を独自に定義し,その関数 に特定の記号を割り当てたいことがしばしばあ
る.Mathematica にもそのような機能が備わっ
ている.例えば関数f(x)を f(x) =x3+ 3 と定義したいときは
f[x_] = x^3 + 3
と入力し,実行すれば以後は関数 f が上で定義 され,予めMathematicaに用意されている関数 と同様に扱える.例えば
f[x_] = x^3 + 3 f[3]
を実行すると
In[1]:= f[x_] = x^3 + 3 f[3]
Out[1]:= 3 + x3
30
となる.
課題 2.4. x2+ 3x−1に1から30の自然数を代 入して得られる値をリスト形式で出力せよ.