From 62d0cebb97b1257aeada5f386e99c9e288acd82d Mon Sep 17 00:00:00 2001 From: Amaras Date: Fri, 13 Nov 2020 00:08:29 +0100 Subject: [PATCH] Forward Euler method, version 2.2: as functional as I could make it (for now) --- .../code/coconut/euler.coco | 17 +++++++++-------- .../forward_euler_method.md | 2 ++ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/contents/forward_euler_method/code/coconut/euler.coco b/contents/forward_euler_method/code/coconut/euler.coco index 2ffe29647..7297e9c51 100644 --- a/contents/forward_euler_method/code/coconut/euler.coco +++ b/contents/forward_euler_method/code/coconut/euler.coco @@ -1,18 +1,19 @@ import math def forward_euler(time_step, n): - y = 1 - for _ in range(n): - yield y - y *= (1 - 3 * time_step) + factors = [1] + [1 - 3 * time_step] * (n-1) + # We want all the cumulative values, thus the use of scan + return scan((*), factors) + def check(result, threshold, time_step): approx = True - for i, y in enumerate(result): - solution = math.exp(-3 * i * time_step) - if not math.isclose(y, solution, abs_tol=threshold): - print(y, solution) + # A scan object has a len if the underlying iterable has a len + solution = range(len(result)) |> map$(i -> math.exp(-3*i*time_step)) + for y, sol in zip(result, solution): + if not math.isclose(y, sol, abs_tol=threshold): + print(y, sol) approx = False return approx diff --git a/contents/forward_euler_method/forward_euler_method.md b/contents/forward_euler_method/forward_euler_method.md index dfb185431..3547deb1c 100644 --- a/contents/forward_euler_method/forward_euler_method.md +++ b/contents/forward_euler_method/forward_euler_method.md @@ -146,6 +146,8 @@ Full code for the visualization follows: [import, lang:"nim"](code/nim/forwardeuler.nim) {% sample lang="lisp" %} [import, lang="lisp"](code/clisp/euler.lisp) +{%sample lang="coco" %} +[import, lang:"coconut"](code/coconut/euler.coco) {% endmethod %}