- import os
- import strutils
- let params = commandLineParams()
- let n = parseInt(params[1])
- let h = parseFloat(params[2])
- let steps = parseInt(params[3])
- var x0 = parseFloat(params[4])
- var y0 = parseFloat(params[5])
- var z0 = parseFloat(params[6])
- let sigma = parseFloat(params[7])
- let rho = parseFloat(params[8])
- let beta = parseFloat(params[9]) / parseFloat(params[10])
- var x = newSeq[float64](n + 1)
- var y = newSeq[float64](n + 1)
- var z = newSeq[float64](n + 1)
- proc t_horner (j: openArray[float64], h: float64): float64 =
- for i in countdown(j.len - 1, 0):
- result = result * h + j[i]
- proc t_prod (u, v: openArray[float64], k: int): float64 =
- for j in 0..k:
- result += u[j] * v[k - j]
- echo(x0, ' ', y0, ' ', z0, ' ', 0.0)
- for step in 1..steps+1:
- x[0] = x0
- y[0] = y0
- z[0] = z0
- for k in 0..n-1:
- x[k + 1] = sigma * (y[k] - x[k]) / float64(k + 1)
- y[k + 1] = (rho * x[k] - y[k] - t_prod(x, z, k)) / float64(k + 1)
- z[k + 1] = (t_prod(x, y, k) - beta * z[k]) / float64(k + 1)
- x0 = t_horner(x, h)
- y0 = t_horner(y, h)
- z0 = t_horner(z, h)
- 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