diff --git a/contents/forward_euler_method/code/clisp/euler.lisp b/contents/forward_euler_method/code/clisp/euler.lisp new file mode 100644 index 000000000..04d7b6749 --- /dev/null +++ b/contents/forward_euler_method/code/clisp/euler.lisp @@ -0,0 +1,29 @@ +;;;; Forward euler implementation in Common Lisp + +(defun solve-euler (timestep n) + "Returns a function where y'(t) = -3t and y(0) = 0 using the forward euler method" + (loop + with result = (make-array n :initial-element 1) + for i from 1 upto (1- n) do + (setf (svref result i) (- (svref result (1- i)) (* 3 (svref result (1- i)) timestep))) + finally (return result))) + +(defun approximatep (result threshold timestep) + "Checks the result from the solve-euler function" + (loop + with approximatep = t + with solution = 0 + for i from 0 upto (1- (length result)) do + (setf solution (exp (* (- 3) i timestep))) + (when (> (- (svref result i) solution) threshold) + (setf approximatep nil) + (format t "~d ~d~%" (svref result i) solution)) + finally (return approximatep))) + +(defvar timestep 0.01) +(defvar n 100) ; number of steps +(defvar threshold 0.01) + +(defvar result (solve-euler timestep n)) +(defvar approximatep (approximatep result threshold timestep)) +(format t "~:[Value(s) not in threshold~;All values within threshold~]~%" approximatep) diff --git a/contents/forward_euler_method/forward_euler_method.md b/contents/forward_euler_method/forward_euler_method.md index 39a2f5821..d951ac14b 100644 --- a/contents/forward_euler_method/forward_euler_method.md +++ b/contents/forward_euler_method/forward_euler_method.md @@ -142,6 +142,8 @@ Full code for the visualization follows: [import, lang:"java"](code/java/ForwardEuler.java) {% sample lang="nim" %} [import, lang:"nim"](code/nim/forwardeuler.nim) +{% sample lang="lisp" %} +[import, lang="lisp"](code/clisp/euler.lisp) {% endmethod %}