Pythonからはじめる数学入門 - Chapter 2: Visualizing Data with Graphs を読む

Python からはじめる数学入門 (Doing Math with Python)まとめ記事)の第 2 章を読む。今回のテーマは matplotlib を利用したグラフの表示。

内容

  • 数直線
  • デカルト座標系
  • リスト
  • matplotlib
    • 折れ線グラフ
    • マーカー
    • Legend(凡例)
    • タイトルと軸ラベル
    • 軸の範囲の変更
  • 実例: ニュートン力学
    • 万有引力: 横軸は物体間の距離、縦軸は万有引力の強さ
    • Projectile Motion(放物運動)

Jupyter ノートブック

Projectile Motion(放物運動)

本では初速を変動させてるけど、より興味深い 角度の変動 に改造した。

import math


# Generate equally spaced floating point numbers between two given values
def f_range(start, final, increment):
    numbers = []

    while start < final:
        numbers.append(start)
        start += increment

    return numbers


def calc_trajectory(u, theta):
    g = 9.8

    theta = math.radians(theta)

    # Time of flight
    t_flight = 2 * u * math.sin(theta) / g
    # time intervals
    intervals = f_range(0, t_flight, 0.001)

    # List of x and y coordinates
    x = []
    y = []
    for t in intervals:
        x.append(u * math.cos(theta) * t)
        y.append(u * math.sin(theta) * t - 0.5 * g * (t ** 2))

    return (x, y)


def draw_graph():
    fig, ax = plt.subplots()

    ax.set_title("Projectile motion of a ball")
    ax.set_xlabel("x-coordinate (Distance)")
    ax.set_ylabel("y-coordinate (Height)")

    for angle in range(25, 75, 10):
        x, y = calc_trajectory(25, angle)
        ax.plot(x, y, label="Angle {0} deg".format(angle))

    ax.legend()
    plt.show()

    fig.savefig("chap2_visualizing-data-with-graphs_projectile-motion.png")


draw_graph()

上から順番に f_range() 関数は range() 関数の浮動小数点対応版。calc_trajectory() 関数は与えられた初速と角度に対する弾道を計算する。最後の draw_graph() 関数は、25 度から 75 度まで 10 度毎に弾道を計算してグラフ表示する。

Projectile motion of a ball

確かに 45 度で飛距離が最大になっている事が観察できる。

プログラミング・チャレンジ(章末問題)

  • #1: How Does the Temperature Vary During the Day?
  • #2: Exploring a Quadratic Function Visually
  • #3: Enhanced Projectile Trajectory Comparison Program → スキップ
  • #4: Visualizing Your Expenses
    • 歩数の曜日ごとの棒グラフを描画
      • 横の棒グラフは Axes.barh(y, width) メソッドで描く
        • 引数 y数量 でなければならない
      • ポイント: 縦軸に曜日のリストを表示する方法
        • barh() メソッドの y には、等差数列(等間隔に増加する数) のリストを渡す
        • Axes.ytics() メソッドで、曜日 のリストを渡す
    • Jupyter ノートブック
    • 支出の可視化 → スキップ
  • #5: Exploring the Relationship Between the Fibonacci Sequence and the Golden Ratio
    • フィボナッチ数列の隣り合う二項の比が黄金比に収束する様子を可視化
    • フィボナッチ数列のリストを生成する fib 関数は与えられている
    • → Python の 内包表記 が便利だと悦に入る
      • ratio = [n / m for m, n in zip(fibo_seq, fibo_seq[1:])]
    • Jupyter ノートブック

Ratio between consecutive Fibonacci numbers

破線は黄金比。結構速く収束することが分かる。


Chapter 3 のまとめ「Python からはじめる数学入門 - Chapter 3: Describing Data with Statistics を読む)」を公開しました!記述統計学の入門編と言える内容です。