【问题标题】:Why does my Runge-Kutta implementation oscillate to 0?为什么我的 Runge-Kutta 实现会振荡为 0?
【发布时间】:2014-03-11 17:20:25
【问题描述】:

我已经在 Haskell 中实现了 Runge-Kutta。但是,当在一个位置为 (0, 0, -10) 且速度为 (0, 0, 0) 的物体上运行时,它会非常快速地来回摆动,直到 到达 (0, 0, 0) 的位置。

出了什么问题?

(注意:我基于this resource 和*| 和|* 运算符分别将标量乘以向量和向量乘以标量来实现。

integrate :: PhysicalObject a => a -> Second -> Second -> (Position3, Velocity3)
integrate object t dt = (p, v)
  where p = (position object) + (dxdt |* dt)
        v = (velocity object) + (dvdt |* dt)
        dxdt = (1.0 / 6.0) *| (dx1 + (2 *| (dx2 + dx3)) + dx4)
        dvdt = (1.0 / 6.0) *| (dv1 + (2 *| (dv2 + dv3)) + dv4)
        (dx1, dv1) = (velocity object, acceleration (position object, velocity object) t)
        (dx2, dv2) = evaluate (position object, velocity object) t (0.5*dt) (dx1, dv1)
        (dx3, dv3) = evaluate (position object, velocity object) t (0.5*dt) (dx2, dv2)
        (dx4, dv4) = evaluate (position object, velocity object) t dt (dx3, dv3)

evaluate :: (Vec3 Double, Vec3 Double) -> Second -> Second -> (Vec3 Double, Vec3 Double) -> (Vec3 Double, Vec3 Double)
evaluate (ix, iv) t dt (dx, dv) = (odx, odv)
  where odx = sv
        odv = acceleration (sx, sv) (t + dt)
        sx  = ix + (dx |* dt)
        sv  = iv + (dv |* dt)

acceleration :: (Vec3 Double, Vec3 Double) -> Second -> Vec3 Double
acceleration (sx, sv) t =  (-k *| sx) - (b *| sv)
  where k = 10
        b = 1

【问题讨论】:

    标签: math haskell integration physics


    【解决方案1】:

    acceleration 函数在本例中为弹簧建模。

    我已经改成:

    acceleration :: (Vec3 Double, Vec3 Double) -> Second -> Vec3 Double
    acceleration (sx, sv) t =  sv
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多