『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

カテナリー曲線

カテナリー曲線

紐の両端を水平な位置で固定して吊り下げると、紐はカテナリー曲線とよばれる形になります。カテナリーを意味する英語 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)\]
と表すこともできます。
Matplotlib.pyplot を使って、カテナリー曲線 (catenary) のグラフを描いてみます。パラメータ $a$ はユーザーが入力できるようにします。

# Python_Matplotlib_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 座標を指定できます。

コメント