Friday, July 13, 2018

MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第18回

MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第18回
オープンコースウエア 大学名:MIT
講座名:6.00 Introduction to Computer Science and Programming
講義日:2008年11月11日(火曜日) ― 第11週・1回目 (第10週・2回目の講義は休講でした)

担当教授:Prof. Guttag

全講義数:24コマ
各講義時間:60分

配信開始日:2009年8月19日
講義ビデオソース:Youtube
講義ビデオ収録時間:50分38秒
サブタイトル:有
ジャンル: プログラム出力結果の評価、ランダムウオークのデバッグ、Pylab、Numpy、図表やヒストグラムをプロットする方法

ビデオ画像品質5段階評価:4
(解像度が480pあり、コンピュータ画面に表示されたソースコードを比較的はっきりと読み取ることができます。)
ビデオ音声品質5段階評価:4


講義コメント:
今回18回目の講義は前回の講義でコーディングしたランダムウオークプログラムの精査およびデバックとなります。

基本シミュレーションのコーディングは、以下の3部からなっている。
その1. シミュレーションを1回だけ実行するインナーループ。
その2・ シミュレーションの試行回数を管理するループ。このループはその1のループを内蔵する。
その3. 計算および統計処理の(グラフィカル)表示

ランダムウオークプログラムの精査の部分は、前回さらっと流した以下のコード:
   f.getDrunk().move(f) 

f.getDrunk() は、インスタンス(つまりメソッドのインボケイション)であり、f.getDrunkとは区別されなければならない。
f.getDrunkは、この場合メソッドでインスタンスではない。
前回でコーディングしたプログラム、エラーメッセージが表示されることもなく無事に結果が出力されていました。
しかしその出力結果をよくよく見てみると、なんか変なことに気がつきました。
それは、100歩や200歩シミュレートした結果がどれも原点から4,5歩の距離しか離れていないのです。
これはどうもおかしいじゃないかということになって、プログラムをデバックすることになりました。
グダーグ教授のデバック作法の手順は:
  1. Find a really simple example that I know the answer
  2. Take only one step - we know the answer should be one
  3. Go half way in the middle of the program and print some intermediate value (total distance so far)
  4. Label axes and look
  5. Ask if answer makes sense
上記の手順に従ってデバッグしてみると、どうやら距離の平均値の求め方にバグがあったようです。
ほんの1行だけなのですが、手直しして再実行すると、前回の結果よりもっともらしい(?)結果が出力されました。



-------------------------------------------------

Lecture 18 Hand out 補助教材 ダウンロード

Lecture 18 ホームワーク ダウンロード
MIT 6.00 講座のプログラムも含んだ資料のダウンロード
-------------------------------------------------


-------------------------------------------------
講義で取り上げたPythonコードの例
注-1! あらかじめ PylabとNumpy という数学・計算用および図表表示モジュールをインストールしておく必要があります。
個別モジュールをダウンロードするには、ソースフォージ(SourceForge)のサイトから次の2つの小さいパッケージをダウンロードしてインストールします。
1. Numpy のパッケージ --> http://sourceforge.net/projects/numpy/files/NumPy/
   ダウンロードするパッケージは、numpy-1.5.1-win32-superpack-python2.6.exe
2. Pylab のパッケージ --> http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.0.1/
   ダウンロードするパッケージは、matplotlib-1.0.1.win32-py2.6.exe
注ー2! 前回のコードがデバックされています。

例-1 ソースコード


import math, random, pylab

class Location(object):
  def __init__(self, x, y):
    self.x = float(x)
    self.y = float(y)
  
  def move(self, xc, yc):
    return Location(self.x+float(xc), self.y+float(yc))
  def getCoords(self):
    return self.x, self.y
  def getDist(self, other):
    ox, oy = other.getCoords()
    xDist = self.x - ox
    yDist = self.y - oy
    return math.sqrt(xDist**2 + yDist**2)
class CompassPt(object):
  possibles = ('N', 'S', 'E', 'W')

  def __init__(self, pt):
    if pt in self.possibles: self.pt = pt
    else: raise ValueError('in CompassPt.__init__')
  
  def move(self, dist):
    if self.pt == 'N': return (0, dist)
    elif self.pt == 'S': return (0, -dist)
    elif self.pt == 'E': return (dist, 0)
    elif self.pt == 'W': return (-dist, 0)
    else: raise ValueError('in CompassPt.move')
  
class Field(object):
  
  def __init__(self, drunk, loc):
    self.drunk = drunk
    self.loc = loc
  
  def move(self, cp, dist):
    oldLoc = self.loc
    xc, yc = cp.move(dist)
    self.loc = oldLoc.move(xc, yc)
  
  def getLoc(self):
    return self.loc
  def getDrunk(self):
    return self.drunk
class Drunk(object):
  def __init__(self, name):
    self.name = name
  
  def move(self, field, time = 1):
    if field.getDrunk() != self:
      raise ValueError('Drunk.move called with drunk not in field')
    for i in range(time):
      pt = CompassPt(random.choice(CompassPt.possibles))
      field.move(pt, 1)
    
def performTrial(time, f):
  start = f.getLoc()
  distances = [0.0]
  for t in range(1, time + 1):
    f.getDrunk().move(f)
    newLoc = f.getLoc()
    distance = newLoc.getDist(start)
    distances.append(distance)
  return distances
drunk = Drunk('Homer Simpson')
for i in range(3):
  f = Field(drunk, Location(0, 0))
  distances = performTrial(500, f)
  pylab.plot(distances)

pylab.title('Homer\'s Random Walk')
pylab.xlabel('Time')
pylab.ylabel('Distance from Origin')
def performSim(time, numTrials):
  distLists = []
  for trial in range(numTrials):
    d = Drunk('Drunk' + str(trial))
    f = Field(d, Location(0, 0))
    distances = performTrial(time, f)
    distLists.append(distances)
  return distLists
def ansQuest(maxTime, numTrials):
  means = []
  distLists = performSim(maxTime, numTrials)
  for t in range(maxTime + 1):
    tot = 0.0
    for distL in distLists:
      tot += distL[t]
    means.append(tot/len(distLists))
  pylab.figure()
  pylab.plot(means)
  pylab.ylabel('distance')
  pylab.xlabel('time')
  pylab.title('Average Distance vs. Time (' + str(len(distLists)) + ' trials)')
 
ansQuest(500, 300)
pylab.show()


例-1の実行結果
エディタから実行してPython Shell に出力
Mit_600_18_1
「MIT_600_18_2.jpg」をダウンロード

出力した画像の元ファイルをダウンロードしてみる。
「Lec18_Homers_Random_Walk.svg」をダウンロード
「Lec18_Average_Dist_vs_Time.svg」をダウンロード

SVG(Scalable Vector Graphics)ファイル
--------------------------------------------------
例-2 ソースコード

from pylab import *
import random

# Plot - 1
plot([1,2,3,4])
plot([5,6,7,8])
# Plot - 2
plot([1,2,3,4], [1,4,9,16])
figure()
plot([1,2,3,4], [1,4,9,16], 'ro')
axis([0, 6, 0, 20])
title('Earnings')
xlabel('Days')
ylabel('Dollars')
figure()
# Plot - 3
xAxis = array([1,2,3,4])
print xAxis
test = arange(1,5)
print test
print test == xAxis
yAxis = xAxis**3
plot(xAxis, yAxis, 'ro')
# Plot - 4 Plots a histgram
figure()
vals = []
dieVals = [1,2,3,4,5,6]
for i in range(10000):
vals.append(random.choice(dieVals)+random.choice(dieVals))
hist(vals, bins=11)
show()

例-2 の実行結果
「Lec18_Plot_1.svg」をダウンロード
「Lec18_Plot_2-1.svg」をダウンロード
「Lec18_Plot_2-2.svg」をダウンロード
「Lec18_Plot_3.svg」をダウンロード
「Lec18_Plot_4.svg」をダウンロード


Python コードのHTML表示には、Dan CederholmのSimpleCodeを使用しています。
Python コードの入出力は、Python IDLE から行っています。
Python_idle_1_small


-------------------------------------------------

講座第18回のリーディングアサイメント

1. Random walks applet

2. Chapter 13 of Matplotlib/pylab reference
-------------------------------------------------

-------------------------------------------------

No comments:

Post a Comment

MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第2回

  MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第2回 オープンコースウエア 大学名:MIT 講座名:6.00 Introduction to Computer Science and Programming Download course material ...