Dohi's Webpage - mathematicadohi/d2-2013-prog1/...2...

Post on 30-Jun-2020

0 views 0 download

Transcript of Dohi's Webpage - mathematicadohi/d2-2013-prog1/...2...

1

Mathematica

1 Mathematica のもつ意味

Mathematica は Wolfram Research 社(米国)が1988年6月に発売した数学とそ

の応用のためのソフトウェアで,現在各国で非常に多くの研究者・エンジニア・学生に

よって使われています.はじめマッキントッシュ・コンピュータ版が出されましたが,そ

の後さまざまなコンピュータ・システムで利用可能になっています.現在 Version 8.0

でさらに進化を続け,より充実した機能と使いやすさを追及しています.

数学処理のためのコンピュータ・ソフトウェアは他にも色々ありますが,その中での

Mathematica の特色は操作が簡単であることと広い範囲の機能を備えていることで

す.操作が簡単であるということはマッキントッシュ・コンピュータ(アップル社)の基本

思想でもあり,従来はある程度の「専門家」を対象にしていたコンピュータを何の予備

知識もない初心者でも容易に操作できるようにした,ということです.機能の充実に関

していえば,たとえば工科系の大学で4年間に学ぶ基礎および応用の数学のすべて

を簡単なコマンドで処理できます.

コンピュータ・ハードウェアは急速に機能を進化させつつ価格を底廉化しています.

このような状況での数学処理ソフトウェアの発展の意味するところは次のように述べ

ることができます.

ニュートンが微分積分学を創始して(古典)物理学を体系づけたのが近代科学技術

の出発点で,その後の300年間の著しい科学技術の発展はすべて微分積分学に依

存してきた,と言うことができます.数学とくに応用数学の観点からこの300年を眺め

ると,「変化を伴う現象は微分方程式で記述され,その微分方程式の解を求める方法

を模索しつづけてきた」と言えます.何故かというと,具体的に関数を与えたときその

微分を具体的に計算するのは比較的簡単です.それに対して,具体的な関数の積分

を求める,もっと一般的にいえば具体的に与えられた微分方程式の解を既知の関数

で表現する,ということは極めて難しいことです.正確に言えば「極めて難しい」という

より「一般的には不可能」ということであって,種々ある微分方程式のうち解法の知ら

れているものだけを解くことができる,ということです.極論すれば,この「解法」を

色々工夫しながら蓄積してきたのが数学とくに応用数学のこの間の歴史であった訳

です.

一方では,学生諸君が中学・高校の物理や化学の学習を通して体験しているよう

に,実用上必要なのはユークリッド的厳密解ではなく常に近似解です.これが応用数

学上におけるコンピュータの存在理由を与えます.方程式でも微分方程式でも,解法

の知られていないタイプの方程式の解を求めることはコンピュータでもできません.し

2

かし,近似解なら解法が知られているかいないかに無関係に求めることができ,実用

上はそれで十分だからです.

とくに Mathematica はこれを極めて簡単に行います.後述のように,Solve[ ] ま

たは DSolve[ ] の [ ] の中に,方程式または微分方程式(常微分方程式)と何

を未知数または未知関数とするかを代入してタイプし shift + enter を押すだけ

で,解法の知られているタイプのものの大半は即座に厳密解を返してよこします.解

法の知られていないタイプのもの,あるいは解法が知られていても解法に合うように

変 形 す る の が 煩 雑 な も の に 対 し て は , NSolve[ ] , FindRoot[ ] ま た は

NDSolve[ ] を用いれば近似解を返してくれます.

Mathematica のもうひとつの特色は,グラフィックスを容易に描くことができることで

す. Plot[ ] または Plot3D[ ] の [ ] の中に曲線または曲面の方程式と変数

の範囲を代入してタイプし, shift + enter を押すとグラフが描かれます.このよう

に,操作が容易であることとグラフィックスが容易に描かれることが,コンピュータを通

して「数学の視覚化(可視化)」や「実験数学」を可能にしている,と言うこともできま

す.

Mathematica の類のソフトウエアは今後さらに発展・普及するものと思われます.

幸い東京電機大学では Wolfram Research 社とサイトライセンス契約を結んでいるの

で,学内では誰でも自由に Mathematica を使うことができます.Version 6.0 の特徴

は,入力や出力における数式の表記方法がふつう教科書に印刷されたりノートに書

いたりするものに近くなっていて全体に見やすくなっていることと,計算能力がさらに

進化していることです.

この章では Mathematica のほんの導入部のみを紹介します.参考文献として

● 田澤義彦著「Mathematica による工科の数学」東京電機大学出版局

を挙げておきますが,この他にも多様な解説書が出版されていますから,さらに詳しく

知りたい諸君はそれらを参照して下さい.Mathematica を通して,学生諸君が楽しみ

ながら数学を理解することを希望しています.

3

2 Mathematica の基本操作

Mathematica を起動し,操作し,終了するには次のように行います.

( 1 ) [ ス タ ー ト ] [ す べ て の プ ロ グ ラ ム ] [ Wolfram Mathematica ] [ Wolfram

Mathematica 8]の順にクリックします.

4

(2)[ノートブック]をクリックします.

(3)キーボードからたとえば 3 + 8 と入力し, shift + enter を押すとコマンドが

実行され,計算結果の 11 が表示されます.

(4) Mathematica を終了したいときには,[ファイル][終了]の順にクリックします.

ダイアログボックスが現れるので,計算結果を保存しないときには[保存しない]をクリ

ックします.

(5) 入力した式を保存したいときには,[ファイル][別名で保存]の順にクリックし,

つづいて現れるダイアログボックスで,保存するドライブの選択,ファイル名の入力を

5

行い,最後に[保存]をクリックします.

6

3 計算

3.1 数の計算

四則演算は普通の電卓と同じように入力し,= の代わりに shift + enter を押

します.乗法では×の代わりに * またはスペースキーを入力します.除法では÷の

代わりに / を入力します.計算結果が分数の場合,N[ ] を用いると小数で表示さ

れます.無限小数などの場合は有効数字6桁の近似値が表示されますが,たとえば

N[ ,30] のようにと入力すると,30桁まで表示されます.

5 6

7/4

N[100/3]

N[100/3,30]

指数(累乗)は ^ で,根号(ルート,2乗根,square root)は Sqrt[ ] で表記され

ます. 入力のしかたが間違っていると, Mathematica は警告音とともに赤い文字でエ

ラーを表示します.

7

3^5

N[Sqrt[[5]]

N[Sqrt[5]]

円周率 π は Pi で,自然対数の底 e は E で,虚数単位 i は I で表記されま

す.

N[Pi,200]

(1+3 I) (2-I)

8

FactorInteger[ ] を用いると,自然数を素因数分解できます.下の例の出力

は通常の表記法では 23 ・ 3 ・ 52 ・ 23 と書かれます.Sum[ a k , {k ,m,n}]は,和の記

号 Σ のように,数列 { ak } の k=m から k=n までの項の和を計算します.

FactorInteger[13800]

Sum[2^k, {k ,0,5}]

3.2 数の計算

多項式の計算において,Expand[ ] は展開(括弧をはずす)を,Factor[ ]

は因数分解を,Simplify[ ] は昇べきの順の(次数の小さい方からの)整頓を行

います.また,% は直前の出力結果を表します.有理式においては,Simplify[ ]

は通分の結果を計算します.

Expand[(2a+b-c)^3]

Factor[2 x^2+5 x y+2 y^2+5 x+y-3]

Simpl ify[ 2 x^2+5 x y+2 y^2+5 x+y-3 ]

9

Mathematica では三角関数 sin x, cos x, tan x, 指数関数 xe , 対数関数 log x

はそれぞれ Sin[x],Cos[x],Tan[x] ,Exp[x],Log[x] と表記されます.

Tan[Pi/3]

Simpl ify[Cos[x] Cos[3y]-Sin[x]Sin[3y]]

Exp[2]^3

N[Log[2]+Log[E]]

10

3.3 ベクトルの計算

ベクトルの線形演算(ベクトルの和,スカラー倍)・内積・外積の計算をします.線形

演算は文字式の加法・乗法のように入力します.内積は . (ピリオド)を用います.

v1={2,-1,3}

v2={5,0,-2}

a v1 + b v2

v1.v2

3.4 行列の計算

行列の線形演算(行列の和,スカラー倍)・積・行列式・逆行列・固有値・固有ベクト

ルの計算を行います.Mathematica では行列は,下の例の第1行の右辺の形で表記

されますが,MatrixForm[ ] のコマンドを用いると通常の形に直すことができます

(行列を囲む括弧は表示されませんが).線形演算はベクトルの場合と同様,文字式

の加法・乗法のように入力します.下の例で行列 m1, m2 を定めていますが, = で

はなく : =を用いているので, shift + enter をおしても画面には m1, m2 の形は

出力されません.行列の積は .(ピリオド)で,行列式は Det[ ] で,逆行列は

Inverse[ ] で計算されます.また,ここでは例はあげませんが固有値は

Eigenvalues[ ] で,固有ベクトルは Eigenvectors[ ] でそれぞれ計算され

11

ます.

m1:={ {2,-3,1} , {-1,2,-4} , {3,1,2} }

m2:={ {-2,1,3} , {3 ,-1,2} , {1,4,0} }

MatrixForm[m1]

MatrixForm[m2]

5 m1 -3 m2

Matr ixForm[%]

Matr ixForm[m1.m2]

m3:={ {1,2,3} , {2 ,3,4} , {3 ,2,2} }

Det[m3]

12

m4:=Inverse[m3]

MatrixForm[m4]

Matr ixForm[m3.m4]

3.5 微分積分の計算

Mathematica は極限,微分,不定積分,定積分,偏微分,重積分の計算を行うこと

ができます.数列および関数の極限は Limit[ , -> ] を用いて計算します.

Limit[ (1+1/n)^n, n->Inf inity ]

Limit[ Sin[x]/x,x->0 ]

13

微分は D[ ,x ] を用いて計算します.n 次導関数は D[ ,{x,n}] で求められます.

D[x^2 Sin[x],x ]

D[x^2 Sin[x], x,x ]

不定積分は Integrate[ ,x] を,定積分は Integrate[ ,{x, , }] を用いて計算します.

NIntegrate[ ,{x, , }] を用いれば,定積分の近似値が求められます.

Integrate[ 3 x^2+5 x-1,x ]

Integrate[ Sin[x], {x ,0,Pi}]

Integrate[Log[x], {x ,1,2}]

NIntegrate[ Log[x], {x ,1 ,2} ]

14

偏微分も D[ , ] で計算できます.ここでは例はあげませんが,重積分は累次積

分に直して入力します.

D[ x^2 Sin[2y],x]

D[ x^2 Sin[2y],y]

D[ x^2 Sin[2y] ,x,x]

D[ x^2 Sin[2y] ,x,y]

4 方程式

4.1 方程式

Solve[f[x]==0,x] の形で入力することにより,x を未知数とする方程式 f (x) = 0

を解くことができます.等号を2つ続ける点に注意して下さい. f (x) が4次までの多

項式の場合は係数に文字が入っていても Mathematica は解を出します.ガロア理

論により,5次以上の方程式は四則演算と開平では解けないことが知られていますが,

その場合には NSolve[f[x]==0,x] の形で入力すると Mathematica は近似解を出

します.また,無理方程式,分数方程式も解くことができます.

Solve[a x^2+b x+c==0,x]

15

NSolve[x^5+2 x^4+3 x^3-x^2+2 x-5==0,x]

Solve[Sqrt[x-1]==x-3,x]

逆三角関数・指数関数・対数関数などの超越関数を含んでいる方程式も,簡単な

形のものはそのまま解けます.

Solve[ArcSin[x+5]==Pi/6,x]

しかし,たとえば log (x+2) - log x = 3 のような場合には,Solve や NSolve では

うまくいかず,FindRoot を用いるか,または Solve[Log[(x+2)/x]==3,x] のよう

に変形して入力するなどの工夫が必要です.三角関数を含む場合は FindRoot を

用います.FindRoot[f[x]==0,{x,a}] の形で入力すると x = a の近くでの f (x) = 0

の解を求めることができます.

FindRoot[Sin[x+2]+Cos[2x]==Pi/6, {x ,0}]

16

4.2 連立方程式

x, y を未知数とする方程式 f (x) = 0, g (x) = 0 は

NSolve[{f[x]==0,g[x]==0} , {x ,y}] ,NSolve[{f[x]==0,g[x]==0} , {x ,y}] ,

FindRoot[{f[x]==0,g[x]==0} , {x ,y}]

などの形で入力して解くことができます.未知数や方程式の数が多い場合もこれに準

じます.連立1次方程式においては,解が自由度を持つ場合や解が存在しない場合

もこめて答えを出します.

Solve[{ x+2y-4z== -7,

x+3y-6z==-11,

2x+4y-7z==-11 } , {x ,y,z}]

Solve[{ x-2y- z== 4,

x+ y+2z==-1,

2x- y+ z== 3 } , {x ,y,z}]

Solve[{ x+2y+3z== 4,

2x+5y+8z==10,

3x+2y+ z== 0 } , {x ,y,z}]

Solve[{x^2+y^2==1,x+y==0} , {x,y}]

FindRoot[{Sin[x]==x-y, Cos[y]==x+y} , {x,1 } , {y,0 }]

17

4.3 微分方程式

x を独立変数,y 未知関数とする微分方程式 f ( x, y, y', y'',... ) = 0 は

DSolve[f[x,y,y' ,y ' ' , . . . ]==0,y[x] ,x] の形で解くことができます.初期条件を与えて

解を求める場合には2番目の例のように入力します.3番目の例のように解が求まら

ない場合でも,NDSolve[ ] を用い初期条件を与えて x の区間を限定すると,数

値解が求まります.この解は,x の区間内の分点に対し解の近似値を求め補間して

得られる関数なので,具体的な形では表示されません.それでも,関数値を求めたり

グラフを描いたりすることができます.

連立微分方程式も

DSolve[{f[x,y,z ,y' ,z ' , . . . ]==0,g[x,y,z ,y' ,z ' , . . . ]==0} , {y[x] ,z[x]} ,x]

の形で解くことができます.

18

DSolve[y'[x]==-x^3 y[x]^2 ,y[x],x]

DSolve[{y' '[x]+y[x]==0 ,y[0]==0, y'[0]==-1} ,y[x],x]

DSolve[y' '[x]+Sin[y[x]]==0,y[x] ,x]

同じ微分方程式を NDSolve を用いて解きます.関数値やグラフを調べるために,

その解を f[x] とおきます.関数を定義するときには下の例のように,f[x_]の x の

あとに下線をひきます.2度目からは f[x] のままで使えます.

f[x_]=NDSolve[{y' '[x]+Sin[y[x]]==0,y[0]==0,y'[0]==2 } ,

y[x] , {x ,0,10}]

f[3]

Plot[Evaluate[y[x]/.f[x]] , {x ,0 ,10}]

19

5 グラフィックス

グラフィックスが簡単に描けるのは Mathematica の特長のひとつです.基本形は

Plot[ ] のコマンドですが,色々なオプションやパッケージなどが用意されていて,

2次元および3次元のグラフィックスを様々な形で描くことができます.また,出力され

たグラフィックスをアニメーションの形で見ることもできます.

5.1 2次元のグラフィックス

Plot[f[x] , {x ,a,b}] と入力すると関数 y = f (x) のグラフが a ≦ x ≦ b の範囲

で描かれます(プロットされます).座標軸を表す変数は示されませんので,

Plot[f[t] , {t ,a,b}] としても同じ結果が得られます.その時は横軸を t 軸と見なして

います. Plot[{f[x] ,g[x] , . . . } , {x ,a ,b}] と入力すると,複数のグラフ y = f (x) , y = g

(x) , ... が同時に描かれます.図全体の縦と横の比率はそのままでは座標軸上の目

盛りに関係なく一定(いわゆる黄金分割の比)ですが,オプションを使って変えられま

す(後述).図の付近にポインターを合わせてクリックすると,図のまわりが長方形の

枠で囲まれます.その長方形の各頂点と各辺の中点にある小さな黒い正方形のどれ

20

かひとつにポインターをあわせてマウスボタンを押したままマウスを移動するとすると

(ドラッグすると),図の大きさが変えられます.また,枠内にポインターをおいてドラッ

グすると,図の位置が変えられます.画面上の他の点をクリックすると枠は消えます.

Plot[

Sin[ 2x ] , { x, -2Pi , 2Pi }

]

Plot[

Log[ Sin[ 1/x ]+11/10 ], { x, 0.03, 1 }

]

21

Plot[

{ Exp[ -x^2 ], -Exp[ -x^2 ], Exp[ -x^2 ] Cos[ 12 x ] } ,

{ x, -2, 2 }

]

22

5.2 オプション

コマンドを入力すると,Mathematica はあらかじめ設定された最も一般的と思われ

る形で計算結果を出力します.この設定をデフォルト設定と言います.ユーザが自分

の目的に合った形で出力させたいと思う場合にはオプションを用いて設定を変えます.

これは他の場合でも同様ですが,ここでは2次元のグラフィックスのオプションを説明

します.

ま ず , 前 の 項 で 述 べ た グ ラ フ の 縦 軸 と 横 軸 の 比 率 を 考 え ま す .

Plot[Sin[2x], {x ,-2Pi ,2Pi}] に AspectRatio->Automatic という項を挿入し

て下のように入力すると,縦軸と横軸の目盛りの比率が1:1になります.

AspectRatio->a とすると(縦軸全体の長さ):(横軸全体の長さ)が1:a になり

ます.

Plot[ Sin[ 2x ] , { x , -2Pi , 2Pi } , AspectRatio->Automatic ]

Plot[ Sin[ 2x ] , {x, -2Pi, 2Pi } , AspectRatio->3/2 ]

23

その他にも多様なオプションがありますがいくつかを挙げると Axes->False (座

標 軸 を 表 示 し な い ) , Frame->True ( 図 の 周 り を 長 方 形 の 枠 で 囲 む ) ,

GridLines->Automatic ( 方 眼 紙 の よ う な 縦 横 の 線 を 入 れ る ) ,

AxesLabel->{"x","y"} ( 横 軸 に x , 縦 軸 に y と 変 数 名 を 表 示 す る ) ,

Ticks->None(座標軸に目盛りをつけない),PlotRange->{a,b} (縦軸方向に a

から b までの範囲のみグラフを描く),PlotStyle->RGBColor[a,b,c](描かれる

24

曲線の色を,赤緑青の比率が a:b:c になるように変える)などがあります.

RGBColor では a, b, c の値は0と1の間の数値にします.これらのオプションはいく

つかを組み合わせて用いることもできます.

5.3 陰関数の表示

例として,ImplicitPlot というコマンドをあげます.陰関数の表示された曲線を描く

には Plot でなく Impl icitPlot を用います.ImplicitPlot[f[x,y]==0, {x ,a,b}] と入

力すると曲線 f ( x, y ) = 0 が a ≦ x ≦ b の範囲で描かれます.

Impl icitPlot[ (x^2 + y^2)^2 == (x^2 - y^2) , { x, -1, 1 } ]

25

Impl icitPlot[ x^3-3 x y+y^3 == 0, { x, -2, 2 } ]

26

5.4 曲線のパラメータ表示

パラメータ t を用いて x = f ( t ) , y = g ( t ), a ≦ t ≦ b のように表示されてい

る曲線を描くには,Plot[{f[t] ,g[t] } , {t ,a,b}] と入力します.

ParametricPlot[

{ Sin[ t ] , Sin[ 2 t ] } ,

{ t , 0, 2Pi } ,

]

27

ParametricPlot[

{ 5 Cos[ -11/5 t ] + 7 Cos[ t ] , 5 Sin[ -11/5 t ] + 7 Sin[ t ] } ,

{ t , 0, 10 Pi } ,

AspectRatio->Automatic,

Axes -> None,

PlotStyle -> { RGBColor[ 0, 0, 1 ] }

]

とくに曲線が極座標において r = f (θ), a ≦θ ≦ b のように極方程式で表示さ

れている場合には,Parametr icPlot[{ f[t] Sin[t] , f[t] Cos[t]} , {t ,a ,b}] のように

一旦 xy 座標に直してから上記のコマンド ParametricPlot を用いてもその曲線を

描くことはできますが,下に示すようにコマンド PolarPlot を用いれば極方程式をそ

のまま代入することができます.

28

PolarPlot[

theta , { theta, 0, 2 Pi } ,

PlotStyle -> { RGBColor[ 0, 0, 1 ] }

]

29

PolarPlot[

Exp[ Sin[ theta ] ] - 2 Cos[ 4 theta ] , { theta, 0, 2 Pi } ,

Axes -> None,

PlotStyle -> { RGBColor[ 0, 0, 1 ] }

]

30

5.5 3次元グラフィックス

Plot3D[f[x,y], {x,a,b} , {y,c,c}] と入力すると2変数の関数 z = f ( x, y ) のグラフ

が a ≦ x ≦ b, c ≦ y ≦ d の範囲で描かれます.ParametricPlot3D を用い

て ParametricPlot3D[{f[s,t] ,g[s,t] ,h[s,t] } , {s ,a,b} , { t ,c,d}] と入力すると s, t を

パラメータとする曲面 f ( f ( s, t ), g ( s, t ), h ( s, t ) ) が a ≦ s ≦ b, c ≦ t ≦ d

の範囲で描かれます.

曲面は,いくつかのサンプル・ポイントをとり,それを線分で結んでできる網目模様

に面を張り付けたような形で表示されます.また,立体感を出すために,赤・緑・青の

3原色の光源に照らされているかのように,彩色されて描かれます.

オプションとしては,Boxed->False(曲面をかこむ立方体の枠を表示しない),

Axes->None(座標軸を表示しない),Shading->False(網目の間の面を彩色しな

い) Mesh->False(網目を描かない),Lighting->False(3原色の光源を用いず,

高い方を明るく低い方を暗くモノクロで表示する),PlotPoints->{a,b} (サンプル・

ポイントの個数を a×b にする),ViewPoint->{a,b,c}(点 (a, b, c) から眺めた形に

描く.デフォルト値は ( 1.3, -2.4, 2 )など数多くあります.オプションではありませんが,

Show[ContourGraphics[ ]] を用いて曲面の等高線を描くこともできます.

また,2次元の場合にも可能ですが,Show[GraphicsArray[ ]] を用いると

いくつかのグラフを表のように縦横に配列することができます.

31

Plot3D[

Exp[ x ] Sin[ y ] ,

{ x, -1.5, 1.5 } ,

{ y, -2Pi , 2Pi }

]

32

Plot3D[

Exp[ -x^2 ] Exp[ -y^2 ],

{ x, -2, 2 } ,

{ y, -2, 2 } ,

Boxed->False,

Axes->None

]

33

Plot3D[

Exp[ x ] Sin[ y ] ,

{ x, -1.5, 1.5 } ,

{ y, -2Pi , 2Pi } ,

ViewPoint->{ 1.3, -2, -1 }

]

34

ParametricPlot3D[

{ Cos[ s ]( 3+Cos[ t ] ) , Sin[ s ]( 3+Cos[ t ] ) , Sin[ t ] } ,

{ s, 0, 3Pi/2 } ,

{ t , -Pi , 2Pi/3 }

]

5.6 アニメーション

y = f ( x, k ) , z = f ( x, y, k ) のように曲面や曲線の方程式が文字 の定数 k を

含んでいるとき,k の値を色々変えると多数の曲線や曲面,いわゆる曲線 族・曲面

族が得られます.Mathematica ではこれらの曲線族や曲面族をアニメーションにして

見ることができます.

まず,Animate[Plot[f[x,k]} , {x ,a ,b} , {k ,c,d,e}] と入力すると, y = f ( x, k ) にお

いて k の値を k = c, k = c + e, k = c + 2e, ... , k = d と変えて得られる曲線をひと駒

ずつ描かれ,その変化を連続して表示することができます.

35

Animate[

Plot3D[

Exp[ x ] Sin[ y ] ,

{ x, -1.5, 1.5 } ,

{ y, -2Pi, 2Pi } ,

ViewPoint->{ 1.3, -2, a }

] ,

{ a, -3, 3, 0.5 }

]