講義資料 - 東洋大学

コマの回転のシミュレーション
東洋大学理工学部機械工学科 吉野隆
第一週(Mathematica の基礎と質点の運動)
講義の前に
ここではコンピュータ・シミュレーションについて学ぶ.極論を言えば,コンピュータ・シミュ
レーションとは,コンピュータの中に作られた実験装置を用いて実験を行うことである.実験装置
を作るために用いるのがプログラミング言語である.ここでは,Mathematica を用いてコンピ
ュータ・シミュレーションを行う一例を見る.第一週は減衰振動,第二週はコマの回転を考える.
今年度の方針
これまではとても簡単な例を用いて Mathematica の仕組みを説明してきた.今年度からはより実践
的なことを学ぶように構成を変更する.
Mathematica の基本
PC 教室の場合,Mathematica を起動するためには,「スタート」®「すべてのプログラム」®
「Wolfram Mathematica」®「Mathematica 9」を選択する.
Mathematica はノートブックとカーネルというふたつのプログラムで構成されている.ノートブッ
クに入力された命令をカーネルが処理をし,処理した結果をノートブックが表示をする仕組みにな
っている. Input というスタイルのセルに命令を記述したあとに, Shift キーと Enter キーを同時に
押すことによって命令がノートブックからカーネルに送られる.命令の処理結果はカーネルから
ノートブックに戻り, Output というスタイルのセルに出力される.ノートブックのスタイルを指定
しない場合(デフォルトの場合),キーボードからの入力は Input スタイルが設定されたセルに保
存される.
以下はその例である.
1+1
2
Sqrt@2D
2
N@Sqrt@2D, 10D
1.414213562
1 + 1  H1 + 1L
四則演算には +-*/ を用いる.乗算は半角スペースでも可能である.計算の優先順序を変更したい場
合には丸かっこを用いる.
2
2014handsoutFirst.nb
演習問題
A. 1から9まで乗じた結果を求めなさい.
B. 以下の式を計算しなさい.
1
1+
1
1+
1+1
C. 1から20まで乗じた結果を求めなさい.
D. 1から100ま乗じた結果を求めなさい
E. 1から9までの和を求めなさい.
F. 1から20までの和を求めなさい.
G. 1から100までの和を求めなさい.
F. 以下の式を計算しなさい.
1
1+
1
1+
1
1+
1
1+
1+1
関数を用いることでさまざまな計算ができる
上に挙げた例の一部には大文字で始まることばがある.これは Mathematica において既に定義され
ている式である.多くの場合それは,「定数」もしくは「関数」である.定数とは計算を行う間に
変わらない(一定の値をもつ)ものであり,関数とは引数を与えることによって新しい結果を得る
ための仕組みである.定数は名前だけであり,関数は名前のあとに角カッコがつく.
Pi は円周率を表す定数
Pi
Π
N 関数を用いると解析的に表現された式を数値に変換できる.N は関数なのでうしろに角カッコが
ある.角カッコの間には,その計算のために必要な数(「引数」という)をカンマで並べて指定す
る.
N@1  3, 20D
0.33333333333333333333
以下は三角関数の例.
Sin@Pi  6D
1
2
Cos@Pi  2D
0
関数によっては引数を必要としないものもある.RandomReal 関数は 0 以上 1 未満のでたらめな値
を返す関数である.実行するたびに異なる値が返されることを確認してほしい.
RandomReal@D
0.445425
関数を使用する場合には,この演習で用いる関数はごく一部であり,他にもさまざまな関数が用意
されている.
演習問題
A. Π を 100 桁まで表示しなさい.
B. Tan[Pi/3] と Tan[Pi/4] をそれぞれ 50 桁まで表現しなさい.
C. Exp[-1], Exp[0], Exp[1], Exp[2] を 10 桁まで表示して, Exp という関数が何かを推定しなさ
い.
2014handsoutFirst.nb
3
A. Π を 100 桁まで表示しなさい.
B. Tan[Pi/3] と Tan[Pi/4] をそれぞれ 50 桁まで表現しなさい.
C. Exp[-1], Exp[0], Exp[1], Exp[2] を 10 桁まで表示して, Exp という関数が何かを推定しなさ
い.
関数を組み合わせる
関数を組み合わせることによって,より複雑な計算を行うことができる.
Sqrt@Sin@ Pi  4D + Cos@Pi  6DD
1
3
+
2
2
演習問題
以下の式の値を自分が決めた桁数で表示しなさい.
A. ãsinHА6L+cosHА3L
B. ãlogHsinHА6LL
C. sinHlogH2L + logH3L + logH4LL
グラフの描画
基本
Plot 関数を用いると関数を(曲線として)プロットできる. ListPlot 関数を用いるとリスト(数値
の集合)を(点の集合として)プロットできる(おそらく別の実験でこの機能を使うはず).ここ
では Plot 関数のみを説明する.
Plot 関数を用いてグラフを描画するためには,最低でも関数の形と独立変数の範囲を与えなければ
ならない.その形式は,
Plot[曲線の式, {変数の名前, 変数の最小値, 変数の最大値}]
である.つまり,ひとつめの引数に曲線を表す式を,ふたつめの引数に用いる変数の種類とプロッ
トする範囲を指定する.
以下は sin(2x) をプロットした例である.
Plot@Sin@2 xD, 8x, 0, 4 Pi<D
1.0
0.5
2
4
6
8
-0.5
-1.0
これは x を t に変えても同じ結果になる.
10
12
2014handsoutFirst.nb
Plot@Sin@2 yD, 8y, 0, 4 Pi<D
1.0
0.5
2
4
6
8
10
12
-0.5
-1.0
オプションの指定
オプションを用いると見やすいグラフに変更することができる.オプションとはその関数独自の性
質を指定する機能である.必要な引数のあとにカンマで区切って,性質の名称と性質の値を矢印で
指定する.指定する際の矢印は,半角文字でマイナス(”-“)と大なり(”>”)を続けて入力する.間
違っても全角で文字で「®」としないこと.
以下は5つのオプションを指定した例である.
Plot@Sin@2 xD, 8x, 0, 4 Pi<, Frame ® True, PlotStyle ® Red, FrameStyle ® 14,
FrameLabel ® 8"x", "sinH2xL"<, PlotRange -> 8All, 8- 1.2, 1.2<<D
1.0
0.5
sinH2xL
4
0.0
-0.5
-1.0
0
2
4
6
8
10
12
x
そのほかのオプションは「ヘルプ」®「ドキュメントセンター」もしくは,以下のふたつの方法で
確認できる.
2014handsoutFirst.nb
5
Options@PlotD
1
:AlignmentPoint ® Center, AspectRatio ®
, Axes ® True,
GoldenRatio
AxesLabel ® None, AxesOrigin ® Automatic, AxesStyle ® 8<, Background ® None,
BaselinePosition ® Automatic, BaseStyle ® 8<, ClippingStyle ® None,
ColorFunction ® Automatic, ColorFunctionScaling ® True, ColorOutput ® Automatic,
ContentSelectable ® Automatic, CoordinatesToolOptions ® Automatic,
DisplayFunction ¦ $DisplayFunction, Epilog ® 8<, Evaluated ® Automatic,
EvaluationMonitor ® None, Exclusions ® Automatic, ExclusionsStyle ® None,
Filling ® None, FillingStyle ® Automatic, FormatType ¦ TraditionalForm,
Frame ® False, FrameLabel ® None, FrameStyle ® 8<, FrameTicks ® Automatic,
FrameTicksStyle ® 8<, GridLines ® None, GridLinesStyle ® 8<,
ImageMargins ® 0., ImagePadding ® All, ImageSize ® Automatic,
ImageSizeRaw ® Automatic, LabelStyle ® 8<, MaxRecursion ® Automatic,
Mesh ® None, MeshFunctions ® 8ð1 &<, MeshShading ® None, MeshStyle ® Automatic,
Method ® Automatic, PerformanceGoal ¦ $PerformanceGoal, PlotLabel ® None,
PlotLegends ® None, PlotPoints ® Automatic, PlotRange ® 8Full, Automatic<,
PlotRangeClipping ® True, PlotRangePadding ® Automatic, PlotRegion ® Automatic,
PlotStyle ® Automatic, PreserveImageOptions ® Automatic, Prolog ® 8<,
RegionFunction ® HTrue &L, RotateLabel ® True, TargetUnits ® Automatic,
Ticks ® Automatic, TicksStyle ® 8<, WorkingPrecision ® MachinePrecision>
? Plot
Plot
@f,
8x,xmin ,xmax <D xmin から xmax の範囲の x の関数として f のプロットを作成する.
Plot
@8 f1 ,f2 ,
… <,
8x,xmin ,xmax <D 複数の関数 fi をプロットする. ‡
リストを用いた同時プロット
リストとは波カッコの間にカンマで区切って並べられた式である.例えば,以下のようにしてリス
トを作ることができる.
8Sin@xD, Cos@xD<
8Sin@xD, Cos@xD<
Plot 関数の第一引数にリストを用いることでふたつ以上の関数を重ねて描くことができる.
Plot@8Sin@2 xD, Cos@2 xD<, 8x, 0, 4 Pi<D
1.0
0.5
2
4
6
8
10
12
-0.5
-1.0
オプションはリストを用いて曲線ごとに指定することもできる.
2014handsoutFirst.nb
Plot@8Sin@2 xD, Cos@2 xD<, 8x, 0, 4 Pi<, Frame ® True, PlotStyle ® 8Red, Blue<,
FrameStyle ® 14, FrameLabel ® 8"x", "sinH2xL and cosH2xL"<D
1.0
sinH2xL and cosH2xL
6
0.5
0.0
-0.5
-1.0
0
2
4
6
8
10
12
x
練習問題
以下の式のグラフを描きしなさい.変数の範囲は自分で決めなさい.オプションを設定して見やす
いグラフになるように工夫すること.
A. ã-t6 sinH4 Π tL
B. x 3 - 3 x - 2
C. x logH cosHxL + 2L
D. sinHΠ xL, sinH 2 Π xL, sinH3 Π xL, sinH4 Π xL
Table 関数によるリストの生成
基本
リストの生成にはいくつかの方法があるが,最も汎用性が高い方法は Table 関数を用いるものであ
る.
Table[リストの要素, {変数名, 変数の始まり, 変数の終わり, 増分}]
とすることで,簡単にリストを生成することができる.第一引数は変数名を用いて要素の式を記述
し,第二引数には繰り返しに用いる変数名のその範囲と増分を記述する.第二引数の幾つかについ
ては省略可能なものもある.以下はその使用例である.
Table@1, 810<D
81, 1, 1, 1, 1, 1, 1, 1, 1, 1<
Table@i, 8i, 10<D
81, 2, 3, 4, 5, 6, 7, 8, 9, 10<
Table@2 i, 8i, 0, 5<D
80, 2, 4, 6, 8, 10<
Table@i, 8i, 0, 10, 2<D
80, 2, 4, 6, 8, 10<
応用
複数の式を Table 関数を使って生成し,その結果を Plot 関数でグラフにしてみる.
2014handsoutFirst.nb
7
Plot@Evaluate@Table@Cos@i xD, 8i, 0, 4<DD, 8x, 0, 4 Pi<,
PlotStyle ® Table@RGBColor@r, 0, 2 r  3D, 8r, 0, 1, 1  4<DD
1.0
0.5
2
4
6
8
10
12
-0.5
-1.0
練習問題
A. 3 桁の3の倍数のリストを作りなさい.
B. 1/100 から 1 まで 1/100 ずつ増えるリストを作りなさい.
C. {Cos[x], Sin[x]} の x を 0 から 2 Pi まで Pi/20 ごとに増加させたときのリストを作りなさい
D.
n
2 が n を大きくしていくとどう変化するのかを確かめるリストを作りなさい.
2次元グラフィックス
基本
円や直線を簡単に描く方法を確認しておく.
個々の2次元図形は「2Dグラフィックスプリミティブ」という.2次元のグラフィックスを製作する
ためには,グラフィックスプリミティブのリストを作り,Graphics関数によってそのリストを表示
すればよい.グラフィックスプリミティブとは絵を描くための基本となる構成要素のことで,座標
と幾何学的な形状を与える関数によって作成される.
直線を表すためには Line 関数を用いる.引数は頂点のリストであり,このリストによって折れ線が
作られる.リストの要素は2Dグラフィックスプリミティブの場合には x 座標と y 座標のふたつであ
る.
Graphics@Line@880, 0<, 82, 1<, 83, 0<<DD
外枠の大きさを指定するためには PlotRange オプションを使用する.
8
2014handsoutFirst.nb
Graphics@Line@880, 0<, 82, 1<, 83, 0<<D,
PlotRange ® 88- 5, 5<, 8- 5, 5<<, Frame ® TrueD
4
2
0
-2
-4
-4
-2
0
2
4
ふたつ以上のオブジェクトを同時に描きたい場合,Graphics関数の第一引数にリストを用いる.
Graphics@8Line@880, 0<, 82, 1<, 83, 0<<D, Line@88- 1, 0<, 82, - 4<, 83, - 1<<D<,
PlotRange ® 88- 5, 5<, 8- 5, 5<<, Frame ® TrueD
4
2
0
-2
-4
-4
-2
0
2
4
円を描く場合,中を塗りつぶすかどうかによって Disk 関数(塗りつぶす)と Circle 関数(塗りつ
ぶさない)のいずれかを用いる.ともに,中心の座標のみを与えると半径 1 の円を描き,中心の座
標と半径の値を与えるとそのとおりの円を描く.扇形(円弧)や楕円形を描くこともできるが,こ
こでは省略する.
2014handsoutFirst.nb
9
Graphics@8Circle@80, 0<, 1D, Disk@81, 2<, 0.5D<,
PlotRange ® 88- 5, 5<, 8- 5, 5<<, Frame ® TrueD
4
2
0
-2
-4
-4
-2
0
2
4
境界線や塗りつぶしの色を決める場合には,描く前に色を指定する.
Graphics@8Red, Circle@80, 0<, 1D, Green, Disk@81, 2<, 0.5D<,
PlotRange ® 88- 5, 5<, 8- 5, 5<<, Frame ® TrueD
4
2
0
-2
-4
-4
-2
0
2
4
色の指定方法
色の指定方法はさまざまである.ひとつの方法は,これまで説明なしに用いてきたように,色の名
前を用いる方法である.どのような色が定義されているかは,「パレット」®「カラース
キーム」でカラースキーム・パレットを表示したあとで,「名前付き」項目で調べることができ
る.カラースキーム・パレットには他にもさまざまな色の定義がある.これらの使い方は自分で確
認すること.
10
2014handsoutFirst.nb
色の指定方法はさまざまである.ひとつの方法は,これまで説明なしに用いてきたように,色の名
前を用いる方法である.どのような色が定義されているかは,「パレット」®「カラース
キーム」でカラースキーム・パレットを表示したあとで,「名前付き」項目で調べることができ
る.カラースキーム・パレットには他にもさまざまな色の定義がある.これらの使い方は自分で確
認すること.
2つ目の方法として光の三原色のブレンドによる方法がある.これは
RGGColor[赤色光の強さ,緑色光の強さ,青色光の強さ]
とする.それぞれの最大値は1である.
Graphics@8RGBColor@1, 0.3, 0.4D, Circle@80, 0<, 1D, [email protected], 0.4, 0.8D,
Disk@81, 2<, 0.5D<, PlotRange ® 88- 5, 5<, 8- 5, 5<<, Frame ® TrueD
4
2
0
-2
-4
-4
-2
0
2
4
さまざまなスタイルの設定
グラフィックスプリミティブを表示するペンの色や太さはデフォルトで決められているが,グラフ
ィック指示子を用いることによって調整することができる.一度指定すると,その指定は新しい指
定が出現するまで有効になる.
Graphics@8Circle@80, 0<, 1D, Red, Circle@81, 1<, 0.5D, Thick,
Circle@82, 0<, 1D, AbsoluteThickness@3D, Green, Dashed, Circle@83, 0<, 1.2D<D
演習問題
A. 他にどのようなグラフィックスオブジェクトがあるのかを調べて,それを描いてみなさい.
B. Table 関数を用いて複数のオブジェクトから構成されるグラフィックスを描きなさい.
2014handsoutFirst.nb
11
アニメーション
例題
アニメーションはパラパラ漫画をつくることと同じである.そこで,画像のリストを作成する.以
下はアニメ用画像リストの例.ただし,コマの数を3にした.
Table@Graphics@8Hue@t  H2 PiLD, Disk@8Cos@tD, Sin@tD<, 0.1D<,
PlotRange ® 88- 1.5, 1.5<, 8- 1.5, 1.5<<, Frame ® TrueD, 8t, 0, 1, 0.5<D
:
1.5
1.5
1.5
1.0
1.0
1.0
0.5
0.5
0.5
,
0.0
,
0.0
-0.5
-0.5
-0.5
-1.0
-1.0
-1.0
-1.5
-1.5 -1.0 -0.5
0.0
0.5
1.0
1.5
-1.5
-1.5 -1.0 -0.5
0.0
0.5
1.0
1.5
>
0.0
-1.5
-1.5 -1.0 -0.5
0.0
0.5
1.0
1.5
作成した画像のリストを ListAnimate を用いて連続表示する.今度はコマの数が100個になってい
る.
ListAnimate@Table@Graphics@8Disk@
80, 0<, 0.03D, Line@880 , 0<, 8Cos@2 tD, Sin@4 tD<<D,
Hue@t  H2 PiLD, Disk@8Cos@2 tD, Sin@4 tD<, 0.1D<,
PlotRange ® 88- 1.5, 1.5<, 8- 1.5, 1.5<<, Frame ® TrueD, 8t, 0, Pi, 0.01 Pi<DD
1.5
1.0
0.5
0.0
-0.5
-1.0
-1.5
-1.5
-1.0
-0.5
0.0
0.5
1.0
1.5
演習問題
A. 上のアニメーションで,式やグラフィックスプリミティブを変えて,別のアニメーションを作成
しなさい.
12
2014handsoutFirst.nb
A. 上のアニメーションで,式やグラフィックスプリミティブを変えて,別のアニメーションを作成
しなさい.
常微分方程式の数値解と減衰振動のシミュレーション
方程式を解くのと同様に常微分方程式も解析解と数値解を求める関数がある.ここでは,話をコン
ピュータシミュレーションに特化したいので,後者の NDSolve 関数のみについて説明を行う.
以下に示す手順は単振動の方程式の解を得てその結果をグラフ化する例.Remove はこれまでの設
定を解除するときに用いる関数.
Remove@xD
例題1(単振動)
NDSolve 関数は,境界条件付きの方程式,従属変数,独立変数の変動範囲の3つを指定して,微分
方程式の数値解を得るものである.下で示した例はバネ定数が 0.5 であるときの単振動を表してい
る.
sol = With@8k = 0.5, tmax = 30<, NDSolve@
8D@x@tD, 8t, 2<D Š - k x@tD, x@0D Š 0.3, x '@0D Š 0.1<, x, 8t, 0, tmax<DD
88x ® InterpolatingFunction@880., 30.<<, <>D<<
得られた解は Plot 関数を用いて図示することができる.ただし,解の形からもわかるように,解の
置換を行わなければならない.
Plot@x@tD . First@solD, 8t, 0, 20<D
0.3
0.2
0.1
5
-0.1
-0.2
-0.3
10
15
20
2014handsoutFirst.nb
13
ListAnimate@With@8tmax = 30, rad = 0.2, bl = 1<,
Module@8posX<, Table@posX = Hx@tD . First@solD . t ® timeL + bl;
Graphics@8Line@880, 0.3<, 80, - rad<, 81 + bl, - rad<<D, Blue, Line@880, 0<,
8HposX - radL  5, 0<, 82 HposX - radL  5, rad<, 83 HposX - radL  5, - rad<,
84 HposX - radL  5, 0<, 8HposX - radL, 0<<D, Red, Disk@8posX, 0<, radD<,
PlotRange ® 880, 1 + bl<, 8- 1, 1<<D, 8time, 0, tmax, tmax  100<DDDD
例題2(減衰振動)
微分方程式 d 2 x  d t 2 + Η d x  d t + k x = 0 は,Ηが粘性定数,k がバネ定数を表している.初期条件
を x(0)=0.3, x’
(0)=0 とする.
In[1]:=
Out[1]=
sol = With@8k = 0.5, eta = 0.1, tmax = 30<,
NDSolve@8D@x@tD, 8t, 2<D Š - eta D@x@tD, tD - k x@tD,
x@0D Š 0.3, x '@0D Š 0.0<, x, 8t, 0, tmax<DD
88x ® InterpolatingFunction@880., 30.<<, <>D<<
もしくは,
In[2]:=
Out[2]=
sol = With@8k = 0.5, eta = 0.1, tmax = 30<,
NDSolve@8D@v@tD, tD Š - eta v@tD - k x@tD, D@x@tD, tD Š v@tD,
x@0D Š 0.3, v@0D Š 0.0<, 8x, v<, 8t, 0, tmax<DD
88x ® InterpolatingFunction@880., 30.<<, <>D,
v ® InterpolatingFunction@880., 30.<<, <>D<<
14
2014handsoutFirst.nb
In[3]:=
Plot@x@tD . First@solD, 8t, 0, 30<D
0.3
0.2
0.1
Out[3]=
5
10
15
20
25
30
-0.1
-0.2
In[4]:=
ListAnimate@With@8tmax = 30, rad = 0.2, bl = 1<,
Module@8posX<, Table@posX = Hx@tD . First@solD . t ® timeL + bl;
Graphics@8Line@880, 0.3<, 80, - rad<, 81 + bl, - rad<<D, Blue, Line@880, 0<,
8HposX - radL  5, 0<, 82 HposX - radL  5, rad<, 83 HposX - radL  5, - rad<,
84 HposX - radL  5, 0<, 8HposX - radL, 0<<D, Red, Disk@8posX, 0<, radD<,
PlotRange ® 880, 1 + bl<, 8- 1, 1<<D, 8time, 0, tmax, tmax  100<DDDD
Out[4]=
演習問題
A. 上の減衰振動は Η と k の組み合わせによって,振る舞いが異なる.幾つかの組み合わせで解を描
いて,どのような理由でその解になるのかを考察しなさい.
B. 微分方程式 d 2 x  d t 2 + aIx 2 - 1M d x  d t + x = 0 の解を求めなさい.初期条件は自分で設定するこ
と. この方程式(van der Pol 方程式)は aの値によって異なる振る舞いを示す.いくつか設定を変
えてみて比較しなさい.
補足
2014handsoutFirst.nb
15
補足
リスト(ベクトルと行列)
Mathematica ではリストを作成することによって,複数の値や式をひとつにまとめることができ
る.リストは波括弧({と})で挟まれ,要素はカンマ(,)で区別される.以下はリストの例であ
る.
81, 2, 3<
81, 2, 3<
xList = 81, 2, 3<
81, 2, 3<
x * xList
820, 40, 60<
Mathematica ではリストのリスト(入れ子になったリスト)もまたリストである.要素の数がきち
んと調整されていれば行列やテンソルとみなすことができる.例えば,以下のリストは2行3列の
行列である.
mtx = 881, 2, 3<, 86, 5, 4<<
881, 2, 3<, 86, 5, 4<<
MatrixForm 関数を用いると,リストをベクトルや行列のように表示することができる.
MatrixForm@mtxD
K
1 2 3
O
6 5 4
リストの作成には Range や Table を用いる.
Range@5D
81, 2, 3, 4, 5<
Table@i, 8i, 5<D
81, 2, 3, 4, 5<
Table@i * j, 8i, 5<, 8j, 5<D
881, 2, 3, 4, 5<, 82, 4, 6, 8, 10<,
83, 6, 9, 12, 15<, 84, 8, 12, 16, 20<, 85, 10, 15, 20, 25<<
MatrixForm 関数はベクトルや行列を表現するための関数である.
MatrixForm@Table@i * j, 8i, 1, 5<, 8j, 1, 5<DD
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16
5 10 15 20
5
10
15
20
25
演習問題
A. Range[-10, 10] の結果を予想して,実行しなさい.
B. Range[-10, 10, 2] の結果を予想して,実行しなさい.
C. 「2桁の3の倍数」を Range や Table を使ってつくりなさい.
D. 関数 y=x^2-x-2 に x を 1 から 10 の整数をいれたとき結果がどうなるのかを確認しなさい.
16
2014handsoutFirst.nb
演習問題
A. Range[-10, 10] の結果を予想して,実行しなさい.
B. Range[-10, 10, 2] の結果を予想して,実行しなさい.
C. 「2桁の3の倍数」を Range や Table を使ってつくりなさい.
D. 関数 y=x^2-x-2 に x を 1 から 10 の整数をいれたとき結果がどうなるのかを確認しなさい.
ベクトルや行列の演算
v1 = 81, 2, 3<; v2 = 83, 4, 5<; m1 = 881, 2<, 83, 4<<; m2 = 883, 5<, 87, 8<<;
和や差は + と - を用いて行える.
v2 - v1
82, 2, 2<
m1 + m2
884, 7<, 810, 12<<
スカラー倍は * で行える.
3 * v1
83, 6, 9<
2 * m1
882, 4<, 86, 8<<
内積にはピリオド(.)を用いる.
v1.v2
26
m1.m2
8817, 21<, 837, 47<<
m2.81, 1<
88, 15<
演習問題
A. 0 から 20 までの整数を作って,それを 5 倍することによって, 0 以上 100 以下の 5 の倍数をつ
くりなさい.
B. ベクトル (1, 1, 0) と ベクトル (0,0,1) の内積を計算しなさい.このベクトルは直交しているだろ
うか?
局所定数と局所関数(With と Module)
複数の処理をまとめるときには With や Module を用いる.この処理の間だけ使いたい定数や変数を
局所定数・局所変数と呼ぶ.With は局所的な定数を用いるときに用いる. Module は局所的な変数
を用いるときに用いる.
例えば,上記の x を一時的に変更して用いたいとする.
x
20
上記のように x には 20 が設定されている.局所的に x に 10 を割り当てて用いたいとする.このと
き,以下のように With を用いる.
2014handsoutFirst.nb
17
With@8x = 10<, xD
10
しかし,これは局所的な定義なので,With 関数の外で定義した結果はもとの値のままである.
x
20
複数の処理を記述するためには処理をセミコロンで区切って出力を抑制する.最終行にセミコロン
を用いたいことで,最終行の処理結果を With の外に返すことができる.
y = With@8x = 10<, Print@xD; Print@2 xD; Print@3 xD; 5 xD
10
20
30
50
y
50
x
20
With は定数であることを明示するために用いるので,途中で変更することができない.途中で変更
したい場合には Module を用いる.
With@8x = 10<, x = 5D
Set
::
setraw
:未加工オブジェクト10
に割当てができません. ‡
5
Module@8x = 10<, x = 5D
5
この場合でも外部で設定された値は変更されない.
x
20
一般的には新しい関数を作成する場合には, With や Module を用いて設定した処理を遅延設定す
る.以下は典型的な自作関数の例である.ただし,特に意図がって作成したものではない.
myFunc@a_, b_D := Module@8p, q<,
p = 2 * a;
q = b - 3;
p3-q*5
D
myFunc@3, 4D
-3
演習問題
A. 局所定数 pi を 3.14 に設定して Sin[pi], Cos[pi], Tan[pi] を表示しなさい. Sin[Pi], Cos[Pi],
Tan[Pi] と表示が違う理由を考えなさい.
B. 局所変数 x を設定して, x に 0.0 を設定して Exp[x] を表示しなさい.さらに x に 1.0 を設定し
て Exp[x] を表示しなさい.
18
演習問題
A. 局所定数 pi を 3.14 に設定して Sin[pi], Cos[pi], Tan[pi] を表示しなさい. Sin[Pi], Cos[Pi],
Tan[Pi] と表示が違う理由を考えなさい.
B. 局所変数 x を設定して, x に 0.0 を設定して Exp[x] を表示しなさい.さらに x に 1.0 を設定し
て Exp[x] を表示しなさい.
2014handsoutFirst.nb
等号の使い方
等号ひとつは「設定」である.
等号(=)を用いることによって,値や式に名前(変数名)を割り当てることができる.等号の左側
には設定変数名を右側には設定したい値を記す.以下はその例である.
x = 20
20
2 * x
40
左右を間違えるとエラーとなる場合がある.エラーとならない場合もあるので注意が必要である.
5 = y
Set
::
setraw
:未加工オブジェクト5に割当てができません. ‡
y
Mathematica が持っている機能は大文字から始まる語で定義されている.
Mathematica は小文字と大文字を区別する.既に定義されている関数を用いたい場合には必ず大文
字から始めること.
変数名をつけるときには,間にスペースやマイナスやアンダーバーを挟んではいけない.別の命令
と解釈されてしまうからである.以下の例では「xという変数」という意味で「x-variable」という
変数名を設定したつもりで失敗している.
x - variable
20 - variable
スペースは乗算(かけ算)を意味する.以下の例では「私の x 」という意味で「my x」と変数名を
設定したつもりで失敗している.
my x
20 my
変数名はつながっていなければならない.
myx
myx
演習問題
A. 変数 xx に Pi/6 を設定しなさい. Cos[xx] , Sin[xx] がいくつつになるのかを確認しなさい.
B. N[Tan[xx], 10] の結果を予想しなさい.実際に実行して,予想どおりになるのかを確認しなさ
い.
等号ふたつは「等しい」である.
等号をふたつ並べると等しいかどうかを判断できる.等しいときは True が等しくないときには
False が返される.「等しい」を判断する場合には左右の違いはない.以下はその例である.
2014handsoutFirst.nb
19
5 Š 10
False
2 * 5 Š 10
True
x Š 20
True
20 Š x
True
演習問題
A. 「等しい」が == であることを考えると,他の記号が予想できる.例えば「以上」や「以下」を
表現したい場合にどうすればいいだろうか?「5は6以上である」や「xx は Π/8 以下である」を入力
して結果を確認しなさい.
B. 「eq = (z^2 -z -6==0) 」と入力しなさい.これは何を意味するだろうか?
方程式を解く(Solve と NSolve)
今回のシミュレーションでは使わない可能性が高いが, Solve 関数や NSolve 関数を用いることで
方程式を解くことができる. Solve 関数は解析解を求めるための関数であり, NSolve 関数は数値
解を求めるための関数である. Solve 関数の解は厳密であるが解を得ることができない場合があ
り, NSolve 関数の解は近似値であるが解を得ることができる可能性が高い.これらの関数の引数
は,方程式と変数名である.
Solve@2 z Š 4, zD
88z ® 2<<
変数に値が設定されている場合には機能しない.
Solve@2 x Š 4, xD
Solve
::
ivar
:20
は有効な変数ではありません. ‡
Solve@False, 20D
非線形な方程式を解く.
Solve@ z - Sin@zD Š 1  2, zD
Solve
::
nsmet
:この系はSolve
で使用できるメソッドでは解けません. ‡
1
SolveBz - Sin@zD Š
, zF
2
Solve 関数では解を得ることができないが, NSolve 関数は Reals オプションを追加することで解
を得ることができる.
NSolve@ z - Sin@zD Š 1  2, z, RealsD
88z ® 1.4973<<
変数が複数の場合.リストを用いて解を得ることが可能である.
Solve@8 3 z + 4 w Š 11, 2 z - w Š 0<, 8z, w<D
88z ® 1, w ® 2<<
上の例は行列の積を使って表すこともできるが,それがいつもうまくいくとは限らない.以下は成
功した例.
20
2014handsoutFirst.nb
上の例は行列の積を使って表すこともできるが,それがいつもうまくいくとは限らない.以下は成
功した例.
Solve@883, 4<, 82, - 1<<.8z, w< Š 811, 0<, 8z, w<D
88z ® 1, w ® 2<<
別の方法として Thread を用いる方法がある.
Solve@Thread@883, 4<, 82, - 1<<.8z, w< Š 811, 0<D, 8z, w<D
88z ® 1, w ® 2<<
演習問題
A. 方程式 4 x-1= 9 を解きなさい.うまくいかない場合にはその理由を考えて,うまく解けるように
工夫しなさい.(ヒント:なぜ上の例では x を使っていないのだろうか?)
B. 方程式 p = p Cos[p-Π/6] を解きなさい.
関数の定義には「遅延設定」を用いる.
自分で関数を定義することができる.このときは遅延設定(:=)を用いること.通常の設定はたまに
悪さをする.
以下はふたつの引数を足した後で2倍する関数を定義した例.
myFunc@x_, y_D := 2 * Hx + yL
myFunc@2, 5D
14
myFunc@10, 10D
40
演習問題
A. 「引数 a を与えると 3 a + 5 を返す関数 myL 」を設定しなさい.myL[1] と myL[2] はいくつにな
るのか予想して,そのとおりになるかを確認しなさい.
B. 「引数 a と b を与えると a + I*b を返す関数 myCPX 」を設定しなさい. myCPX[1, 2]+
myCPX[-2, -3] はいくつになるか?
セミコロンによる出力抑制とPrint 関数
セミコロンは出力を抑制する.
x;
Print 関数はノートブックに指定された値を表示する.
Print@xD
20
微分
Mathematica で微分を表す方法は2種類ある.この講義では D 関数を使用している.この関数の使
い方は以下のとおりである.
D@Sin@a xD, xD
a Cos@a xD
2014handsoutFirst.nb
D@Sin@a xD, 8x, 2<D
- a2 Sin@a xD
D@Cos@ yD + y Sin@xD, yD
Sin@xD - Sin@yD
21