Caution
|
This is a port of the original reference manual for scmutils over to
Clojure and the SICMUtils API. The goal here is to host an annotated version of
the original refman.txt , highlighting any difference in functionality,
behavior and naming so that folks can transition between the systems. The code
here assumes that you’re working at a REPL initialized to the the
sicmutils.env namespace.
|
(define ((replace-differential-tag oldtag newtag) object) | |
(cond ((differential? object) | |
(terms->differential | |
(map (lambda (term) | |
(let ((terms (differential-tags term))) | |
(cond ((and (memv oldtag terms) | |
(memv newtag terms)) | |
(make-differential-term | |
(remove-differential-tag newtag (remove-differential-tag oldtag terms)) | |
:zero)) |
;; Here is the smoking gun... | |
(define (f x) | |
(lambda (cont) | |
(cont (lambda (y) (* x y)) | |
(lambda (g) (g x))))) | |
;; (D f) is: | |
(lambda (cont) |
(ns sicmutils.sci | |
(:require [sicmutils.env :as env] | |
[sci.core :as sci])) | |
(defn ns-bindings | |
"Returns a pair of | |
- `(ns-publics sym)` fn entries | |
- `(ns-publics sym)` macro entries" | |
[sym] |
- we have a great documentation site now! cljdoc now hosts a full port of the original scmutils reference manual. All code snippets in the ported refman now work. I've also distributed many of the sections in the reference manual into more topically organized sections in the cljdoc site, so give those a browse and keep your eye out for more expansion there.
Okay, on to the beefy changelog.
A quick note: After the work below,
v/nullity?
renamed tov/zero?
, andv/unity?
renamed tov/one?
#180. This affects the names listed in the CHANGELOG entries below.
This release brings us closer to the interface provided by scmutils
.
(defn adaptive | |
"Accepts two 'integrator' functions of: | |
- `f`: some integrand | |
- `a` and `b`: the lower and upper endpoints of integration | |
- `opts`, a dictionary of configuration options | |
And returns a new function of the same signature that adaptively subdivides | |
the region $a, b$ into intervals if integration fails to converge." | |
([integrator] (adaptive integrator integrator)) |
(ns sicmutils.numerical.minimize | |
"Implementations of minimization algorithms for single and multiple dimensions." | |
(:require [sicmutils.util :as u] | |
[sicmutils.util.stopwatch :as us] | |
[taoensso.timbre :as log]) | |
#?(:clj | |
(:import (org.apache.commons.math3.optim.univariate | |
BrentOptimizer | |
UnivariateObjectiveFunction | |
SearchInterval |
This is one of the more important exercises in the chapter. The problem asks for a proof that it's possible to absorb a coordinate transformation directly into the Lagrangian. If you can do this, you can express your paths and your forces in whatever coordinates you like, so long as you can transition between them.
I also found that this exposed, and repaired, my weakness with the functional notation that Sussman and Wisdom have used in the book.
The problem states:
Show by direct calculation that the Lagrange equations for
$L'$ are satisfied if the Lagrange equations for$L$ are satisfied.
This is one of the more important exercises in the chapter. The problem asks for a proof that it's possible to absorb a coordinate transformation directly into the Lagrangian. If you can do this, you can express your paths and your forces in whatever coordinates you like, so long as you can transition between them.
I also found that this exposed, and repaired, my weakness with the functional notation that Sussman and Wisdom have used in the book.
The problem states:
Show by direct calculation that the Lagrange equations for
$L'$ are satisfied if the Lagrange equations for$L$ are satisfied.
(deftest bigint-repro | |
(testing "[No method in multimethod 'sicmutils.generic/div' for dispatch value: [#object[Number] :sicmutils.polynomial/polynomial]]" | |
(hermetic-simplify-fixture | |
(fn [] | |
(sicmutils.generic/simplify | |
(* 0.5 | |
(/ 1 (* 2 'x))))))) | |
(testing "TypeError: Cannot mix BigInt and other types, use explicit conversions" | |
(* 0.5 (u/bigint 2)) |