カテナリー曲線のグラフを描きます

カテナリー曲線のグラフを描きます

カテナリー曲線 (catenary) の方程式

 紐の両端を水平な位置で固定して吊り下げると、紐はカテナリー曲線 (catenary) とよばれる形になります。catenary という単語はラテン語の catena (鎖) に由来します。日本語では懸垂線(けんすいせん)とよばれることもあります。カテナリー曲線は $a$ をパラメータとして
 
\[y=\frac{a(e^{x/a}+e^{-x/a})}{2}\]
という方程式で表されます。双曲線関数
 
\[\mathrm{cosh}x=\frac{e^{x}+e^{-x}}{2}\]
を用いて
 
\[y=a\mathrm{cosh}\left(\frac{x}{a}\right)\]
と表すこともできます。
 

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

中古価格
¥2,818から
(2019/7/30 20:24時点)

カテナリー曲線 (catenary) を描きます

 Matplotlib.pyplot を使って、カテナリー曲線 (catenary) のグラフを描いてみます。パラメータ $a$ はユーザーが入力できるようにします。

# https://python.atelierkobato.com/catenary/

# カテナリー(懸垂線)のグラフ

# モジュールをインポート
import numpy as np
import matplotlib.pyplot as plt

# フィギュアを設定
fig = plt.figure()

# グリッド線を表示
plt.style.use("ggplot")

# グラフ描画領域を追加
ax = fig.add_subplot(111)

# グラフタイトルを設定
ax.set_title("Catenary", fontsize = 16)

# x軸, y軸のラベルを設定
ax.set_xlabel("x", fontsize = 16)
ax.set_ylabel("y", fontsize = 16)

# aの値を入力
a = input("aの値を入力:")

# aを浮動小数点型に変換
a = float(a)

# -2~2まで0.1刻みのデータを用意
x = np.arange(-2, 2.1, 0.1)

# yのデータを用意
y = a*(np.exp(x/a)+np.exp(-x/a))/2

# y軸の範囲を0~4に設定
ax.set_ylim(0, 4)

# データをプロット
ax.plot(x, y)

# Axesの左上にテキストボックスを追加(位置は軸座標で指定)
ax.text(0.01, 0.1, "a = " + str(a),
color = "red", transform = ax.transAxes)

 このサンプルコードを実行すると、a の値を入力するように促されます。
 入力値に応じて次のようなグラフが描かれます。

 カテナリー曲線(懸垂線)のグラフ

 サンプルコードについて簡単に解説します。
 パラメータを入力してもらうために input関数を用いています:

# aの値を入力
a = input("aの値を入力:")

 
 input関数の戻り値は文字列なので、これを浮動小数点型に変換しておきます:

# aを浮動小数点型に変換
a = float(a)

 
 配列 x を用意します:

# -2~2まで0.1刻みのデータを用意
x = np.arange(-2, 2.1, 0.1)

 
 配列 x の各要素に対して、y の値を計算させます:

# yのデータを用意
y = a*(np.exp(x/a)+np.exp(x/a))/2

 
 今表示されている曲線のパラメータがわかるように、Axesオブジェクトにテキストボックスを追加して、そこに a の値を書き込んでおきます:

# Axesの左上にテキストボックスを追加(位置は軸座標で指定)
ax.text(0.01, 0.1, "a = " + str(a),
color = "red", transform = ax.transAxes)

 テキストボックスの位置は座標で指定しますが、デフォルト設定のままだと、データ座標を基準に位置が決定されます。transform 引数に ax.transAxes を渡すと、グラフが描画されている領域の幅を 1 とする Axes 座標を指定できます。