1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

2物体の運動とバタフライ効果について

1
Posted at

はじめに

この世界を記述するであろう物理法則は極めてシンプルで本質的なものであるが、それに従う物体の動きは複雑なものになり得る。これは、3体問題やカオス理論など枚挙にいとまがない。単純な微分方程式や系でさえも初期値が僅かに異なるだけで、将来の運動が全く異なるものになる場合がある。これは、バタフライ効果と呼ばれるもので、SF小説などの題材にもなっている。そこで、今回は、以下の記事のように放物面にボールを落下させた場合において落下させる位置が微妙に異なるとき、運動の様子はどう異なっていくのかを調査した。

放物線の焦点.gif

問題設定

$y=x^2$で表される曲面の上方の2点$(2,5),(2.1,5)$からボールを自由落下させる場合を考える。
この2つのボールの距離は初期状態では0.1とかなり小さいが時間経過とともにどのように変化するのか調査した。

プログラム

python parabola_ball2.py
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import japanize_matplotlib

# アニメを作る初期設定
fig = plt.figure()
ims = []
#重力加速度
g=9.8
#放物線面の広さ
x_0=np.linspace(-3,3,100)

#ボールを落とす座標
x_1=2
y_1=5
#初速度
v_x1=0
v_y1=0
#加速度
a_x=0
a_y=-g


#ボールを落とす座標
x_2=2.1
y_2=5
#初速度
v_x2=0
v_y2=0


t_ary=[]
l_ary=[]

#時間
t=0
#時間の刻み幅
delta_t=0.01
while(t<10):
  im=[]
  #ボールが放物面に衝突したら反射する。決して放物面の下に行ってはならない。
  if (x_1)**2>y_1:
    #放物線の接線ベクトル(1+2j*x_1)を基準平面として反射する。(完全弾性衝突とは、入射角と反射角が等しい反射と同じ現象である)
    theta1=np.angle((v_x1+1j*v_y1)/(1+2j*x_1))
    v1=(((-1-2j*x_1)/abs(-1-2j*x_1))/(np.cos(theta1)+1j*np.sin(theta1)))*(v_x1+1j*v_y1)
    #反射する方向は、必ずy軸側に向かうようにする。つまり放物線の内部でのみ反射を繰り返すものとする。
    if x_1>0:
      v_x1=-v1.real
      v_y1=v1.imag
    else:
      v_x1=v1.real
      v_y1=v1.imag
  #ボールの速度と位置の更新
  v_x1=v_x1+a_x*delta_t
  v_y1=v_y1+a_y*delta_t
  x_1=x_1+v_x1*delta_t
  y_1=y_1+v_y1*delta_t
  
  #ボールが放物面に衝突したら反射する。決して放物面の下に行ってはならない。
  if (x_2)**2>y_2:
    #放物線の接線ベクトル(1+2j*x_1)を基準平面として反射する。(完全弾性衝突とは、入射角と反射角が等しい反射と同じ現象である)
    theta2=np.angle((v_x2+1j*v_y2)/(1+2j*x_2))
    v2=(((-1-2j*x_2)/abs(-1-2j*x_2))/(np.cos(theta2)+1j*np.sin(theta2)))*(v_x2+1j*v_y2)
    #反射する方向は、必ずy軸側に向かうようにする。つまり放物線の内部でのみ反射を繰り返すものとする。
    if x_2>0:
      v_x2=-v2.real
      v_y2=v2.imag
    else:
      v_x2=v2.real
      v_y2=v2.imag
  #ボールの速度と位置の更新
  v_x2=v_x2+a_x*delta_t
  v_y2=v_y2+a_y*delta_t
  x_2=x_2+v_x2*delta_t
  y_2=y_2+v_y2*delta_t


  #放物面の描写
  im1=plt.plot(x_0,x_0**2,color="black")
  #ボールの描写
  im2=plt.plot(x_1,y_1,"o",color="red")
  
  #ボールの描写
  im3=plt.plot(x_2,y_2,"o",color="blue")
  ims.append(im1+im2+im3)
  
  l=((x_1-x_2)**2+(y_1-y_2)**2)**0.5 
  t_ary.append(t)
  l_ary.append(l)
  #時間の更新
  t=t+delta_t

# 複数枚のプロットを 20ms ごとに表示
ani = animation.ArtistAnimation(fig, ims, interval=20)
#保存
ani.save("放物線の焦点.gif", writer="pillow")
plt.close()

plt.plot(t_ary,l_ary)
plt.savefig("2点の距離の推移.png")
plt.close()

plt.hist(l_ary,bins=100)
plt.savefig("分布の様子.png")
plt.close()

結果

運動の様子

運動の様子は以下のgifファイルのようになった。

放物線の焦点.gif

この動画から分かるように、時間が経つにつれて2つのボールの運動の様子は劇的に異なっていく。

2点間距離の変化

ただ、2点間の距離について調査すると以下のグラフのようにある時期は振動的になった。

2点の距離の推移.png

これは、2つのボールは同じ微分方程式で叙述される運動をしていて、それらの運動は放物線で囲まれる限られた範囲に限られるからだと考えられる。

2点間距離の分布の様子

さらに、2点間距離についてヒストグラムで図示したところ以下のようになった。

分布の様子.png

筆者は、正規分布のようになると予想していたが、指数分布のようになった。
これは、距離が5周辺の値は図形的な制約により頻度が低いが、0付近のものは図形的な制約にあまり縛られないため頻度が高いためと考えられる。

まとめ

今回のように、同じ法則が成立する系でも初期値が微妙に異なるだけで、運動の様子が全く異なってしまう現象をバタフライ効果と呼ぶ。
ただ、バタフライ効果が見られる場合でもそれらの運動が完全に無関係なものとなるのかと言い切るのは難しい。なぜなら、今回の2つのボールの距離のように時間に対して周期性を持ったり指数分布のような振る舞いを示す可能性もあるからである。
しかし、今回の場合は、系の図形的制約による影響が大きいと考えられるため、図形的制約が少ない場合は2つの運動は無関係になり得るのかを調査したい。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?