Pythonで描くリサジュー図形
リサジュー図形(リサージュ図形)という図がありまして、それをPythonのmatplotlibを使って描いてみました。ついでにアニメーションしました。
目次
リサジュー図形とは
ウィキペディア から引用します。
互いに直交する二つの単振動を順序対として得られる点の軌跡が描く平面図形のこと。
振動する信号が2つあったとします。片方の信号をx成分に、もう片方の信号をy成分にした点をプロットします。その軌跡が描く図形をリサジュー図形と呼びます。リサージュ図形とも言います。
オシロスコープで経験する人が多いようですね。
Matplotlibを使ってリサジュー図形を描く
x座標とy座標をそれぞれ計算してプロットすれば良いので、プログラム自体は単純です。
ということで、アニメーションにしてみました。
次の3つの図形を描いてみます。
x = cos(theta), y = sin(theta + delta)
x = cos(theta), y = sin(b * theta)
x = cos(theta), y = sin(2 * theta + delta)
thetaは0から2πとし、deltaを0から2πまで変化させます。また、bも1から6まで変化させて、その後1まで戻します。
コードはこうしました。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
fig = plt.figure(figsize=(3,3))
theta = np.linspace(0, 2*np.pi, 201)
delta_theta = np.linspace(0, 2*np.pi, 201)
ims = []
b = 1.0
muki = True
for i in delta_theta:
x = np.cos(theta)
y1 = np.sin(theta + i)
y2 = np.sin(b*theta)
y3 = np.sin(2*theta + i)
im = plt.plot(x, y1, 'b', x, y2, 'g', x, y3, 'r')
ims.append(im)
if muki is True:
b = b + 0.05
if b > 6:
muki = False
else:
b = b - 0.05
ani = animation.ArtistAnimation(fig, ims, interval=30)
#plt.show()
ani.save('lissajous.gif', writer='imagemagick')
出力されるgifファイルは、このようになります。
公開日
広告