差分方程式


プログラム


  1. 差分化した運動方程式の実装

    def pm_step(y, x, vy, vx, stride):  # (x,y): 現在位置
                                        # (vx,vy): 現在の速度ベクトル
                                        # stride: 時間刻み幅 (Δt)
      g = 9.8   # 重力加速度
      x = x + vx * stride
      y = y + vy * stride
      vx = vx
      vy = vy - g * stride
      return [y, x, vy, vx]
    
  2. 一定時間の実行 (for)

    def parabolic_motion(y, x, vel_y, vel_x):
      stride = 0.3                       # 時間刻み幅(Δt)
      cur = [y, x, vel_y, vel_x]
      for i in range(0,100):             # 100ステップ実行
        cur = pm_step(cur[0], cur[1],
                      cur[2], cur[3], stride)
      return cur
    
  3. 一定時間の実行 (while)

    def parabolic_motion(y, x, vel_y, vel_x):
      stride = 0.3                      # 時間刻み幅(Δt)
      cur = [y, x, vel_y, vel_x]
      while (0 <= cur[0] < 100 and 
             0 <= cur[1] < 100):        # 0 <= x < 100, 0 <= y < 100 の間実行
        cur = pm_step(cur[0], cur[1], 
                      cur[2], cur[3], stride)
      return cur
    
  4. parabolic_motion の改変

    def parabolic_motion(y, x, vel_y, vel_x):
      stride = 0.3                      # 時間刻み幅 (Δt)
      cur = [y, x, vel_y, vel_x]
      result = []                       # 結果格納用
      while (0 <= cur[0] < 100 and 
             0 <= cur[1] < 100):
        result.append(cur)              # 現状を result に追加
        cur = pm_step(cur[0], cur[1], 
                      cur[2], cur[3], stride)
      return result
    
  5. 可視化の実現 (物体を円で表す場合)

    import ita
    
    def parabolic_motion_ball(y, x, vy, vx):
      res = parabolic_motion(y, x, vy, vx)   # シミュレーション結果を取得
      images = ita.array.make1d(len(res))    # 画像の配列を準備
      for i in range(0, len(res)):
        im = ita.array.make2d(100, 100)
        cur_y = 99 - round(res[i][0])        # 原点が左上なのでy座標を反転
        cur_x = round(res[i][1])
        draw_circle(im, cur_y, cur_x, 5, 1)  # その時刻の物体の座標に半径5の白い円を描く
        images[i] = im                       # 画像の配列に格納
      return images
    

2021年11月14日作成
伊知地 宏
Copyright (C) Hiroshi Ichiji, 2021. All rights reserved.