View
8
Download
0
Category
Preview:
Citation preview
Mathematica基礎操作法
1998年 7月 初版, 2001年 3月 改訂
概 要
Mathematica は用途が広い数学処理システムである。初等的な線形代数と微積分を少し勉強した読者を想定し、いくつかの簡単な実例によってその利用法の一端を説明する。プログラミングが必要なほど大きな問題ではなく日常的な小さな問題を解決するために、電卓をちょっと使うような調子でMathematicaを使うシーンを念頭に置いている。
目 次
1 Mathematicaの紹介 2
2 Mathematica の起動 3
3 基本操作 4
4 いろいろな式 7
5 式の変形 8
6 関数グラフの描きかた 10
7 2変数の関数のグラフ 13
8 ノートブック 17
9 方程式の解き方 18
10 行列 20
11 行列・方程式・グラフの例 21
12 微積分 23
1
13 練習 23
13.1 数値の計算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2413.2 近似式とグラフ . . . . . . . . . . . . . . . . . . . . . . . . . . 2413.3 ベクトルの描画 . . . . . . . . . . . . . . . . . . . . . . . . . . 24
図 目 次
1 オンラインマニュアルでの検索 . . . . . . . . . . . . . . . . . 72 sinx のグラフ . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 近似式のグラフ . . . . . . . . . . . . . . . . . . . . . . . . . . 124 x2 − y2 のグラフ . . . . . . . . . . . . . . . . . . . . . . . . . 135 電場中の金属球がある場所の電位分布 . . . . . . . . . . . . . . 156 電場中の金属球がある場所の電位分布 (等高線) . . . . . . . . . 167 2つの点電荷のまわりの電位勾配 . . . . . . . . . . . . . . . . 168 行列の固有値の変化 . . . . . . . . . . . . . . . . . . . . . . . 22
1 Mathematicaの紹介
Mathematica1は古くからある Reduce と同様の数式処理言語のシステムであるが、グラフィックス機能が強化され文書作成の機能が追加されている。
グラフィックス機能ではグラフや図形のさまざまな操作を行うことができる。
文集作成の機能としては、普通のワープロとしての機能の他、 TEX文書やHTML文書を出力する機能が含まれている。当然、図や数式が入った文書を作ることができる。日本語の文書を作ることができるバージョンもある。数
学の機能としては、代数計算や微積分のような初等的な分野だけではなく沢
山の特殊分野の問題を解く機能が詳細なオンラインマニュアルと一緒にあら
かじめ付いて来る。
同様のシステムとしては Maple2 が有名である。Mathematica では同じ内容でもいくつもの表現方法で記述することができるので、目的に応じて効率
の良い記述法を選んで使うことができる。Maple は通常の手続き型プログラミング言語の構文を用いているので理解がしやすい。式の入出力方法、計算
エンジンの性能、ライブラリーの機能などは常に改良が行われていて、どち
らのシステムが良いとは言えない。 他に MuPAD3 というシステムもある。
ライセンスの形態はいろいろあるらしいが、学生などが無料で利用すること
ができるバージョンもある。 MuPAD の文法は Maple と良く似ている。
1Mathematica の製造元のホームページは http://mathsource.wri.com2Maple の製造元のホームページは http://www.cybermath.com3MuPAD の開発グループのホームページは http://www.mupad.de
2
以下では、初めてMathematicaを利用するためのガイドとして簡単な使用例を示す。詳細な説明はオンラインマニュアルや印刷されたマニュアルに載っ
ているので、必要に応じてそれらを見てほしい。オンラインマニュアルは内
容も構成も本のマニュアルと同じものを含んでいるほか、検索機能やWWWブラウザーのようなハイパーリンクを使って必要な項目を簡単に探し出すこ
とができるようになっている。たくさん入っている実例をまねて試してみる
だけでも役に立つ。ただし、オンラインマニュアルはおそらく英語のものし
か無い。
読者としては初等的な線形代数と微積分を少し勉強した人を想定している。
2 Mathematica の起動
Mathematica が動作するコンピューターの種類には Apple Macintosh やSun Solaris、 Linux、Microsoft Windows、Windows NT などがあるが、いずれにおいても Mathematica はウィンドウシステムで動作し、起動すると専用のウィンドウが開く。入力と結果の表示はその中で行われ、コンピュー
ターの種類によらず操作法はほとんど同じである。ただし、起動の仕方はい
ろいろであり、同じオペレーティングシステムでも使用しているコンピュー
ター毎の設定によって異なっているかもしれないので、そのコンピューター
を管理している人に尋ねる必要があるかもしれない。
UNIX 系システムでは、コンピューターの操作はコンソール画面かX端末で行うようになっているが、Mathematicaでグラフィックスを使うために、X端末を使うようにしてほしい。Mathematica の起動はコマンド入力によって行える設定になっていることが多いだろう。この場合は作業ディレクトリー
に移ってから Mathematica を起動するのがよい。 たとえば、端末ウィンドウで
mkdir mathmath
cd mathmath
pwd
のように入力すると、mathmath という名前のディレクトリーを新しく作ってそこに移動し、さらに移動できたことが確認できる。さらに、
mathematica &
と打つことによって Mathematica が起動するだろう。 これらのコマンドはすべて小文字である。アンパサンド & は端末ウィンドウで動作しているシェルと新しいウィンドウで動作する Mathematicaが同時並行して独立に動くようにするものである。 これを付けると Mathematica の動作中でも端末ウィンドウを使って他の作業ができる。その際、Mathematica と端末ウィンドウのカレントディレクトリーは一致しているので何かと便利である。
3
Mathematica の起動を GUI (Graphical User Interface) でしか行えない設定にしてあるシステムもあるだろう。この場合は、画面上に表示されている
ボタンとか、ポップアップメニューなどから起動する。 Microsoft Windowsと Macintosh では普通、こういう設定になっている。その場合は、作業ディレクトリーへの移動をMathematica 内でファイルのアクセスを行うときに行う必要がある。ディレクトリーの作成はファイルの整理について意識して行
うようにしなければならない。
3 基本操作
では Mathematicaを起動してまず簡単な計算からはじめよう。Mathemat-ica のウィンドウ(ノートブックと称する)が開いたら次のように入力してみよう。 キーボードから
1+2/3
と打ち込んで最後に Shift キーを押しながら Return (または Enter...以下同様) キーを打つ。Returnキーを押す前なら、 間違えても Backspace キーや矢印キーを使って直すことができる。最初の計算の前にシステムはいろいろ
な準備を行うので結果が出るまで多少時間がかかる。表示された結果が妥当
であることを確かめたら、同じ様な式を入力して今度は Shift キーを押さないで Return を単独で打ってみる。同様にして幾つかの式を単独の Returnキーで入力してから最後の式は Shift と Return で終わる。これで Return を単独で使ったときと Shift と併用したときの違いがわかったはずである。ところで、割り算の結果が小数ではなく分数で表示されることに気付いた
だろうか?数値計算用の言語や電卓のようなものなら分数ではなく小数が使
われるが、Mathematica のような数式処理用のシステムではデータを正確に扱うためにいろいろな表現法が組み込まれている。Mathematica では小数点付きの数値はどんなものでも正確ではない近似値として扱われる。それに対
して、整数や分数は正確な数である。 また、後で出て来るが円周率 π のよ
うな無理数は記号で表現される。
入力した式や結果の表示の左側に(たぶん)青色の In[1]:= とか Out[2]=
というような表示が勝手に付けられることに注目してほしい。これらを新し
い式の中で使うこともできる。括弧の種類と大文字・小文字の区別に注意し
て、たとえば、
Out[1]+1/3
と入力してみよう(以後は一々書かないが、Shift を押しながら Return を押すこと)。 Out[1] は %1 と書いてもよいことになっているので、
%1+1/3
4
と書いても同じである。 Out[2] や Out[3] などでも同様である。 さらに、
% は直前に行った計算の結果、 %% は2つ前の結果を意味するので、たとえば
250*6
200*12
%%+%
のように順に入力すると 250 ∗ 6 + 200 ∗ 12 の結果が得られる。 なお、前のほうの式が見えなくなったらスクロールバーの中のつまみをドラッグして見
えるようにすることができる。
少しだけ違う式を入力する場合、前に入力した式またはその一部をコピー
して再利用することができる。コピーのやりかたは X端末とWindows、mac-intosh、Nextで異なるが、それぞれの環境での一般的なやり方に従えばよい。コピーした後は必要に応じて手直ししてから ShiftキーとReturnキーで計算を実行させる。
In[..] や Out[..] 以外に、自分で勝手に式に名前を付けることもできる。
a:=2/3+1
と入力( := は、:(コロン)と =(イコール)をくっつける。)した後、
?a
と入力してほしい。 また、
a
とだけ入力してみよ。 := の左側に名前、右側に定義内容を置くとその名前
で定義内容を代用させることができるようになる。 次に
b=3/7+1
と入力(こんどは = だけ)してから、 b について上と同様にやってみよ。 :=
と = の違いがわかっただろうか?:= は右辺の式を計算しないでそのまま左
辺にある名前に結び付けるが、= は右辺の式を計算してその結果を左辺にあ
る名前に結び付ける。
c という名前をまだ使っていないなら
b+c
と入力してみよう。 ( c をもう使っていたのなら何か他のにする。 ) 結果の中には c は未知数としてそのまま現れるが b の値は既知なので数値として現れる。ここでも数式処理システムの特徴が現れている。
名前は何文字で作ってもよいが、たとえば 2nd のように数字から始めると
2×ndと解釈され掛け算になるので注意が必要である。the2ndとか number1
のように英字から始めると一つの名前と認識される。 また、the cow と書
5
くと the と cow の掛け算とみなされてしまうので、一つの名前にするには
theCow というように間を開けないで書く必要がある。
大文字と小文字は区別されるので、 anapple と anApple は別の名前とみ
なされる。なお、Sin とか Log のように先頭の文字が大文字の名前はシステ
ムで既に使われている危険があることに注意してほしい。たとえば、
?Num*
と入力すると Num で始まる既存の名前のリストが表示されるし
?*ber*
とすると先頭に限らず ber を含む既存の名前のリストが表示されるから、新
しい名前を作るときはこの方法でチェックするのがよいだろう。
さて、次に
5/3+0.0
と入力してみよ。
5/3//N
でも同じになる。これらは「近似値」を計算しているのである。小数点付き
数値を使うと式全体が近似値になる。0.0 のように小数点以下がゼロでもそうなる。//N は「後置演算子」で、式を近似値に変換する。 近似値の桁数を
指定するには、たとえば、
N[5/99,30]
とする。 これで 5/99 を 30桁表示してくれる。 この記法は 2変数の関数を呼び出す書き方である。 ただし計算機内部では必ずしも指定した桁数で
記憶されるわけではないので、N[1/3,1] と入力すると 0.3 と表示されるにもかかわらず、次に %*2 と入力すると 0.6 ではなく 0.66667 と表示される。N[1/3,1]*2 などと入力した場合も同様である。指定した桁数は表示にはき
ちんと反映されるが、計算や記憶の精度としては指定した精度よりも高い精
度が適当に選ばれて使われるようになっている。この内部精度は機械にとっ
て都合の良いものが使われ機種によって異なる。したがって、近似値を使っ
た数値計算で特別に高い精度を要するような場合には注意が必要である。
5/3//Nは N[5/3]のもうひとつの書き方であり、前者を postfix形式、後者を full form という。 Prefix 形式といって、N@5/3 と書くこともできる。
N[5/99,30] は 5/99~N~30 とも書ける。これは infix 形式といい、 1+2 なども仲間である。
オンラインマニュアルはプルダウンメニューから呼び出すことができるよ
うになっている。そのメニューの名前はおそらく Help である。 一度プルダウンメニューから探してオンラインマニュアルの構成を調べておくと、いざ
6
というときにすぐ役立つ。語句を入力してそれが書いてあるページを検索し
てくれる機能は便利なので、試しておくと良い。図 1は “Log” に関する記事を探して表示しているところである。
図 1: オンラインマニュアルでの検索
4 いろいろな式
四則演算には、 + (足し算), - (引き算), * (掛け算), / (割り算)を使う。冪乗は ^ を使って、たとえば 23 を
2^3
とあらわす。冪数は負の数でもよいし実数でもよい。掛け算は * を省いても
よいが、2つの数値がくっついて1つの数値になってしまうような場合は間
に空白を入れる。 たとえば、間に空白を入れて
2 5
とやると答えは 10 になるが、空白を入れないで
25
とやると答えは 25 となる。
普通の小括弧を使って 2(2+3) というように部分式をくくることもできる。
1+2/5 や 2/5+1 は 2/5 に 1 を足すという意味であり (1+2)/5 や 2/(5+1)
とは異なる。割り算の演算子は足し算の演算子よりも優先順位が高いからで
ある。 また、2/5 3 は (2/5) 3 であって 2/(5 3) とは異なる。 割り算と
7
掛け算の演算子の優先順位は全く等しく、左から順に計算が行われる規則に
なっているからである。利用者の解釈と機械の解釈とは一致しないかもしれ
ない。 かといって、利用者が細かい規則を一々チェックするのは時間の無駄
であるから、まぎらわしい場合には括弧を積極的に使ってわかりやすく書く
方が良い。 部分式をくくる括弧は何重になっても小括弧だけを使う。
非常に大きな数や非常に小さな数を表すには *^という演算子を使うことが
できる。3*^20は 3×1020 であり、3*^-12は 3×10−12 である。3.0 *^ 20
のようにすると近似値になる。
関数は Sin[3.14] というように、 角括弧で引き数を囲む。Mathematicaに組み込まれている関数の名前は大文字で始まる。組み込まれている初等関
数には Sqrt (平方根)、 Abs (絶対値)、 Log(自然対数)などがある。 Log に
は Log[10,100] というように引き数をコンマで切って2つ指定する形式も
ある。たとえば、Log[10,100] は log10 100 のことである。円周率 π は Pi、 自然対数の底 e は E とあらわす。Sin[Pi] は 0 になる
が、 Sin[3.1415926536] や Sin[Pi//N] は 0 にはならないことを確かめてほしい。 Log[E] と Log[2.71828] も試してみればよい。Pi や E のように、
Mathematicaでは無理数は無理数として扱われる。 基本的なものに関しては、Nを使って無理数の近似値を求めることもできる。このとき、何桁求め
ても近似値であることには変わりない。
5 式の変形
未知数 (変数)の入った式は値を計算することはできないが、いろいろな形に変形することはできる。 x と y を未知数にしよう。 もし、今まで x や yを名前として使っていた場合、未知ではなくなっているかもしれないので、そ
の内容を忘れさせる必要がある。 たとえば、 Clear[x] とすると x が未知になる。 また、Mathematica を一度終了してから改めて起動するとすべての定義が無効になる (Mathematica を終了するには、File メニューの Exit を選ぶ)。いずれにしろ、準備ができたら
x^2 + x y + y^2 - 4 y x
などと入力してみてほしい。これは xと y の多項式である。 x と y の間に
は空白か * が必要である。さもなければ、 xy とか yx という名前の単一
の変数として扱われる。何も指定しなくても同類項は自動的に集められる。
//Simplify を付けると展開や因数分解を行ってなるべく簡単な式になるよ
うに計算してくれる。たとえば、
x^2 + 2x y + y^2 // Simplify
とか
8
Sin[x+y]+Sin[x-y] // Simplify
とか
Sin[x]^2+Cos[x]^2 // Simplify
のようにやってみると良い。 Simplify は式がなるべく簡単になるような変
形を自動的に選ぶ。しかし、Simplify はそれほど賢くないので変形ができ
ない場合もある。たとえば、√
3 + 2√
2 = 1 +√
2 であるのに
Sqrt[3 + 2Sqrt[2]] // Simplify
としても変形をしてくれない。(Sqrtという関数は平方根をとる関数。) Simplifyは多分、多項式と有理式 (分数式)と三角関数しか簡略化しない。他の要素を含むものは FullSimplify で簡略化できるかもしれない。
Sqrt[3 + 2Sqrt[2]] // FullSimplify
とやってみると良い。
目的に応じた変形が必要な場合は、Factor と Expand がよく使われる。
Factor は 因数分解、Expand は 展開である。が、三角関数を含んだ式を加
法定理などを使って変形することは自動的には行われないようになっている。
その必要がある場合には TrigFactor や TrigExpand を使うことができる。
たとえば、
Sin[2x] + Sin[2y] // Factor
としても、 2Cos[x-y]Sin[x+y]とはならないが、Factorを TrigFactorに
変えるとうまくいく。
Factor[Sin[2x]+Sin[2y], Trig->True]
のようにする方法もあるが、これは TrigFactor を使うのと同じである。
次に、
1/(1-x)+O[x]^3
と入力してみよう。O は大文字のアルファベットの O である。3 を いろいろな正の整数に変えて試してみてほしい。数学的には O[x]^n は x の n 次の
オーダーの「無限小」と言って誤差の程度をあらわすものである。 次に、
1/(1-x)+O[x]^3 //Normal
と入力してみよう。今度は誤差の項があらわれず、x=0 の近傍でのテーラー展開を行っていることになっているはずである。O[x]^3 を足す代わりに
Series[1/(1-x),{x,0,2}]
9
としても同じである。これは 1/(1− x)という式の x = 0のまわりでのテーラー展開を x の 2乗の項まで求める。 上と同様 Normal を付けてもよい。
O[x] では x = 0 のまわりでのテーラー展開しか求められないが、Seriesを使うと無限大(Infinity とあらわす)も含んだ任意の点のまわりの漸近
展開が求められる。 無限大での漸近展開を行うには次のように x の逆数の冪を指定する。
Series[1/(1-x),{x,Infinity,2}]//Normal
これらの近似式と元の式をグラフにすれば近似の性質が大雑把にわかる。こ
れについては後で出てくる。
6 関数グラフの描きかた
何かグラフでも描いてみよう。
Plot[Sin[x],{x,-Pi,Pi}]
とやると図 2のように sinxのグラフが表示される。グラフが小さすぎると
思った場合は、表示されたグラフの領域のどこかをマウスでクリックするとグ
ラフの枠が現れるので、そのどれかのかどをドラッグして大きさを調整する。
-3 -2 -1 1 2 3
-1
-0.5
0.5
1
図 2: sin x のグラフ
{x,-Pi,Pi}はご想像のとおり独立変数(横軸)とその範囲を指定するもの
である。今の場合、独立変数は x、範囲は −π から π と指定している。範囲
をいろいろ変えて試してみてほしい。Pi を使わないで整数や小数を使っても
かまわない。独立変数として使う変数名は xでなくても良いが、式の中の独
立変数を範囲指定の中でも指定しなければならない。Sin のかわりに Cos や
Tan で試してみよう。1-x^2 のような多項式や x/(1-x) のような分数式でも
よい。ただし、Tan などは無限大に発散する点があり、そういう点を x の範
囲に含めると、グラフの縦軸のスケールが大きくなり過ぎて、発散している
場所以外の変化がわからなくなるかもしれない。関数値が発散するような範
10
囲がグラフに含まれるかもしれない場合は次のようにオプションというもの
を使うと良い。
Plot[1/x, {x,-2,2}, PlotRange->{-3,3}]
この PlotRange->{-3,3} は縦軸の範囲を指定するオプションである。他の
どんなオプションを付けることができるかを調べるには、
??Plot
と打つか、オンラインマニュアルで Plot の項を探せば良い。
Log[x] (loge x)や Sqrt[x] (√
x) は x が負だと値が虚数になってしまう。
また、(-1)^x ((−1)x) はほとんどの点で虚数である。 グラフを描くときそのような範囲を指定するとどうなるだろうか?複素数から実数を導出する関
数としては、Re、Im、Absなどがある。また、複素数を扱う基本的な関数と
しては Conjugateがある。たとえば、
Plot[{Re[(-1)^x],Im[(-1)^x]},{x,0,5}]
とすると (−1)xの実部と虚部のグラフが表示される。詳しくはオンラインマ
ニュアルで調べてほしい。
さて、式に名前を付けると、それ以後、その名前を式の代わりに使うこと
ができるようになる。式に変数が入っている場合でも変数名を含めてそのま
ま記憶することができる。たとえば、
f:=x^2
と 入力し、
Plot[f,{x,-1,1}]
で放物線を描くことができるかどうか試してほしい。 f:=x^2 は式 x^2 に f
という名前を付ける。名前を式の一部にすることもできる。たとえば
Plot[1-f,{x,-1,1}]
を試してみよ。f が x^2 のことであるので、1-f と書けば 1-x^2 と書いた
のと同じことになる。
graph1=Plot[f,{x,-1,1}] とすればグラフそのものに graph1 という名
前が付く。後で Show[graph1] とすれば同じグラフを何度でも描くことがで
きる。 Show[graph1,PlotRange->{-1,3}] というように、 Show にもオプ
ションを付けることができる。また、 graph2=Plot[f-0.5,{x,-1,2}] と入
力してもう一つのグラフを作ってから Show[graph1,graph2] と入力すると
複合グラフが描ける。 graph1 と graph2 は x の範囲が異なるが、うまく描
けるだろうか?
次のように入力して式 f1 とその近似式 f2、f3 をグラフにしよう。f2 は
x = 0 の近くでの x2 の項までのテーラー展開であり、f3 は x = ∞ の近くでの 1/x2 の項までの漸近展開である。
11
-1 1 2 3 4 5 6
0.2
0.4
0.6
0.8
1
図 3: 近似式のグラフ
f1=1/(x^2+1)
f2=Series[f1,{x,0,2}]//Normal
f3=Series[f1,{x,Infinity,-2}]//Normal
Plot[{f1,f2,f3},{x,-1,6},PlotRange->{0,1},GridLines->Automatic]
1つの Plotに3つの関数よりなるリストを与えている。f2と f3が元の式 f1
をどのように近似しているかを見てほしい。Plotの GridLines->Automatic
というオプションは図 3のようにグラフに格子状の目盛りを付けるものである。xの範囲や PlotRange の範囲を変えれば一部を拡大して表示することがで
きる。たとえば、
Plot[{f1,f2},{x,-0.5,0.5}]
とか、
Plot[{f1,f3},{x,3,10}]
などとしてみよ。
{x,-1,6} や PlotRange->{0,1} のような Plot の引数やオプションが長いと、繰り返して同じ物を入力するのが大変である。楽をするには次のよう
にする。
aaa = Sequence[{x,-1,6},
PlotRange->{0,1}, GridLines->Automatic]
Plot[{f1,f2,f3},Evaluate[aaa]]
Sequence は任意の複数のデータからそれらをコンマで区切って並べたもの
を作る。この並びは関数の引数の並びとして利用することができる。ただし
Plot でこれを使う場合、Plot[{f1,f2,f3},aaa] のように aaa をそのまま
指定しても Plot はそれを受け付けてくれない。上のように Evaluate を介
して Plot に渡す必要がある。rrr={x,-0.5,0.5} のようにすると独立変数
とその範囲を rrr で指定できるようになるが、この場合でも Plot に渡すに
12
は Evaluate[bbb] という形で渡す必要がある。複数の関数のグラフを描く
場合に指定する関数のリストについても同様である。
7 2変数の関数のグラフ
-1
-0.5
0
0.5
1
x
-1
-0.5
0
0.5
1
y
-1-0.5
00.5
1
z
-1
-0.5
0
0.5
1
x
図 4: x2 − y2 のグラフ
2変数の関数のグラフは Plot3Dで描くことができる。たとえば、g:=x^2-y^2と入力した後、
graph3=Plot3D[g,{x,-1,1},{y,-1,1}]
と入力してみよう。今度は x と y の両方の範囲指定が必要である。3つの座標軸にラベルを付けるには AxesLabel というオプションを使う。3色のライ
トである場所から照らしているというモデルによって曲面の各部は面の向き
によって異なる色が付けられていて、LightSources というオプションを使
うとこのライトの色や数や位置を変えることができる。 たとえば
Plot3D[g,{x,-1,1},{y,-1,1},
AxesLabel->{"x","y","z"},
LightSources -> {{{1, 0.5, 0.3}, RGBColor[1,1,1]}}]
のようにやるとよい。これで、図 4のように各軸に x, y, z というラベルが付き、色はモノクロになる。{1, 0.5, 0.3} の部分はライトが置かれている方
向、RGBColor[1,1,1] は光の三原色である赤、緑、青の強さであらわしたラ
イトの光の色である。たくさんある括弧にはそれぞれ役割があるので、お手
本をよく見て注意して入力する必要があるが、構造を理解していなければ利
用できないわけではない。 ためしに、RGBColor で指定している三原色の強
さを変えて色を赤や緑にしてみてほしい。3つの数値は 0から 1までの範囲で指定する。
13
2色のライトで照らすようにするには、LightSources オプションを
LightSources -> {{{1, 0.5, 0.3}, RGBColor[1,0,1]},
{{1, -0.5, 0.3}, RGBColor[0,1,0]}}
のようにする。この場合は紫のライトと緑のライトで左上と右上から照らし
ていることになる。 Mathematica では面の色を光源の方向と面の向きとの相対角度だけで単純に決めているので、影ができたり反射光が生じたりとい
う実体的な効果は表現されない。そのような効果を計算しなければならない
場合はMathematica ではなく 3次元グラフィックス用の他のプログラムが必要である。
2変数のグラフは特に指定しなければ 15 点× 15 点 で計算されるが、
PlotPoints というオプションを使うとこれを変更することができる。たと
えば
Plot3D[g,{x,-1,1},{y,-1,1},PlotPoints->25]
とすると 25点× 25点 で計算するのでもっと細かいグラフになる。x方向を
50 点、y方向を 10 点で計算させるには、 PlotPoints->{50,10} を使う。
電磁気学によると、x方向の一様な電場の中にある金属の玉のまわりの「電
位」はx
√x2 + y2
3 − x
とあらわされる。玉の半径は1でその中心は座標原点にある。これはもちろ
んある単純化を行っているが、本質は変わらない。なお、玉の内部 (つまり原点からの距離が1以下の部分)の電位はいたるところゼロである。 まずこの電位を x と y の関数としてあらわす式を作る。
Clear[x,y]
r = Sqrt[x^2 + y^2]
foutside = x/r^3 - x
finside = 0
f = If[r>1, foutside, finside]
Clearは念のためである。 3つの引数をとる If という関数は第1引数の計
算結果が真か偽かによって第 2引数か第 3引数かのどちらかを選ぶ。f のグラフを前と同様にして描いてみること。xと yの範囲はともに-2から 2で良いだろう。この関数は滑らかに変化しない部分があるのでメッシュの数を多
めにする方が良い。図 5に例を示した。このようなグラフは 3次元物体なので、見る位置によって画面に表示され
る形が異なる。これを制御するには次のように Plot3D に ViewPoint という
オプションを使う。
14
-2
-1
0
1
2
X
-2
-1
0
1
2
Y
-2
-1
0
1
2
V
-2
-1
0
1
2
X
図 5: 電場中の金属球がある場所の電位分布
Plot3D[f,{x,-2,2},{y,-2,2},PlotPoints->35,
ViewPoint->{2.750, -4.000, 0.020}]
指定する3つの数は目(またはカメラ)の座標である。このオプションを自動的
に生成する機能もある。これはプルダウンメニューの Inputの 3D ViewPointSelector のようなところから起動することができ、マウスで目の位置を適当に調節して Past ボタンを押すと ViewPoint オプションがカーソルのあるところに入力される。マウスで操作するとグラフまで自動的に変わるようになっ
ていてほしいと思うかもしれないが、そのような機能はたぶんまだ無い。見
る方向は目の位置から座標原点への向きで、Z軸が上向きになるように表示されるが、これらを変えることもできる。どうすれば良いかについては、オ
ンラインマニュアルの ViewPoint のページなどにある関連項目 (たぶん Seealso: などと書いてある)からたどって情報を見つけることができる。図 6のような等高線を描くには ContourPlot を使う。Plot3D と使い方は
同じである。オプションとしては Contours->30 などとすると等高線の密度
を増やすことができる。また、滑らかな図にするには PlotPoints->50 など
と入れればよい。さらに、等高線を描くのをやめて色の濃淡のみにしたいとき
は ContourLines->False と付ける。関数値が発散する場合には PlotRange
で調整する。
次のように入力すると図 7のようなグラフが得られる。
v=1/Sqrt[(x-1)^2+y^2]-1/Sqrt[(x+1)^2+y^2]
v2=ArcTan[v]
<<Graphics‘PlotField‘
PlotGradientField[v2,{x,-2,2},{y,-2,2}]
15
-2 -1 0 1 2-2
-1
0
1
2
図 6: 電場中の金属球がある場所の電位分布 (等高線)
‘ はバッククォートという記号で、’ (シングルクォート)とは違うので注意すること。v2 は x と y の関数である。グラフの矢印は V2 の変化の様子を表している。矢印の向きは v2 の増加がもっとも大きい向きであり、矢印の長さは変化の大きさを示す。これは「勾配」というものである。
図 7: 2つの点電荷のまわりの電位勾配
Sinや Plotなどは「組み込み機能 (Built-in Functions)」といって、Math-ematica を起動するだけで使うことができる状態になるが、それ以外の追加機能 (Add-ons) もたくさんある。これらは分野ごとにまとめてしまってあり、普通の状態では使うことができない。上の <<Graphics‘PlotField‘ は
16
Graphics‘PlotField‘ という「記憶場所」を開いてその中の関数などが使
用できる状態にする。 これで初めて PlotGradientField が使用可能にな
る。こういう記憶場所のことをコンテキストという。コンテキストは関数や
データを分類してしまっておくメカニズムである。オンラインマニュアルの
Help Browser のようなシステムでは、組み込み機能と追加機能は別々の分類になっているから、自分がほしい機能を探すには両方の分類を探してみる必
要がある。オンラインマニュアルの中を一度じっくりと探検し構成を調べて
おくと有効に利用することができるようになる。
8 ノートブック
Mathematica のウィンドウに表示されるものの全体はノートブック (Note-book)と呼ぶ。ノートブックはセル (cell)という最小の単位が縦につながって構成される。ページの概念は無いので、全体が一つの巻き物になっていると
考えることができる。セルは式やグラフィックスなどを納める鞘である。一
つ一つのセルの右端にはたぶん青い縦線が表示されていてそれがセルの範囲
を示している。この線はセルのブラケット (bracket)と呼ぶ。複数のセルがまとめられてセルのグループになると、さらに右側に縦線が入ってグループの
範囲が示される。これはセルのグループのブラケットである。たとえば、式
を入力して結果を表示させると、ブラケットの表示からわかるように、入力
した式と表示された結果はそれぞれのセルに入るが、これらはさらに一つの
同じグループに入る。グループのグループのようなものもある。
式やグラフ以外に文章の段落や見出しなどを入力してもセルになる。これ
らをグループとしてまとめて節や章を作ることができる。このように、セル
とグループの機構は節や章などで構成される文書を作るのに使われる。
グループのブラケットをマウスでダブルクリックするとそのグループの2
番目より下のセルが非表示になる。もう一度ダブルクリックすると元に戻る。
これはワープロにもよく付いているアウトライン編集の機能である。
印刷や保存はノートブック全体でもできるし、ブラケットをマウスで選択
状態にしておけばセルやグループ単位でもできる。グラフとそれを生成した
式を表題付きで印刷してみてほしい。マウスで式のすぐ上をクリックすると
横線が現れるからこの状態でキーボードから表題を入力するが、計算をする
わけではないので<Shift>+<Enter> は押さない。右のブラケットを選択し
て <Alt>+2とすると字体が変わるが、変わるのは字体だけではなくセルの
グループの構成も変化する。これは、以降が一つの章になったのである。こ
の状態で、印刷したいグループのブラケットを選んでプルダウンメニューの
File の Print か Print Selection で印刷する。ダイアログボックスで、選択範囲だけを印刷することの指定と、使うプリンターの指定を間違いなく行うこ
と。どのプリンターで印刷するかの設定は重要で、これを怠ると印刷結果を
17
入手できないばかりではなく引き取り手のない無駄な紙を生産することにな
る。環境問題が深刻な現在では、このようなことを繰り返すのは犯罪行為で
ある。
現在のノートブック全体の内容を保存しておくと、後で作業を再開するこ
とができる。Windows や Machintosh では一般のアプリケーションの保存法と同じやり方で保存することができる。すなわち、Fileというプルダウンメニューから Save を選び、ダイアログボックスでファイルを入れるディレクトリーとファイル名を指定する。UNIX などでもだいたいこれと同じやり方でできるはず。自分用のディレクトリー(フォルダー)が無い環境ではファイ
ルをフロッピーディスクなどに移しておく必要があることに留意すること。
ファイルのファイル名の付け方はオペレーティングシステムの規則に従う
必要がある。使える文字としては、アルファベットの小文字と数字ならどん
な環境でも大丈夫である。ただし、Windows ではファイル名の最後の部分は“.nb” となるようにする。これはファイルマネージャー(Explorer)がファイルの種類を判別できるようにするためである。Macintosh や Next ではその必要は特に無い。UNIXでは見て区別が付くようにするために .nb を付けるのが良いだろう。
保存したファイルを開いて作業を再開するには、Mathematica から Fileメニューの Load か Open で開くか、Mathematica の起動時のコマンドにファイル名を付ける。環境によってはノートブックのファイルのアイコンか
ら Mathematica を起動することができるかもしれない。その場合は自動的にノートブックが読み込まれた状態になる。
ノートブックの一部を保存するには プルダウンメニューの Edit の Saveselection as を使うと良い。ポップアップメニューにも同じ項目がある。いろいろな形式での保存ができる。よく使うのはグラフの EPS 形式での保存だろう。EPS 形式は本やレポートに入れる図を保存しておくのに適した形式である。
9 方程式の解き方
等式や方程式の等号には = や := ではなく == を使う。これは 2つの式を比較する演算子である。たとえば
1/Sqrt[2]==Sqrt[2]/2
と入力すると True と答えが返ってくる。これは等式の左右を比較して等しいと判断されたのである。(Sqrt[2] は 2 の平方根。1/
√2 =
√2/2 を正しく
計算していることがわかる。) x==1 のように未知数が含まれていて等しいかどうかが不確定な場合は、入力した等式がそのまま返ってくる。1==2 のよう
に誤っていることがはっきりしている場合は False が返る。
18
Solve[3x-2==1,x]
と入力してみよう。 {{x -> 1}} と出てくるが、これで 3x − 2 = 1 という方程式を x について解いたことになる。答えを確かめるには、
3x-2==1 /. x->1
と入力してみればよい。 /. x->1 は前の式の中の x を 1に置き換えて計算せよという置き換えの指示である。/. という記号は「ただし」という程の意
味であり、x->1 は x を一時的に 1 に置き換えることを意味する。一時的であるから x が 1 になってしまうわけではない。3x-2 /. x->1 でも結果を確
かめることができる。
3x-2==1 /. x->0
だとどうなるかもやってみてほしい。{{x -> 1}} の括弧が2重に付いてい
ることについてはこの後で理解できると思うので、今は気にしないでおこう。
次は線形の連立方程式。括弧に注意して
Solve[{x-y==2,x+3y==6}, {x,y}]
と入力してみよう。これは連立方程式
x− y = 2 , x + 3y = 6
を解いていることになる。一組の解{{x -> 3, y -> 1}} が得られたはずで
ある。これを確かめるには、
{x-y==2,x+3y==6} /. {x -> 3, y -> 1}
とか
{x-y,x+3y} /. {x -> 3, y -> 1}
とすればよい。 /. の右側に %... を使ってもよいかも知れないと思った人は
さっそくやってみてほしい。また、もとの方程式に名前を付けておけば Solve
の中などで方程式のかわりにその名前を使えるかもしれない。そう思った人
は実行してみよ。名付け方は eq1={... , ...} という感じである。
次に非線形の連立方程式。
Solve[{x+y==3, x y==2}, {x,y}]
と入力すると
{{x -> 1, y -> 2}, {x -> 2, y -> 1}}
19
と解が出てくる。これは解が2組あって一方が x = 1, y = 2 で他方がx = 2, y = 1 ということである。解における大括弧の役割がこれでわかっただろうか?わかった人は、ついでに Solve[x+1==x, x] と入力して結果を解
釈してほしい。
解析解を求めることが難しい場合でも数値解、つまり近似解を求めること
ができる場合がある。まず、係数が定数の多項式や有理式の場合は NSolve
ですべての解の近似値を求めることができる。たとえば、
NSolve[1-10x-9x^2+x^5==0, x]
とすると3つの実数解と2つの虚数解を得ることができる。
超越関数でも簡単な逆関数がある場合は解を求めることができるが、NSolve
でも Solve でもすべての解が得られるとは限らない。たとえば
Solve[Tan[x]==1/3, x]
と
NSolve[Tan[x]==1/3, x]
を試してみるとよい。NSolve[Tan[x]-2x==0, x] のようなものでは逆関数
が求められないので解を得ることができない。こういう場合はまずグラフを
描いて解の値の見当を付けてから FindRoot を使って解の近似値を一つずつ
求める。 FindRoot を使って、 tanx− 2x = 0 を解いてみよう。まず、
f=Tan[x]-2x
として式に名前を付け、
Plot[f,{x,-3,3}, PlotRange->{-1,1}]
のようにしてグラフを描く。 xの範囲をある程度しぼる必要がある。 tanx
は発散するので PlotRange で縦軸の範囲もしぼる必要がある。このあたり
は試行錯誤になる。0 が解の一つであることは明らかである。一番 0 に近い正の解を求めてみよう。グラフから約 1.2 であることがわかるので、
FindRoot[f==0, {x,1.2}]
と入力する。答えが出ただろうか?同様にして一番 0 に近い負の解を求めてみてほしい。
10 行列
連立方程式は、
{x+y, x y} == {3, 2}
20
のように書いてもよい。 線形の連立方程式では、
{{11,12},{21,22}} . {x,y} == {1,2}
のように書いてもよい。括弧の形と数、コンマとピリオドに注意。この式を
入力してみればどのように解釈されているかがわかる。
Mathematicaではベクトルはリストであらわし行列はリストのリストであらわす。リストなので、普通に表示したのではリストやリストのリストと同じにな
ってしまうが、MatrixForm[{1,2}]とか MatrixForm[{{11,12},{21,22}}]
とするとおなじみの行列形式で表示される。リストの要素と行列の要素の位
置関係がどうなっているかに注意してほしい。
Det[{{1, -1}, {1, 3}}]
とすると行列式が求まる。m を {{1,-1},{-1,2}} のような正方行列とする
と、MatrixPower[m,2] で m の二乗が求まる。これは m.m と書いてもよい。
m m とか m*m では要素ごとの掛け算になってしまうが、m.m なら行列として
の掛け算になる。また、MatrixPower[m,-1] で逆行列が求まるが、1/m や
m^-1 では要素ごとに逆数を計算するだけになる。MatrixExp[m] は行列の指
数関数であるが、Exp[m] では各要素の指数関数を計算するだけである。
行列の指数関数の例として、
MatrixExp[ t {{0, 1}, {-1, 0}} ]//FullSimplify
とやってみよう。すると平面の回転行列が得られるだろう。なぜそうなるか
は自分で調べてほしい。(FullSimplify を付けなければ指数関数を使った複
雑な表示になる。)
11 行列・方程式・グラフの例
もし前に v や e を使っていたら Clear[v,e] として忘れさせるか、Math-ematica を終了後起動しなおしてから次に進んでほしい。まず、
H = {{v,1},{1,0}}
J = {{1,0},{0,1}}
と入力してから
H - e J
を計算してみよ。
MatrixForm[H - e J]
として行列形式で表示させてみるととわかりやすい。次に行列式を計算する。
21
f=Det[H - e J]
と入力する。これで fという名前で行列式が定義された。さらに、Solve[f==0,e]で f==0 を e について解き、解から余分のものを取り去るために、ee=e/.%
としてほしい。これで、ee という名前で解の組を呼び出すことができるようになる。
ここまでは行列 H の「固有値」を求める手続きであるが、実は同じことを行う関数も用意されている。
ee = Eigenvalues[H]
と入力するだけでよい。さらに「固有ベクトル」も
vv=Eigenvectors[H]
で求まる。ee の中の一つの固有値を取り出すには ee[[1]] とか ee[[2]] と
する。Part[ee,1] や Part[ee,2] という書き方もある。vv も同様である。
H.vv[[1]] //Expand
ee[[1]] vv[[1]] //Expand
とすると2つの結果は一致するはずである。 (ピリオド . に注意。) 固有ベクトルにもとの行列を作用させてもベクトルの向きは変わらず大きさだけが固
有値倍になるということが確かめられたわけである。vv[[2]] と ee[[2]] に
ついても同様の計算をしてみればよい。Expand を付けなければ一見異なった式が出てくるし、 Expand を付けても一見異なった式になる場合もある。そのようなときは、たいてい引き算を行えば等しいことが確かめられる。
-10 -5 5 10
-10
-5
5
10
図 8: 行列の固有値の変化
2つの固有値の v による変化をグラフにしてみよう。
g1 = Plot[ee[[1]], {v,-10,10}]
g2 = Plot[ee[[2]], {v,-10,10}]
Show[g1, g2]
22
のようにすればよい。 あるいは、能率を重視するなら
g12 = Plot[Evaluate[ee], {v,-10,10}]
としてもよい。 ee は関数のリストであり Evaluate はどうしても必要であ
る。グラフの範囲はやはり試行錯誤で決める。
g3 = Plot[v, {v,-10,10}, PlotStyle->Dashing[{0.01}]]
もグラフに加えて、e1と e2が vに漸近するのを見てほしい。PlotStyle->...というオプションは線の種類を指定するもので、Dashing[...]で点線にな
る。0.01 は点線の断続の長さをグラフ全体の横幅との比であらわす。{0.01}
を {0.01,0.01,0.03,0.01} に変えると一点鎖線になる。同様にして破線や
二点鎖線なども描ける。
12 微積分
簡単な微積分は次のようにしてできる。数学の知識を確かめよう。
f=x^2+x+1 f = x2 + x + 1f1=D[f,x] x による1回微分 df/dx
f2=D[f,{x,2}] x による2回微分 d2f/dx2
Plot[{f,f1,f2},{x,-1,1}] グラフを描いてみる
g=Integrate[x^-1,x] x−1 の xによる不定積分
Plot[{x^-1,g},{x,-1,10}] グラフを描いてみる。
Integrate[x^2,{x,-1,1}] 定積分∫ 1
−1x2dx
Integrate[1/(x^2+1),{x,-Infinity,Infinity}]
定積分∫∞−∞(x2 + 1)−1dx
NIntegrate[E^(-x^2),{x,-1,1}] 数値計算による定積分
DSolve[y’’[t]==-y[t],y[t],t] 未知関数 y(t)の微分方程式y′′(t) = −y(t)を解く
DSolve[{y’’[t]==-y[t],y[0]==0,y’[0]==1},y[t],t]
初期条件付きの微分方程式
13 練習
Mathematicaをまがりなりにも利用できる知識が身に付いたかどうかをテストしてみよう。
23
13.1 数値の計算
水素原子は陽子とそのまわりを回る電子でできている。クーロンの法則によ
れば、陽子と電子の間に働く電気力は素電荷 e、真空の誘電率 ε0 および軌道半
径 aによってFelec = e2/(4πε0a2)とあらわされる。この公式をMathematica
で入力せよ。素電荷は soden、誘電率は yuden などとすればよい。次に軌道
半径をボーア半径 aB = 5.29 × 10−11m として電気力の大きさを求めよ。素電荷などの値は非常に多くのところで手に入れることができる。たとえば丸
善の理科年表を見るとよい。同様にして、陽子と電子との間に働く万有引力
を求めよ。万有引力の公式? 自分で調べてほしい。
13.2 近似式とグラフ
x が小さいとして、exp(−x2) を x の2次の多項式で近似した式を Series
と Normal を使って求め、元の式と近似式のグラフを描け。x の4次の多項
式で近似したものもいっしょにグラフに描き、(目で見て)比較せよ。X軸の範囲をうまく調整して、違いがわかるようにすること。
次に、x −→ ∞ で √1 + x2 に漸近する x の1次式を Series と Normal
を使って求めよ。また、x−1 の項も含むようにしてみよ。さらに、これらの
式をグラフにして比較せよ。
13.3 ベクトルの描画
<< Graphics‘Arrow‘ とすると Arrow を使ってベクトルを矢印であらわ
すことができるようになる。バッククォート‘に注意。
Show[Graphics[Arrow[{0,0},{1,2}]], Axes->True]
とすれば使い方がわかるだろう。Graphics がなければ Show で表示できな
い。Arrow は「グラフィックス・プリミティブ」という種類のデータを作り、
Graphics はそれを「グラフィックス・オブジェクト」という種類のデータに
変換する。Axes というオプションは座標軸を描くかどうかを指定するものだ
が、縦横のスケールを同じにするために AspectRatio->Automatic という
オプションもよく使う。
このままでは使いにくいので、<< Graphics‘Arrow‘ を既に入力している
ことを確かめてから次のような定義を行ってほしい。定義の左辺(:= の左
側)の括弧の中にアンダースコア を入れることに注意。これで GVector が
関数として使えるようになる。
GVector[vect_] := Graphics[Arrow[{0,0}, vect], Axes->True,
AspectRatio->Automatic]
24
GVector[begin_, vect_] := Graphics[Arrow[begin, begin+vect],
Axes->True, AspectRatio->Automatic]
次のように使う。
Show[GVector[{1,2}], GVector[{2,1}]]
Show[GVector[{1,2}], GVector[{2,1}], GVector[{1,2}+{2,1}]]
Show[GVector[{1,2}], GVector[{1,2},{2,1}],
GVector[{1,2} + {2,1}]]
ベクトル (1,2) と (2,1) およびそれらの足し算に v1、v2、v12 と名前を
付け、今行った表示を名前を使って再現してみよ。ベクトルは { と } を使ったリストとして定義すればよい。
120度 (2π/3ラジアン)の回転を行う変換行列を作って M という名前を付
けよ。MatrixForm で M を表示してうまく定義されたかどうか確かめる。回
転変換の行列の形は回転角を θ とすると、(
cos θ − sin θ
sin θ cos θ
)
となる。M を v1 などに作用させて得られるベクトルを計算して適当に名前
を付け、これらを前と同様に表示せよ。行列をベクトルに作用させるには .
(ピリオド)を使う。2つのベクトルに同じ行列を作用させてから加えるのと、加えてからその
行列を作用させるのとは同じ結果になるはずである。図を描いてこれを確か
めよ。
25
Recommended