#author("2017-09-24T13:26:47+09:00","default:takataka","takataka")
#author("2017-09-30T18:11:51+09:00","default:takataka","takataka")
*SJS2017 ex02 [#f69bd8f1]

課題いっぱいありますが,1回で全部終わらせようという意図ではありません.
自分で進められるひとはどんどん先へ進めたらよいですが.

#contents
**前回分と今回分 [#kbc5dcd1]

- できたひとは,課題ごとに高橋に報告してください.それぞれのプログラムを実行すると何がどうなっているのか説明できるようにしておいてください.
- 前回分を全て報告してokをもらってから,今回分にすすみましょう.

**準備 [#fd499a5f]

**課題A [#w83b99ab]
次のようにして,Jupyter Notebook を使えるようにしよう.
+ jupyter をインストール
 $ sudo port install pyXY-jupyter
+ このままだと,Jupyter のコマンドが
 $ jupyter-X.Y
という感じになっていやんなので,~/.bashrc に alias を追加.例えばこんな感じ
 alias jupyter="jupyter-3.5"
 alias jupyternb="jupyter-notebook-3.5"
+ 次のようにして設定を読み込ませるか,新しいシェルを開く
 $ source  ~/.bash_profile

Python で関数
上記ができたら,次のようにして今日の課題の notebook を開いてみよう
+ 適当な場所に適当な名前のディレクトリを作成し,そこへ移動
+ jupyter を実行
 $ jupyter notebook   (かわりに jupyternb でもよい)
+ 以下の ex02A.ipynb をダウンロードしてこのディレクトリへ移動
+ jupyter のウィンドウ内右側の「くるくる」な感じのボタンを押して,ファイルリストを更新
+ 上記のファイルが見えるはずなので,クリックして開く
+ 「課題A-1」の下のセルをクリックして,Shift-Enter を押してみる
+ いろいろいじって遊ぶ

***課題A-1 [#w2aaa57d]
**課題A [#y11d0b49]

- 以下のプログラムを実行し,何が起こっているのか理解しなさい.コメント行になっているところは,コメントをはずして実行するとエラーが出ます.どんなエラーが出るのか試してみよう.なぜエラーになるのか考えよう.
&gist(0799e2d829638ac201ed364475449555);

#pre{{
def func1(x):
**課題B [#x27232d1]

    x = 3
    print(x)
&gist(54686c05e5954b8dde34a4e0d1a35ffa);

**課題C [#l302a8a5]

def func2(x):
&gist(8dd1a669924ac346e54aead360101474);

    return x + 1


def func3(x):

    x[0] = 'hoge'
    x.append('fuga')
    print(x)


if __name__ == '__main__':

    y = [ 1, 'a', [ 10, 20, 30 ], -1 ]
    z = 999

    func1(y)
    print('y = ', y)
    func1(z)
    print('z = ', z)
    
    #yy = func2(y)     # ERROR!
    #print('yy = ', yy)
    zz = func2(z)
    print('zz = ', zz)

    func3(y)
    print('y = ', y)
    #func3(z)       # ERROR!
    #print('z = ', z)
    
}}

***課題A-2 [#cab595df]

上記に次の関数定義を追加しよう.
#pre{{
def func4(x, a = 999, msg = 'hogege'):

    print(msg, x + a)
}}
そして,次のように呼び出してみよう.
#pre{{

    func4(1)
    func4(1, a = 0)
    func4(2, msg = 'nyanya')
    func4(3, msg = 'nyanya', a = -2)
    #func4(a = 999, 4)   #ERROR!
}}
ここで登場しているのは,「キーワード引数」というものである.詳しくは書籍等を参照.キーワード引数は順序を気にしなくてよい(最後の例のような場合はNG).

**課題B [#q4781790]

モジュールと import

***課題B-1 [#kdcf8ccd]

課題Aのプログラムを hoge.py という名前で保存していたとする.このとき,同じディレクトリ内に次の内容のプログラム fuga.py を作成し,実行してみよう.

#pre{{
import hoge

def func1():

    print('Hoge?')


if __name__ == '__main__':

    func1()
    hoge.func1(999)
    hoge.func3( [ 1, 'a', [ 10, 20, 30 ], -1 ] )
}}


***課題B-2 [#t153f07d]

hoge.py の最初の方に1行追加して
#pre{{
hogefuga = { 1:'Hoge', 2:'Fuga', 3:'Hena' } 

def func1(x):
   :
}}
のようにすると,「モジュール名.変数名」という形でこの変数 hogefuga を次のように fuga.py の方から参照できる.
#pre{{
    for i in range(1, 4):
        print(i, hoge.hogefuga[i])
}}


ただし,ipython 上で %run fuga.py のように実行している場合,そのままでは hoge.py の修正が再読込されないので,次のようにしてやる必要がある.
#pre{{
In [20]: reload(hoge)
Out[20]: <module 'hoge' from 'hoge.py'>
In [21]: %run fuga.py
}}
***課題B-3 [#fa0e0753]

fuga.py 中の import 文を
 import hoge as nya
と書き換えたら,main の方はどう修正したらよいだろう?

**課題C [#r2dad673]

NumPy 入門

#pre{{
import numpy as np

A = np.array( [ [ 1, 2, 3 ], [ 4, 5, 6 ] ] )
print(A)
print(A.shape, A.dtype)
print()

B = np.array( [ [ 1, 2, np.pi ], [ 4, 5, 6 ] ] )
print(B) 
print(B.shape, B.dtype)
print()

A[0,1] = np.exp(1)
B[0,1] = np.exp(1)
print(A)
print(B)
print()

print(B**2)
print(np.log(B))
print()

C = A + B
print(C, C.shape, C.dtype)
print()

vec = np.arange( 1, 21 )
print(vec, vec.shape, vec.dtype)
print()

mat = np.reshape( vec, ( 4, 5 ) )
print(mat, mat.shape)
print()
print(mat.T, mat.T.shape)
print()

mat[1, 1] *= 111
print(mat)
print(vec)
print()

X = mat[:2,2:4]
print(X)
print()

Y = X - 2
print(Y)

Z = X * Y
print(Z)

Z = np.dot( X, Y )
print(Z)

}}

**課題D [#vcf9bde7]

**課題D [#xd0742f3]
[[PIP/2017]] 第12回講義資料の Q1 を NumPy を利用して解いてみよう.

***課題D-1 [#v3f2880f]
***課題D-1 [#s16ce9d7]

まずは手計算を併用して解いてみよう.式(7)を
&mathjax{ A\mathbf{x} = \mathbf{b} }; という形で表すことにする.

+ 2 x 2 行列 &mathjax{ A }; と 2 x 1 行列(2次元ベクトル) &mathjax{ \mathbf{b} }; を手計算で求めなさい
+ NumPy で,&mathjax{ A }; と &mathjax{ \mathbf{b} }; を与えて連立方程式 &mathjax{ A\mathbf{x} = \mathbf{b} };  の解 &mathjax{ \mathbf{x} }; を計算する方法を調べなさい
+ 実際に解 &mathjax{ \mathbf{x} }; すなわちパラメータ a, b の値を求め,連立方程式を手計算で解いた場合と同じになることを確認しなさい.
+ (課題D-2にて)実際に解 &mathjax{ \mathbf{x} }; すなわちパラメータ a, b の値を求め,連立方程式を手計算で解いた場合と同じになることを確認しなさい.

***課題D-2 [#m971fc4d]
***課題D-2 [#c4174322]

以下が何をやっているか理解し,これに連立方程式を解く部分を追加しなさい.
&gist(17be3cdc1fa5aece841ba2ca0418742a);

**おまけ [#x0bbdc7c]

上述の
 % autoreload 2

 import numpy as np
などを ipython / jupyter 起動のたびに実行するのは面倒くさい,というものぐささんは,
 ~/.ipython/profile_default/ipython_config.py
という設定ファイルを書いておくとよいでしょう.
#pre{{
import numpy as np
c = get_config()

xorg = np.array( [ 0.0, 4.0, 8.0, 20.0 ] )
yorg = np.array( [ 30.0, 31.0, 29.0, 28.0 ] )
c.InteractiveShellApp.extensions = [
    'autoreload'
]

xvec = xorg
yvec = yorg - yorg[0]

X = np.vstack( ( xvec, np.ones_like(xvec) ) )
print(X, X.shape)
Y = yvec
print(Y, Y.shape)

A = np.dot( X, X.T )
print(A)
b = np.dot( X, Y )
print(b)
c.InteractiveShellApp.exec_lines = [
    '% autoreload 2',
    'import numpy as np',
    'import scipy as sp',
]
}}


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS