From 3e6111f8a41fea82a268557b40b0cdc981314816 Mon Sep 17 00:00:00 2001 From: c252 Date: Wed, 7 Nov 2018 20:01:20 -0500 Subject: [PATCH 1/3] added a nim implementation of the forward euler method --- .../code/nim/forwardeuler.nim | 32 +++++++++++++++++++ .../forward_euler_method.md | 2 ++ 2 files changed, 34 insertions(+) create mode 100644 contents/forward_euler_method/code/nim/forwardeuler.nim diff --git a/contents/forward_euler_method/code/nim/forwardeuler.nim b/contents/forward_euler_method/code/nim/forwardeuler.nim new file mode 100644 index 000000000..ba5fa0982 --- /dev/null +++ b/contents/forward_euler_method/code/nim/forwardeuler.nim @@ -0,0 +1,32 @@ +import math + +proc solve_euler(timestep: float, n:int): seq[float] = + var res = newSeq[float](n) + + res[0] = 1.0 + + for i in 1 .. n - 1: + res[i] = res[i - 1] - 3 * res[i - 1] * timestep + + return res + +proc check(res: seq[float], timestep, threshold: float): bool = + var approx: bool = true; + + for i in 0 .. len(res) - 1: + let solution: float = exp(-3.0 * float(i) * timestep) + if abs(res[i]) - solution > threshold: + echo res[i] + echo solution + approx = false + + return approx + +const + timestep: float = 0.1 + n: int = 100 + threshold: float = 0.1 + euler_result: seq[float] = solve_euler(timestep, n) + approx: bool = check(euler_result, threshold, timestep) + +echo approx \ No newline at end of file diff --git a/contents/forward_euler_method/forward_euler_method.md b/contents/forward_euler_method/forward_euler_method.md index 843e5adc7..0ae742526 100644 --- a/contents/forward_euler_method/forward_euler_method.md +++ b/contents/forward_euler_method/forward_euler_method.md @@ -132,6 +132,8 @@ Full code for the visualization follows: [import, lang:"asm-x64"](code/asm-x64/euler.s) {% sample lang="java" %} [import, lang:"java"](code/java/ForwardEuler.java) +{% sample lang="nim" %} +[import, lang:"nim"](code/nim/forwardeuler.nim) {% endmethod %}