
PythonでのLorenz回転動画作成
PythonでのLorenz回転動画作成
Pythonを利用してLorenz回転動画を作成してみました。matplotlibで各フレームの画像を作成し、ffmpegで1分弱のMP4フォーマットに変換しています。ffmpegについては、pipではなく個別のインストールが必要となります。
サンプルソース
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation
import datetime
#------------------------------------------------------------------------------
# 変数設定
#------------------------------------------------------------------------------
#ローレンツ初期値
s=10
r=28
b=8/3
# 時間の設定
dt = 0.005
num_steps = 20000
# 描画領域設定
fig = plt.figure(figsize=(16,9), dpi=256)
ax = fig.add_subplot(projection='3d')
#------------------------------------------------------------------------------
# ローレンツ計算
#------------------------------------------------------------------------------
def lorenz(x, y, z):
x_dot = s*(y - x)
y_dot = r*x - y - x*z
z_dot = x*y - b*z
return x_dot, y_dot, z_dot
#------------------------------------------------------------------------------
# ローレンツ描画
#------------------------------------------------------------------------------
def lorenzView():
# 空配列生成
xs = np.empty(num_steps + 1)
ys = np.empty(num_steps + 1)
zs = np.empty(num_steps + 1)
# 初期条件
xs[0]=1
ys[0]=1
zs[0]=1
# 点列の座標生成
for i in range(num_steps):
x_dot, y_dot, z_dot = lorenz(xs[i], ys[i], zs[i])
xs[i + 1] = xs[i] + (x_dot * dt)
ys[i + 1] = ys[i] + (y_dot * dt)
zs[i + 1] = zs[i] + (z_dot * dt)
# 座標軸設定
ax.view_init(elev=20, azim=110)
ax.set_xlabel("x axis", size=12)
ax.set_ylabel("y axis", size=12)
ax.set_zlabel("z axis", size=12)
ax.set_title("Lorenz", size=12)
# プロット設定
ax.plot(xs, ys, zs, lw=0.3)
ax.set_box_aspect((1,1,1))
plt.subplots_adjust(left=0, right=1, bottom=0, top=1)
#------------------------------------------------------------------------------
# アニメーション描画
#------------------------------------------------------------------------------
def animate(i):
ax.view_init(elev=30., azim=-60 +3.6*i)
return fig,
#------------------------------------------------------------------------------
#メイン関数
#------------------------------------------------------------------------------
def main():
#--------------------------------
#開始メッセージ
#--------------------------------
print("描画開始")
dt_now = datetime.datetime.now()
print(dt_now)
#--------------------------------
#ローレンツ描画
#--------------------------------
lorenzView()
#--------------------------------
#回転アニメーション描画
#--------------------------------
ani = animation.FuncAnimation(fig, animate,frames=400, interval=150, blit=True)
ani.save('rotate_lorenz.mp4', writer="ffmpeg",dpi=256)
#--------------------------------
#終了メッセージ
#--------------------------------
print("描画終了")
dt_now = datetime.datetime.now()
print(dt_now)
if __name__ == "__main__":
main()
ソースの解析
Lorenzの座標を計算します。
#------------------------------------------------------------------------------
# ローレンツ計算
#------------------------------------------------------------------------------
def lorenz(x, y, z):
x_dot = s*(y - x)
y_dot = r*x - y - x*z
z_dot = x*y - b*z
return x_dot, y_dot, z_dot
Lorenzの描画を行います。
#------------------------------------------------------------------------------
# ローレンツ描画
#------------------------------------------------------------------------------
def lorenzView():
# 空配列生成
xs = np.empty(num_steps + 1)
ys = np.empty(num_steps + 1)
zs = np.empty(num_steps + 1)
# 初期条件
xs[0]=1
ys[0]=1
zs[0]=1
# 点列の座標生成
for i in range(num_steps):
x_dot, y_dot, z_dot = lorenz(xs[i], ys[i], zs[i])
xs[i + 1] = xs[i] + (x_dot * dt)
ys[i + 1] = ys[i] + (y_dot * dt)
zs[i + 1] = zs[i] + (z_dot * dt)
# 座標軸設定
ax.view_init(elev=20, azim=110)
ax.set_xlabel("x axis", size=12)
ax.set_ylabel("y axis", size=12)
ax.set_zlabel("z axis", size=12)
ax.set_title("Lorenz", size=12)
# プロット設定
ax.plot(xs, ys, zs, lw=0.3)
ax.set_box_aspect((1,1,1))
plt.subplots_adjust(left=0, right=1, bottom=0, top=1)
フレーム毎に回転位置を変更させます。
#------------------------------------------------------------------------------
# アニメーション描画
#------------------------------------------------------------------------------
def animate(i):
ax.view_init(elev=30., azim=-60 +3.6*i)
return fig,
Lorenzの描画から回転までのアニメーションを作成します。
#------------------------------------------------------------------------------
#メイン関数
#------------------------------------------------------------------------------
def main():
#--------------------------------
#開始メッセージ
#--------------------------------
print("描画開始")
dt_now = datetime.datetime.now()
print(dt_now)
#--------------------------------
#ローレンツ描画
#--------------------------------
lorenzView()
#--------------------------------
#回転アニメーション描画
#--------------------------------
ani = animation.FuncAnimation(fig, animate,frames=400, interval=150, blit=True)
ani.save('rotate_lorenz.mp4', writer="ffmpeg",dpi=256)
#--------------------------------
#終了メッセージ
#--------------------------------
print("描画終了")
dt_now = datetime.datetime.now()
print(dt_now)
作成画像
関連記事
最近の投稿
- Hello world!Welcome to WordPress. This is your first post. Edit or … 続きを読む »
- DaVinci Resolve インストール手順
- PythonでのLorenz回転動画作成PythonでのLorenz回転動画作成 Pythonを利用してLorenz回転動画を作成してみました。mat… 続きを読む »
- LaTexの数式エディタ texstudioのインストール手順概要 LaTexの数式エディタであるtexstudioのインストール手順をまとてみました。texstudioを… 続きを読む »
- 【数学 大学入試過去問題】回転移動行列の帰納法証明問題解説概要 回転移動行列の帰納法証明問題が大学入試で出題されていますので解説します。回転移動行列は、応用範囲が広いこ… 続きを読む »
過去の投稿
- 2025年2月 (1)
- 2023年2月 (2)
- 2023年1月 (6)
- 2022年12月 (3)
- 2022年11月 (6)
- 2022年10月 (3)
- 2022年9月 (2)
- 2022年7月 (3)
- 2022年6月 (1)
- 2022年5月 (1)
- 2022年4月 (3)
- 2022年3月 (1)
- 2022年2月 (4)
- 2021年12月 (1)
- 2021年11月 (1)
- 2021年10月 (2)
- 2021年8月 (4)
- 2021年7月 (1)
- 2021年6月 (3)
- 2021年5月 (2)
- 2021年4月 (2)
- 2021年3月 (6)
- 2020年12月 (2)
- 2020年10月 (4)
- 2020年9月 (2)
- 2020年8月 (4)
- 2020年7月 (4)
- 2020年6月 (8)
- 2020年4月 (2)
- 2020年3月 (1)
- 2019年10月 (2)
- 2019年4月 (2)
- 2018年11月 (1)
- 2018年9月 (2)
- 2018年6月 (1)
- 2018年4月 (6)
- 2018年3月 (6)
- 2018年2月 (5)
- 2018年1月 (8)
- 2017年12月 (4)
- 2017年10月 (3)
- 2017年9月 (2)
- 2017年6月 (5)
- 2017年5月 (8)
- 2017年4月 (3)
- 2017年3月 (9)
- 2017年2月 (1)
- 2017年1月 (8)
- 2016年12月 (4)
- 2016年11月 (6)
- 2016年7月 (1)
- 2016年6月 (4)
- 2016年5月 (2)
- 2016年4月 (1)
- 2016年3月 (2)
- 2015年7月 (1)
- 2005年7月 (1)