最終更新日 … $Date: 2002-07-07 09:39:06+09 $
さて,今回からは Mathematica について学ぶ.
Mathematica とは数式処理ソフトとよばれるソフトウェアの代表的なものである.
その機能は基本的に「入力した数式を,利用者の要求に応じて変形する」というものである.
ただそれだけかと思うかも知れないが,
われわれ人間が数学で何か処理を行う時の作業時間の多くが数式の変形にかかることを考えると,
コンピュータの正確さと高速性を利用できるこの種のソフトウェアのインパクトが理解できよう.
この種のソフトウェアは,
上手に使えば,
これまで紙と鉛筆だけでは得られなかった数学的知見を得ることを可能にするものである.
数学科の学生としては Mathematica などのソフトウェアを使いこなすことは長い目でみてやはり必須の能力となるだろう.
Mathematica
は非常に巨大で複雑なシステムをなすソフトウェアであり,
使いこなすにはなにか適切な参考文献の助けが必要であるだろう.
幸い,Mathematica に関する書籍は数多く出版されているので,
書店で自らに合うものを選択するのも良いだろう.
また,以前学習した「web を用いた図書の検索」を利用して大学の図書を上手に活用するのもよい.
しかし,Mathematica に関する web や書籍はあまりに数多く,どれを選んだら良いのか初学者としては迷うだろう.
そこで,Mathematica に関する web と参考文献を絞りこんで紹介する.
mathematica &
と入力.
書式(R) >> スタイルシート(Y) を選んで,Default 以外に変更するとだいぶ見た目が変わってくる.
好みのものを選ぶと良い.
いつもそのスタイルを使いたいのであれば,オプションで
グローバル設定 >> ファイルの保管場所 >> DefaultStyleDefinition
で変えれば良い.
Mathematica では入力はコマンド列をキーボードで入力後,
Shiftキー と Returnキーを同時押し
というシステムになっている.
これを忘れると Mathematica が全く使えないので注意.
Help は Mathmatica 画面右上の「Help」をクリックするか,Mathematica
上で
"?調べたいもの"
と入力する.
また,オプションや関数の属性まで調べたいという時は
"??調べたいもの"
と ? を重ねればよい.
Options[調べたいもの] でもオプションは調べられるが,??
の方が楽だろう.
調べたいものの文字中に不明な部分があれば * (アスタリスク)で代用できる.
この時は該当しそうなものを Mathematica がリストアップしてくれる.
Mathematica をどれくらい使えるかは,Help を使いこなせるかどうかが鍵になる.
とにかく Help をばりばり使ってみるのが良い.
(注)教育計算機システムでは,Help は英語だが,頑張って読むべし.
以下に簡単な例を示しておく.
In[1]:= ?Si* System` Sign Sin Sinh Signature SingleLetterItalics SinhIntegral SignPadding SingularityDepth SinIntegral Simplify SingularValues SixJSymbol In[2]:= ?N N[expr] gives the numerical value of expr. N[expr, n] attempts to give a result with n-digit precision. More…
Mathematica でつかえる括弧は 3種類(厳密には 4種類)あり,それぞれ役目が違う. 普通にわれわれが手書きするときと違うので,注意が必要.
Mathematica では入力時にこれまでの出力を参照,再利用できる. % で一番新しい出力結果が,%% で一つ前の結果が,%%%%...(k回) で k個前の出力結果が参照される. また,%n もしくは Out[n] で(最初から数えて) n 番目の出力結果を参照できる.
In[1]:= 2^3 Out[1]= 8 In[2]:= 4*3 Out[2]= 12 In[3]:= % + %% Out[3]= 20 In[4]:= Out[1] * % Out[4]= 160
数式処理を基本とする Mathematica であるが,
値を「数値で」扱うこともできる.
それには,N[式, 桁数]
とすればよい.
In[1]:= N[1/7, 100] Out[1]= 0.1428571428571428571428571428571428571428571428571428571428571428571428571428 571428571428571428571429
Mathematica では何かを列挙したものはリストと呼ばれる形式で扱うのが便利である.
数列やベクトルのようなもの,と思えば良いだろう(数学的には全然そうした性質はないが).
リストを作成するには,Table[式, {コピーの数}]
とするのがよい.
詳しくはマニュアルを参照すべきであるが,次の例で大体分かるだろう.
In[2]:= Table[1/n, {n,1,10}] Out[2]= {1, 1/2, 1/3, 1/4, 1/5, 1/6, 1/7, 1/8, 1/9, 1/10}
こうするとリストを「人間に見やすく表示」することができる.
→ 実際に使うには,
リスト // TableForm
という入力方法が間違えにくくて良いだろう.
In[3]:= TableForm[Table[{n,N[1/n]},{n,10}] ] Out[3]//TableForm= 1, 1. 2, 0.5 3, 0.3333333333333333 4, 0.25 5, 0.2 6, 0.16666666666666666 7, 0.14285714285714285 8, 0.125 9, 0.1111111111111111 10, 0.1 In[4]:= Table[{n,N[1/n]},{n,10}] // TableForm Out[4]//TableForm= 1, 1. 2, 0.5 3, 0.3333333333333333 4, 0.25 5, 0.2 6, 0.16666666666666666 7, 0.14285714285714285 8, 0.125 9, 0.1111111111111111 10, 0.1
1, 1/2, 1/3, ... を十分大きな数まで数値出力してみて,
■ 仮説 1/n が割り切れる ⇔ n = 2a5b
を「目で」みてみよ.
これらの記号で式を比較することができる.
=(イコール) 一つで等価性判定にならない(代入になる)ことに注意
===, =!= は各々 ==, != の「厳密バージョン」.
左右の式そのものを厳密に比較することになる.
普段は使わなくてよいだろう.
In[1]:= 3 <= 5 Out[1]= True In[2]:= 3 >= 5 Out[2]= False In[3]:= 3 == 5 ← 3 と 5 は等しいか? という式 Out[3]= False In[4]:= 3 != 5 ← 3 と 5 は違うか? という式 Out[4]= True ← 確かに違うので True と答えが返ってくる. In[5]:= 3 === 3.0 ← 3 と 3.0 は等しい「式」か? Out[5]= False ← 式としては等しくないので False になる. In[6]:= 3 =!= 3.0 ← 3 と 3.0 は違う「式」か? Out[6]= True ← 確かに違うので True と答えが返ってくる.
数式処理を行うと,数式はどんどん複雑な表現になっていくのが普通である.
そこで,式を簡潔にしてわかりやすくしたいというときにこのコマンドを用いる.
仮定は省略できる.
(不)等式の最も単純な形式は「正しいか否か」であるので,(不)等式の正否の判定にも使える.
In[1]:= Simplify[Sqrt[x^2], x<0] Out[1]= -x In[2]:= Simplify[1/a < 1/b, 0 < b < a] Out[2]= True In[3]:= Simplify[1/a < 1/b, b < a] Out[3]= 1/a < 1/b In[4]:= Simplify[3 == 5] Out[4]= False
(注) 仮定の条件が足りないと判定できない ⇔ 条件不足がわかる ことに注意.
Mathematica で関数を定義する方法はいくつかあるが,もっとも簡単な方法がこの方法である.
まずはこの方法に習熟すべし.
左辺の変数名のあとについている _ (アンダースコア) を忘れがちなので注意.
関数や変数の定義を消去するには,Remove[関数名(or 変数名)]
とする.
Clear も Remove に似た働きをするが,
完全に消去しないのでわかりにくい挙動が発生しうる.
In[1]:= f[x_] := Sin[x] In[2]:= f[Pi/2] Out[2]= 1
Mathematica には「パターンマッチング」という概念がある.
これは,「該当するものにマッチして,それを参照できる」というもので,
関数の定義などに必須のものである.
詳しくはともかく,簡単な使用例だけでもマスターしておくべし.
_ : 一つの式,__ :一つ以上並んだ式,___ :ゼロ個以上並んだ式
にそれぞれマッチする.
パターンには「ラベル」をつけられる.簡単な関数の定義で用いた x_ はその例で,
これがもっとも良く使われる使い方だろう.
In[1]:= repeat[{x__,y__,y__,z__}] := {y} In[2]:= repeat[{0,1,1,1,3,5,1}] Out[2]= {1} In[3]:= repeat[{1,2,3,4,5,3,4,5,6}] Out[3]= {3,4,5}
実数の各桁の数字をリストの要素とし,
どこに小数点があったかわかるように,小数点以上の桁数とともに返す.
数が有理数の場合,
循環してない部分を a1, a2, …
無限循環反復部分を b1, b2, …
とすると,{a1, a2, …,{b1, b2, …}}
を返す.
FromDigits は逆の働きをする.
In[1]:= RealDigits[13.582] Out[1]= {{1, 3, 5, 8, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 2} In[2]:= RealDigits[15/7] Out[2]= {{2, {1, 4, 2, 8, 5, 7}}, 1}
[[-1]] とすると最後の要素が出てくる
In[1]:= circular[x_] := RealDigits[x][[1]][[-1]] In[2]:= circular[1/6] Out[2]= {6} In[3]:= circular[1/7] Out[3]= {1, 4, 2, 8, 5, 7} In[4]:= circular[1/8] Out[4]= 5
(注) 割り切れている( ⇔ 循環している部分が無い)場合とそうでない場合の違いに注意
In[1]:= circularNumber[x_] := Length[circular[x]] In[2]:= circularNumber[1/7] Out[2]= 6 In[3]:= Table[{n, circularNumber[1/n]}, {n, 20}] // TableForm Out[3]//TableForm= 1 0 2 0 3 1 4 0 5 0 6 1 7 6 8 0 9 1 10 0 11 2 12 1 13 6 14 6 15 1 16 0 17 16 18 1 19 18 20 0
変数をつくってそこへ数式を代入することができる. この機能を使うことで Mathematica を便利に使えるようになるので, なるべく代入を頻繁に使うように心掛けよう.
In[4]:= a = Table[{n, circularNumber[1/n]}, {n, 200}] Out[4]= …略… In[5]:= ListPlot[a]
上のグラフをじっと見ると,
という事実に気づく.
上の表も一緒に見ながらこれを数学的に仮説にすると,次のように言い換えられる.
■ 仮説 1/n の周期は (n-1) 以下である.
■ 仮説 n が素数ならば (n-1) の約数が 1/n の周期である
(素数でない場合は素因数分解すると… →考えてみよ)
このコマンドで n番目の素数を出力することができる. もちろん,あまり大きな n を入力するのは無理がある(^-^).
In[6]:= Table[{Prime[n], circularNumber[1/Prime[n]]}, {n, 20}] // TableForm Out[6]//TableForm= 2 0 3 1 5 0 7 6 11 2 13 6 17 16 19 18 23 22 29 28 31 15 37 3 41 5 43 21 47 46 53 13 59 58 61 60 67 33 71 35
a ÷ b の余りが出力される.
In[1]:= Table[{Prime[n], circularNumber[1/Prime[n]], Mod[Prime[n] - 1, circularNumber[1/Prime[n]]]}, {n, 20}] // TableForm Out[1]//TableForm= 2 0 Mod[1, 0] 3 1 0 5 0 Mod[4, 0] 7 6 0 11 2 0 13 6 0 17 16 0 19 18 0 23 22 0 29 28 0 31 15 0 37 3 0 41 5 0 43 21 0 47 46 0 53 13 0 59 58 0 61 60 0 67 33 0 71 35 0
上の「余り」のところで示した例は実は,
次の定理を反映している.
■ Fermat の(小)定理
a と p が互いに素で p が素数ならば a(p-1) - 1 は p で割り切れる.
上の例がこの定理をどう反映しているのか解釈してみよ.