第5章 Mathematicaでの数学

ここでは,Mathematicaが扱う数から出発してMathematicaを用いた数学の基本的な扱いを述べる.

1 数の扱い

実数

Mathematicaで扱う数には4つの型,すなわち整数,有理数,実数,複素数がある.これを確認するには関数 Head を用いる.

Head

5math_1.gif

5math_2.gif

複数まとめて確認するには,Mapを用いる.

5math_3.gif

5math_4.gif

FullForm(内部表現)

また,関数 FullForm でMathematicaの内部表現を知ることができる.

5math_5.gif

5math_6.gif

このようにFullFormを用いると,Mathematicaの基本が関数形であることがわかる.

5math_7.gif

5math_8.gif

練習 いろいろな式のFullFormを調べよ.

5math_9.gif

数の精度(Precision)

CやJavaなどのプログラミング言語では,扱える数のビット数が限定される.これとは対照的にMathematicaでは任意の桁数の整数や有理数を扱うことができる.そのことは,精度(precision)をみればいい.Mathematicaではコンピュータに依存する機械精度の演算とMathematica自身のソフトウェアのアルゴリズムで処理する演算とがある.

5math_10.gif

5math_11.gif

実数については,一般にその有効桁数に等しい.

5math_12.gif

5math_13.gif

5math_14.gif

5math_15.gif

これは機械精度である.コンピュータのハードウエアのルーチンで処理できる固定精度の浮動小数点演算である.

5math_16.gif

5math_17.gif

練習 次の結果を確認しなさい.

5math_18.gif

5math_19.gif

5math_20.gif

5math_21.gif

5math_22.gif

5math_23.gif

丸め誤差(Roundoff errors)

厳密値でない実数を機械精度で扱うと,丸めによる誤差が生じる.

5math_24.gif

5math_25.gif

誤差はこんなに大きくなる.

複素数

Mathematicaでは,複素数を整数や実数とは独立に扱うことができる.

5math_26.gif

5math_27.gif

5math_28.gif

それぞれ実数部と虚数部を求める.

5math_29.gif

5math_30.gif

偏角と絶対値を求める.

5math_31.gif

5math_32.gif

練習:次のコマンドを実行しよう.

5math_33.gif

5math_34.gif

5math_35.gif

5math_36.gif

5math_37.gif

5math_38.gif

5math_39.gif

5math_40.gif

5math_41.gif

5math_42.gif

複素数平面

次に,複素数平面上に座標を描く関数を作る.

5math_43.gif

4点を描く.

5math_44.gif

5math_45.gif

5math_46.gif

高次方程式

次にn乗根を単位円周上に描く.

5math_47.gif

5math_48.gif

5math_49.gif

5math_50.gif

5math_51.gif

素数

1より大きな自然数で,自分自身と1以外では割り切れないものを素数という.Mathematicaでの素数の扱いを紹介する.

素数の判定と素因数分解

ある自然数が素数であるかどうかの判定は次のようにする.

5math_52.gif

5math_53.gif

また,素数でないとき素因数分解は次のコマンドで行う.

5math_54.gif

5math_55.gif

10番目の素数は関数 Primeで求められる.

5math_56.gif

5math_57.gif

10番目までの素数をすべて列挙するには次のようにする.

5math_58.gif

5math_59.gif

次でも同じ結果が得られる.

5math_60.gif

5math_61.gif

例題:100までの素数を列挙してみよう.

100までに素数がいくつあるか調べる関数としてPrimePiである.

5math_62.gif

5math_63.gif

それゆえ,25番目まで列挙すればいい.

5math_64.gif

5math_65.gif

次でも同じ結果が得られる.

5math_66.gif

5math_67.gif

素数の分布

素数の分布は昔から数学では興味の対象であった.

5math_68.gif

5math_69.gif

5math_70.gif

上の曲線がどのような既知の関数で近似されるかは非常に難しい問題だったが,数学者ガウスは次のように予想し,後の数学者がその正しいことを証明した.

5math_71.gif

5math_72.gif

5math_73.gif

双子素数

素数のなかで連続する奇数のペアを双子素数と呼ぶ.3と5,5と7である.100までにどのくらいあるか調べてみる.

5math_74.gif

5math_75.gif

5math_76.gif

5math_77.gif

5math_78.gif

5math_79.gif

5math_80.gif

5math_81.gif

例題:1000までの双子素数はいくつあるか.関数を作成して数えてみよう.twin[n_]  
(ちなみに双子素数が無限個存在するかどうかは数学上,未解決の問題である)

5math_82.gif

5math_83.gif

5math_84.gif

メルセンヌ数

メルセンヌ数とは,5math_85.gifの形をした自然数のことをいう.特に素数になる場合メルセンヌ素数といい,最大素数の発見に非常に深い関係をもっている.これに関してはGINPSというプロジェクトがある.

5math_86.gif

5math_87.gif

5math_88.gif

次でも同じ結果が得られる.

5math_89.gif

5math_90.gif

5math_91.gif

5math_92.gif

5math_93.gif

メルセンヌ数の素数判定

5math_94.gif

5math_95.gif

5math_96.gif

5math_97.gif

5math_98.gif

5math_99.gif

5math_100.gif

5math_101.gif

5math_102.gif

5math_103.gif

5math_104.gif

このメルセンヌ素数が無限個存在するかどうかも数学上未解決であるし,今後,巨大素数の有力な数であることは間違いないだろう.現在は世界中でGINPSにより発見の競争が起こっている.

2  式の扱い

因数分解(再録)

5math_105.gif

5math_106.gif

5math_107.gif

式の展開(再録)

5math_108.gif

方程式を解く

5math_109.gif

5math_110.gif

5math_111.gif

5math_112.gif

5math_113.gif

このように近似的に解を求めることもできる.次のように連立方程式も解ける.

5math_114.gif

5math_115.gif

近似的に解を求めるコマンドには,FindRootがある.これは後で説明するNewton法というアルゴリズムを使っている.

5math_116.gif

5math_117.gif

この意味は,x=0を初期値として解を探しにいくことだ.

3 微分・積分

Mathematicaでは,記号形式で極限や微分・積分の計算が実行できる.

極限

5math_118.gif

5math_119.gif

グラフで確認しよう.

5math_120.gif

5math_121.gif

5math_122.gif

左右の極限も計算できる.

5math_123.gif

5math_124.gif

微分積分の基本計算

1変数の微分は,

5math_125.gif

2階の微分は,

5math_126.gif

合成関数の微分は,

5math_127.gif

不定積分や定積分は,

5math_128.gif

5math_129.gif

パレットを用いると,

5math_130.gif

5math_131.gif

複雑な関数の定積分は数値積分で近似値を計算する.

5math_132.gif

5math_133.gif

練習   次の微分・積分の計算を行いなさい.

5math_134.gif

5math_135.gif

5math_136.gif

5math_137.gif

4 微分方程式

微分積分の応用例として微分方程式を眺めてみよう.この考え方は,自然科学だけでなく社会科学(経済,金融)などにも広く応用される.人工衛星,流体,経済予測,気象予報など未来を予測ために重要なものだ.

1階の常微分方程式

次の例は,変化率 x'[t] が自分自身 x[t] に比例するものである.

5math_138.gif

5math_139.gif

このような関数は指数関数になることが分かる.

5math_140.gif

5math_141.gif

5math_142.gif

ロジスティック曲線

前の例に,2乗の項を付け加えた.

5math_143.gif

5math_144.gif

すると,次のような曲線が現れる.これをロジスティック曲線という.最初は,単調に増えていくが,次第に頭打ちになる関数である.

5math_145.gif

5math_146.gif

5math_147.gif

2変数の微分方程式

5math_148.gif

5math_149.gif

5math_150.gif

5math_151.gif

5math_152.gif

平面のベクトル場

上の様子をベクトル場によって表現するためには,パッケ-ジをまず読み込む.

5math_153.gif

5math_154.gif

5math_155.gif

5math_156.gif

5math_157.gif

5math_158.gif

5math_159.gif

5 数値計算

Mathematicaで行えるいくつかの数値計算の方法を紹介する.

関数の反復

関数を反復させて数値計算を行うと便利である.この方法はプログラミング上いろいろあるが,MathematicaではNest,NestListという便利なコマンドがある.

Nest,NestList

5math_160.gif

5math_161.gif

5math_162.gif

5math_163.gif

5math_164.gif

5math_165.gif

関数に固有の名前がない場合は、次のようにする.(pure function)

5math_166.gif

5math_167.gif

二分法

5math_168.gif

5math_169.gif

まず、解が存在する範囲を探す.