レポート課題: pythonのモジュールと関数
PDFにして, manabaで提出すること。以下, 特に断っていない場合は, ipython3でコマンドを打っている状況を想定する。
(1) 今回学んだ, python入門の9~12に載っているレポート課題の全てに取り組むこと。
(2) A君は, eの3乗を求めようとして,
np.exp(3)
と打ったが,
NameErrNameError: name 'np' is not defined
というエラーが出てしまった。理由と解決策を述べよ。
(3) 1, 2, 3という3つの数の和を求めるのに, A君は, 以下のような試行錯誤をした:
[1, 2, 3].sum() np.array([1, 2, 3]).sum np.array([1, 2, 3]).sum()
すると, このうち1つしかうまくいかなかった。それはどれか? 他の2つがうまくいかなかったのはなぜか?
(4) A君は, 1, 2, 3という数をそれぞれ2乗して並べようとして
[1, 2, 3]**2
と打ったが,
TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'
というエラーが出てしまった。理由と解決策を述べよ。
(5) 指数関数e^xを0から1まで定積分すると, e-1=1.718...になることを解析的に示せ(python使わずに, 数学的に)。
(6) 前問をpythonを使って数値積分でやってみよう。以下の命令を打ち, それが前問に一致することを確認し, なぜ(どのように)この命令が数値積分になっているかを解釈して説明せよ(特に, 0, 1, 0.0001はそれぞれ何を意味する数かを述べること)。
np.exp(np.arange(0, 1, 0.0001)).sum()*0.0001
(7) 前問を応用して, ガウス関数exp(-x^2)の-∞から∞の積分が√πになることを数値積分で(近似的に)確認せよ。打った命令と結果の数値を√πと比べよ。
(8) numpyで階乗を計算する関数を見つけよ(検索するなり本見るなり人に聞くなり)。それを使って, 5!, 100!, 1000!をそれぞれ計算せよ。どのくらい大きな数まで階乗を計算できるだろうか?
(9) 以下のような関数hello()を作り(インデントに注意!), hello(3)をやってみよ。
def hello(n): for i in range(0, n): print("Hello!")
(10) 以下のような動作をする関数goodbye()を作り, 実行せよ。
In [ ]: goodbye("Arashi", 3) Goodbye, Arashi! Goodbye, Arashi! Goodbye, Arashi! In [ ]: goodbye("Amurochan", 2) Goodbye, Amurochan! Goodbye, Amurochan!
(11) 以下のコマンドは何をするコマンドか? 試して推測せよ。
np.random.rand(10)
(12) 以下のコマンドを打ち, 結果の図をレポートに貼り付けよ。エラーが出る場合はエラーが出なくなるまで工夫すること。
plt.scatter(np.random.rand(1000), np.random.rand(1000)) plt.show()
(13) 以下をやってみよ。これは酔歩(ランダムウォーク)のシミュレーションである。横軸が時間(ステップ数), 縦軸が出発点からの変位である。結果の図を添付し, それぞれの命令が何をやっているか, 説明せよ。
def suiho(n): x=[0] for i in range(0, n): x += [x[-1]+np.random.rand()-0.5] plt.plot(x) plt.show() suiho(100) suiho(10000)
(14) 前問を2次元版にしてみよう。以下をやってみよ。結果の図を添付し, それぞれの命令が何をやっているか, 説明せよ。
def suiho2(n): x=[0] y=[0] for i in range(0, n): x += [x[-1]+np.random.rand()-0.5] y += [y[-1]+np.random.rand()-0.5] plt.plot(x, y) plt.show() suiho2(100) suiho2(10000)
(15) 以下をやってみよ。これはロトカ・ヴォルテラ方程式を使った個体群動態のシミュレーションである。結果の図を添付し, それぞれの命令が何をやっているか, 説明せよ。
def LV(n, a, b, c, d, dt): x=[1] y=[0.2] dt=0.1 for i in range(0, n): nx = x[-1]+ (a*x[-1]+b*x[-1]*y[-1])*dt ny = y[-1]+ (c*y[-1]+d*x[-1]*y[-1])*dt x += [nx] y += [ny] plt.plot(x) plt.plot(y) plt.show() LV(500, 0.4, -0.9, -0.3, 0.5, 0.05)
注: += というのが,「足し算」ではないことに注意せよ(ならば何なのか!?)
(16) (pythonとは無関係) 0から9までの数字を, 半角と全角のぞれぞれで並べてレポートに載せよ。ファイル名に使うのはどちらが適しているか?
(17) 以下のチェックリストの各項目について, ○かXかで自分自身を評価せよ。
- pythonのモジュールとは何かを理解し, モジュールを使う方法を理解した。
- numpyモジュールがどういうものか, そしてnumpyモジュールのよくある短縮名は何か知っている。
- np.ndarrayとは何かを説明でき, それとリストとの違いを説明できる。
- np.arange関数は3つの引数をとることと, それぞれの引数の意味, そして最後のパラメータは省略できることを知っており, 説明できる。
- np.arange関数とnp.ndarrayのsum()メソッドを組み合わせて, 数値積分ができることを知っており, 実際にできる。
- pythonで関数を作るやりかたを知っており, 実際に作れる。
- グラフを描くときに使うモジュールとそのよくある短縮名を知っている。
- 散布図をpythonで描く方法を知っており, 実際にできる。
- (数学的な意味での)関数のグラフをpythonで描く方法を知っており, 実際にできる。
- 計算機で使える文字には半角文字と全角文字があることを知っている。特に, 半角スペースと全角スペースの違い, 半角英数文字と全角英数文字の違い, 漢字は全角文字しかないこと, などを知っている。
Keyword(s):
References:[レポート課題: pythonで行列計算・画像] [python入門]