1. import os
  2. import strutils
  3. let params = commandLineParams()
  4. let n = parseInt(params[1])
  5. let h = parseFloat(params[2])
  6. let steps = parseInt(params[3])
  7. var x0 = parseFloat(params[4])
  8. var y0 = parseFloat(params[5])
  9. var z0 = parseFloat(params[6])
  10. let sigma = parseFloat(params[7])
  11. let rho = parseFloat(params[8])
  12. let beta = parseFloat(params[9]) / parseFloat(params[10])
  13. var x = newSeq[float64](n + 1)
  14. var y = newSeq[float64](n + 1)
  15. var z = newSeq[float64](n + 1)
  16. proc t_horner (j: openArray[float64], h: float64): float64 =
  17. for i in countdown(j.len - 1, 0):
  18. result = result * h + j[i]
  19. proc t_prod (u, v: openArray[float64], k: int): float64 =
  20. for j in 0..k:
  21. result += u[j] * v[k - j]
  22. echo(x0, ' ', y0, ' ', z0, ' ', 0.0)
  23. for step in 1..steps+1:
  24. x[0] = x0
  25. y[0] = y0
  26. z[0] = z0
  27. for k in 0..n-1:
  28. x[k + 1] = sigma * (y[k] - x[k]) / float64(k + 1)
  29. y[k + 1] = (rho * x[k] - y[k] - t_prod(x, z, k)) / float64(k + 1)
  30. z[k + 1] = (t_prod(x, y, k) - beta * z[k]) / float64(k + 1)
  31. x0 = t_horner(x, h)
  32. y0 = t_horner(y, h)
  33. z0 = t_horner(z, h)
  34. echo(x0, ' ', y0, ' ', z0, ' ', float64(step) * h)

Lorenz ODE Solver

nim compile --run test.nim 16 10 .01 10 -15.8 -17.48 35.64 10 28 8 3