View
3
Download
0
Category
Preview:
Citation preview
コマの回転のシミュレーション
東洋大学理工学部機械工学科 吉野隆
第一週(基本的なこと)
� Mathematica の基本
Mathematica はノートブックとカーネルというふたつのプログラムで構成されている.ノートブックに入力され
た命令をカーネルが処理をし,処理した結果をノートブックが表示をする仕組みになっている. Input というスタイルのセルに命令を記述したあとに, Shift キーと Enter キーを同時に押すことによって命令がノートブックからカーネルに送られる.命令の処理結果はカーネルからノートブックに戻り, Output というスタイルのセルに出力される.ノートブックのスタイルを指定しない場合(デフォルトの場合),キーボードからの入力は Input スタイルが設定されたセルに保存される.
PC 教室の場合,「スタート」®「すべてのプログラム」®「Wolfram Mathematica」®「Mathematica 7」でみつけられる.
以下はその例である.
1 + 1
2
Sqrt@2D
2
N@Sqrt@2D, 10D
1.414213562
1 + 1 � H1 + 1L
四則演算には +-*/ を用いる.乗算は半角スペースでも可能である.計算の優先順序を変更したい場合には丸かっこを用いる.
演習
A. 1から9まで乗じた結果を求めなさい.B. 以下の式を計算しなさい.1 +
1
1+1
1+1
� 関数を用いることでさまざまな計算ができる
上に挙げた例のように,関数を用いることでさまざまな計算ができる.この演習で用いる関数は三角関数程度で
あるが,他にもさまざまな関数が用意されている.
Sin@Pi � 6D
1
2
Cos@Pi � 2D
0
Pi は円周率を表す定数
Pi
Π
N 関数を用いると解析的に表現された式を数値に変換できる.
N@1 � 3, 20D
0.33333333333333333333
演習問題
A. Π を 100 桁まで表示しなさい.B. Tan[Π/4] を 50 桁まで表現しなさい.C. Exp[0], Exp[1], Exp[2] を 10 桁まで表示して, Exp という関数が何かを推定しなさい.
� Mathematica が持っている機能は大文字から始まる語で定義されている.
Mathematica は小文字と大文字を区別する.既に定義されている関数を用いたい場合には必ず大文字から始めること.
� 等号の使い方
� 等号ひとつは「設定」である.
等号(=)を用いることによって,値や式に名前(変数名)を割り当てることができる.等号の左側には設定変数名を右側には設定したい値を記す.以下はその例である.
x = 20
20
2 * x
40
左右を間違えるとエラーとなる場合がある.エラーとならない場合もあるので注意が必要である.
5 = y
Set::setraw : 未加工オブジェクト5に割当てができません. �
y
変数名をつけるときには,間にスペースやマイナスやアンダーバーを挟んではいけない.別の命令と解釈されて
しまうからである.
x - variable
20 - variable
スペースは乗算(かけ算)
my x
20 my
2 110606handsout.nb
myx
myx
演習問題
A. 変数 xx に Pi/6 を設定しなさい. Cos[xx] , Sin[xx] がいくつつになるのかを確認しなさい.B. N[Tan[xx], 10] の結果を予想しなさい.実際に実行して,予想どおりになるのかを確認しなさい.
� 等号ふたつは「等しい」である.
等号をふたつ並べると等しいかどうかを判断できる.等しいときは True が等しくないときには False が返される.「等しい」を判断する場合には左右の違いはない.以下はその例である.
5 � 10
False
2 * 5 � 10
True
x � 20
True
20 � x
True
演習問題
A. 「等しい」が == であることを考えると,他の記号が予想できる.例えば「以上」や「以下」を表現したい場合にどうすればいいだろうか?「5は6以上である」や「xx は Π/8 以下である」を入力して結果を確認しなさい.B. 「eq = (x^2 -x -6==0) 」と入力しなさい.これは何を意味するだろうか?
� 関数の定義には「遅延設定」を用いる.
自分で関数を定義することができる.このときは遅延設定(:=)を用いること.通常の設定はたまに悪さをする.
以下はふたつの引数を足した後で2倍する関数を定義した例.
myFunc@x_, y_D := 2 * x * y
myFunc@2, 5D
20
myFunc@10, 10D
200
演習問題
A. 「引数 a を与えると 3 a + 5 を返す関数 myL 」を設定しなさい.myL[1] と myL[2] はいくつになるのか予想して,そのとおりになるかを確認しなさい.
B. 「引数 a と b を与えると a + I*b を返す関数 myCPX 」を設定しなさい. my[1, 2]+ my[-2, -3] はいくつになるか?
� 複数の処理をまとめる(With と Module)
複数の処理をまとめるときには With や Module を用いる.With は局所的な定数を用いるときに用いる. Moduleは局所的な変数を用いるときに用いる.
例えば,上記の x を一時的に変更して用いたいとする.
110606handsout.nb 3
例えば,上記の x を一時的に変更して用いたいとする.
x
20
上記のように x には 20 が設定されている.局所的に x に 10 を割り当てて用いたいとする.このとき,以下のように With を用いる.
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
4 110606handsout.nb
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] を表示しなさい.
� リスト(ベクトルと行列)
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
K1 2 3
6 5 4O
リストの作成には 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 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 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 の整数をいれたとき結果がどうなるのかを確認しなさい.
110606handsout.nb 5
演習問題
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) の内積を計算しなさい.このベクトルは直交しているだろうか?
� 方程式を解く(Solve と NSolve)
今回のシミュレーションでは使わない可能性が高いが, Solve 関数や NSolve 関数を用いることで方程式を解くことができる. Solve 関数は解析解を求めるための関数であり, NSolve 関数は数値解を求めるための関数である. Solve 関数の解は厳密であるが解を得ることができない場合があり, NSolve 関数の解は近似値であるが解を得ることができる可能性が高い.これらの関数の引数は,方程式と変数名である.
Solve@2 z � 4, zD
88z ® 2<<
変数に値が設定されている場合には機能しない.
6 110606handsout.nb
Solve@2 x � 4, xD
Solve::ivar : 20は有効な変数ではありません. �
Solve@False, 20D
非線形な方程式を解く.
Solve@ z - Sin@zD � 1 � 2, zD
Solve::nsmet : この系はSolveで使用できるメソッドでは解けません. �
SolveBz - Sin@zD �
1
2, zF
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<<
上の例は行列の積を使って表すこともできるが,それがいつもうまくいくとは限らない.以下は成功した例.
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] を解きなさい.
� 常微分方程式の数値解
方程式を解くのと同様に常微分方程式も解析解と数値解を求める関数がある.ここでは,話をコンピュータシミ
ュレーションに特化したいので,後者の NDSolve 関数のみについて説明を行う.
以下は単振動の方程式の解の例.Remove はこれまでの設定を解除するときに用いる関数.
Remove@xD
sol = With@8k = 0.5<,NDSolve@8D@x@tD, 8t, 2<D � - k x@tD, x@0D � 0.3, x'@0D � 0.1<, x, 8t, 0, 10<DD
88x ® InterpolatingFunction@880., 10.<<, <>D<<
得られた解は Plot を用いて図示することができる.
110606handsout.nb 7
Plot@x@tD �. First@solD, 8t, 0, 10<D
2 4 6 8 10
-0.3
-0.2
-0.1
0.1
0.2
0.3
sol = With@8k = 0.5, eta = 0.1<, NDSolve@8D@x@tD, 8t, 2<D � -eta D@x@tD, tD - k x@tD, x@0D � 0.3, x'@0D � 0.1<, x, 8t, 0, 20<DD
88x ® InterpolatingFunction@880., 20.<<, <>D<<
Plot@x@tD �. First@solD, 8t, 0, 20<D
5 10 15 20
-0.2
-0.1
0.1
0.2
0.3
演習問題
A. 微分方程式 d2 x �d t2 + aIx2 - 1M d x �d t + x = 0の解を求めなさい.初期条件は自分で設定すること. この方程
式(van der Pol 方程式)は aの値によって異なる振る舞いを示す.いくつか設定を変えてみて比較しなさい.
� 3次元グラフィックス
� Graphics3D
Graphics3D 関数を用いると単純な形状の 3D グラフィックスを表示することができる.
球を表示する.
8 110606handsout.nb
Graphics3D@Sphere@DD
円柱を表示する.
Graphics3D@8Cylinder@880, 0, 0<, 80, 0, 1<<, 2D<D
円錐を表示する.
110606handsout.nb 9
Graphics3D@8Cone@880, 0, 0<, 80, 0, 3<<, 2D<D
以下の結果を確かめてみよう(敢えて表示は隠している).
With@8n = 5<, Graphics3D@Table@Sphere@8i, j, k<, 0.5D, 8i, n<, 8j, n<, 8k, n<DDD
Graphics3D のオプションを指定することによって,設定を変化することができる.
Graphics3D のオプションはいかのとおり.
Options@Graphics3DD
8AlignmentPoint ® Center, AspectRatio ® Automatic, AutomaticImageSize ® False,Axes ® False, AxesEdge ® Automatic, AxesLabel ® None, AxesOrigin ® Automatic,AxesStyle ® 8<, Background ® None, BaselinePosition ® Automatic, BaseStyle ® 8<,Boxed ® True, BoxRatios ® Automatic, BoxStyle ® 8<, ColorOutput ® Automatic,ContentSelectable ® Automatic, ControllerLinking ® Automatic,ControllerMethod ® Automatic, ControllerPath ® Automatic,CoordinatesToolOptions ® Automatic, DisplayFunction ¦ $DisplayFunction,Epilog ® 8<, FaceGrids ® None, FaceGridsStyle ® 8<, FormatType ¦ TraditionalForm,ImageMargins ® 0., ImagePadding ® All, ImageSize ® Automatic,LabelStyle ® 8<, Lighting ® Automatic, Method ® Automatic, PlotLabel ® None,PlotRange ® All, PlotRangePadding ® Automatic, PlotRegion ® Automatic,PreserveImageOptions ® Automatic, Prolog ® 8<, RotationAction ® Fit,SphericalRegion ® False, Ticks ® Automatic, TicksStyle ® 8<, ViewAngle ® Automatic,ViewCenter ® Automatic, ViewMatrix ® Automatic, ViewPoint ® 81.3, -2.4, 2.<,ViewRange ® All, ViewVector ® Automatic, ViewVertical ® 80, 0, 1<<
Graphics3D にオプションを設定する.矢印は “ -“ と “ >” を続けて入力する.
10 110606handsout.nb
Graphics3D@8Cone@880, 0, 0<, 80, 0, 3<<, 2D<, Background ® BlackD
外枠を消す.
Graphics3D@8Cone@880, 0, 0<, 80, 0, 3<<, 2D<, Background ® Black, Boxed ® FalseD
Graphics3D@8Cone@880, 0, 0<, 80, 0, 3<<, 2D<, Background ® Black, Boxed ® FalseD
視点を変更する.
110606handsout.nb 11
Graphics3D@8Cone@880, 0, 0<, 80, 0, 3<<, 2D<,Background ® Black, Boxed ® False, ViewVertical ® 81, 0, 0<D
重力の向き(下向きの方向)を指定する.
12 110606handsout.nb
Graphics3D@8Cone@880, 0, 0<, 80, 0, 3<<, 2D<, Background ® Black,Boxed ® False, ViewPoint ® 80, 1, 0<, ViewVertical ® 81, 0, 0<D
� GraphixComplex
GraphicsComplex は,用いる点のリストを第一引数に与え,形状を指定する第二引数では頂点の代わりに番号を指定する.
Graphics3D@GraphicsComplex@880, 0, 0<, 81, 0, 0<, 82, 0, 0<<,8Cone@82, 1<, 0.5D, Cylinder@82, 3<, 0.3D<DD
演習問題
A. 上の例を参考に「3次元おでん」をつくりなさい.凝る人は串も入れること.
110606handsout.nb 13
演習問題
A. 上の例を参考に「3次元おでん」をつくりなさい.凝る人は串も入れること.
� アニメーション
アニメーションはパラパラ漫画をつくることと同じである.そこで,画像のリストを作成する.以下はアニメ用
画像リストの例.ただし,コマの数を3にした.
Table@Graphics3D@Sphere@80, 0, Sin@tD<, 0.1D,PlotRange ® 88-1.5, 1.5<, 8-1.5, 1.5<, 8-1.5, 1.5<<D, 8t, 0, 1, 0.5<D
: ,
,
>
14 110606handsout.nb
,
>
作成した画像のリストを ListAnimate を用いて連続表示する.今度はコマの数が20個になっている.
ListAnimate@Table@Graphics3D@Sphere@80, 0, Sin@tD<, 0.1D,PlotRange ® 88-1.5, 1.5<, 8-1.5, 1.5<, 8-1.5, 1.5<<D, 8t, 0, 2 Pi, 0.1 Pi<DD
以下は別の例.
ListAnimate@Table@Graphics3D@Sphere@8Cos@tD, Sin@2 tD, Sin@t � 3D<, 0.1D, PlotRange ®
88-1.5, 1.5<, 8-1.5, 1.5<, 8-1.5, 1.5<<, Background ® Black D, 8t, 0, 4 Pi , 0.1 Pi<DD
演習問題
A. 上で検討した微分方程式の解をアニメーションで表現する方法を考えなさい.
第二週(コマの運動のシミュレーション)
課題について
110606handsout.nb 15
Recommended