gear.scm 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191
  1. #| -*-Scheme-*-
  2. Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
  3. 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
  4. 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Massachusetts
  5. Institute of Technology
  6. This file is part of MIT/GNU Scheme.
  7. MIT/GNU Scheme is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2 of the License, or (at
  10. your option) any later version.
  11. MIT/GNU Scheme is distributed in the hope that it will be useful, but
  12. WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. General Public License for more details.
  15. You should have received a copy of the GNU General Public License
  16. along with MIT/GNU Scheme; if not, write to the Free Software
  17. Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,
  18. USA.
  19. |#
  20. ;;;; Gear integrators for stiff differential equations
  21. ;;; Assumption: all states have their time as the first component.
  22. #| For example:
  23. ((gear-advance-generator
  24. (lambda (x cont)
  25. (cont (vector 1.0 (vector-ref x 1))
  26. (array->matrix
  27. #(#(0.0 0.0) ;jacobian-dimension
  28. #(0.0 1.0)))))
  29. 2 ;simple dimension
  30. .000001) ;lte
  31. #(0.0 1.0) ;initial conditions
  32. 1.0 ;target advance
  33. 0.1 ;initial step
  34. 0.5 ;max step
  35. (lambda (ns dt h cont)
  36. (pp ns) ;print each new state
  37. (cont))
  38. (lambda (ns dt sdt)
  39. ;; assert ns = #(1.000... 2.718...)
  40. ;; assert dt = 1.000...
  41. (list ns dt sdt)))
  42. ((gear-advance-generator
  43. (lambda (x cont)
  44. (cont (vector 1.0 (vector-ref x 1))
  45. (array->matrix
  46. #(#(1.0))))) ;a 1X1 Jacobian
  47. '(2 1 2) ;clip out time
  48. .000001) ;lte
  49. #(0.0 1.0)
  50. 1.0
  51. 0.1
  52. 0.5
  53. (lambda (ns dt h cont)
  54. (pp ns)
  55. (cont))
  56. (lambda (ns dt sdt)
  57. ;; assert ns = #(1.000... 2.718...)
  58. ;; assert dt = 1.000...
  59. (list ns dt sdt)))
  60. ((gear-advance-generator
  61. (lambda (v cont)
  62. (let ((x (vector-ref v 1)) (y (vector-ref v 2)))
  63. (cont (vector 1.0 (- y) x)
  64. (array->matrix
  65. #(#( 0.0 -1.0 )
  66. #( 1.0 0.0 ) )))))
  67. '(3 1 3)
  68. 1e-6)
  69. #( 0.0 1.0 0.0 )
  70. 2pi
  71. .1
  72. 0.5
  73. (lambda (ns dt h cont)
  74. (pp ns)
  75. (cont))
  76. list)
  77. (define (circle state alpha predicted ctolerance succeed fail)
  78. (let ((t (vector-ref state 0))
  79. (b1 (vector-ref state 1))
  80. (b2 (vector-ref state 2))
  81. (gamma (/ 1 (+ 1 (* alpha alpha)))))
  82. (let ((beta (- (+ b2 (* alpha b1)))))
  83. (let ((x1 (* beta gamma))
  84. (x2 (+ b1 (* alpha beta gamma))))
  85. (succeed (vector (/ (- 1 t) alpha)
  86. x1
  87. x2
  88. (+ (square x1) (square x2)))
  89. 1)))))
  90. ((gear-advance-generator
  91. circle
  92. '(4 0 3) ;do not ignore time
  93. .000001 ;lte
  94. .0000001 ;convergence
  95. true) ;implicit
  96. #(0.0 1.0 0.0 1.0) ;initial conditions
  97. 2pi ;target advance
  98. 0.1 ;initial step
  99. 0.5 ;max step
  100. (lambda (ns dt h cont)
  101. (pp ns) ;print each new state
  102. (cont))
  103. (lambda (ns dt sdt)
  104. ;; assert ns = #(1.000... 2.718...)
  105. ;; assert dt = 1.000...
  106. (list ns dt sdt)))
  107. |#
  108. (define %numerics-ode-gear-dummy-1
  109. (add-integrator!
  110. 'gear
  111. (lambda (derivative-and-jacobian
  112. dimension
  113. lte-tolerance
  114. convergence-tolerance
  115. spice-mode?
  116. start-state
  117. step-required
  118. h-suggested
  119. max-h
  120. continue
  121. done)
  122. ((gear-advance-generator
  123. derivative-and-jacobian dimension lte-tolerance
  124. convergence-tolerance false spice-mode?)
  125. start-state
  126. step-required
  127. h-suggested
  128. max-h
  129. continue
  130. done))
  131. '(derivative-and-jacobian
  132. dimension
  133. lte-tolerance
  134. convergence-tolerance
  135. spice-mode?
  136. start-state
  137. step-required
  138. h-suggested
  139. max-h
  140. continue
  141. done)))
  142. (define %numerics-ode-gear-dummy-2
  143. (add-integrator!
  144. 'implicit-gear
  145. (lambda (generalized-corrector
  146. dimension
  147. lte-tolerance
  148. convergence-tolerance
  149. spice-mode?
  150. start-state
  151. step-required
  152. h-suggested
  153. max-h
  154. continue
  155. done)
  156. ((gear-advance-generator
  157. generalized-corrector dimension lte-tolerance
  158. convergence-tolerance true spice-mode?)
  159. start-state
  160. step-required
  161. h-suggested
  162. max-h
  163. continue
  164. done))
  165. '(generalized-corrector
  166. dimension
  167. lte-tolerance
  168. convergence-tolerance
  169. spice-mode?
  170. start-state
  171. step-required
  172. h-suggested
  173. max-h
  174. continue
  175. done)))
  176. (declare (usual-integrations))
  177. (define* (gear-advance-generator f&df dimension lte
  178. #:optional convergence-tolerance implicit? spice-mode?)
  179. (let* ((lte-measure (parse-error-measure lte))
  180. (convergence-tolerance
  181. (parse-error-measure lte *gear-fixed-point-margin*))
  182. (convergence-measure (parse-error-measure convergence-tolerance))
  183. (implicit? (if (default-object? implicit?) false implicit?))
  184. (spice-mode? (if (default-object? spice-mode?) false spice-mode?))
  185. (stepper
  186. (gear-integrator f&df
  187. lte-measure
  188. convergence-measure
  189. spice-mode?
  190. dimension
  191. implicit?)))
  192. (define (advance start-state step-required h-suggested max-h continue done)
  193. ;; done = (lambda (end-state step-achieved h-suggested) ... )
  194. ;; continue = (lambda (state step-achieved h-taken next)
  195. ;; ;; next = (lambda () ...)
  196. ;; )
  197. (let lp ((step-achieved 0.0)
  198. (states (list start-state))
  199. (fx
  200. (if implicit? 'ignore (f&df start-state (lambda (fx dfx) fx))))
  201. (h (min-step-size step-required h-suggested max-h))
  202. (order 1)
  203. (wins 1)
  204. (accum-error 0.0))
  205. (if advance-wallp?
  206. (pp `(advance: ,step-achieved ,(car states))))
  207. (continue (car states) step-achieved h
  208. (lambda ()
  209. (stepper states fx h order wins accum-error
  210. (lambda (step-obtained
  211. new-states
  212. nfx
  213. h-suggested
  214. order-suggested
  215. wins
  216. accum-error)
  217. (let ((nstep (+ step-achieved step-obtained)))
  218. (if (close-enuf? step-required
  219. nstep
  220. *independent-variable-tolerance*)
  221. (done (car new-states) nstep h-suggested)
  222. (lp nstep
  223. new-states
  224. nfx
  225. (min-step-size (- step-required nstep)
  226. h-suggested
  227. max-h)
  228. order-suggested
  229. wins
  230. accum-error)))))))))
  231. advance))
  232. (define* (gear-stepper-generator f&df dimension lte
  233. #:optional convergence-tolerance implicit? spice-mode?)
  234. (let ((gear-advancer
  235. (gear-advance-generator f&df dimension
  236. lte convergence-tolerance
  237. implicit? spice-mode?)))
  238. (define (gear-stepper state dt-requested continue)
  239. ;; continue = (lambda (new-state dt-obtained dt-suggested) ...)
  240. (gear-advancer state
  241. dt-requested
  242. (/ dt-requested 2.0)
  243. dt-requested
  244. (lambda (state step-achieved h-taken next)
  245. (next))
  246. continue))
  247. gear-stepper))
  248. #|
  249. ((gear-stepper-generator
  250. (lambda (x cont)
  251. (cont (vector 1.0 (vector-ref x 1))
  252. (array->matrix
  253. #(#(0.0 0.0) ;jacobian
  254. #(0.0 1.0)))))
  255. 2 ;simple dimension
  256. .000001) ;lte
  257. #(0.0 1.0) ;initial conditions
  258. 1.0 ;target advance
  259. 'foo ;ignored eps
  260. list)
  261. ;Value: (#(.9999999999999964 2.7182821316457484) 1. 2.7162473311300284e-2)
  262. |#
  263. (define (gear-integrator f&df
  264. lte-measure convergence-measure spice-mode? dimension
  265. implicit?)
  266. ;; lte = local-truncation-error tolerance
  267. (define gear-solve
  268. (gear-solve-maker f&df
  269. lte-measure convergence-measure dimension implicit?))
  270. (define gear-predict (gear-predict-maker dimension implicit?))
  271. (define (gear-step xs fx h k wins err-accum cont)
  272. ;; The gear stepper takes a set of xs.
  273. ;; It returns by calling a continuation
  274. ;; cont = (lambda (h nxs nfx newh newk nerr) ...)
  275. (wallp-pp gear-wallp? `(gear-step h= ,h k= ,k))
  276. (gear-predict xs h k
  277. (lambda (xp) ;predicted x
  278. (wallp-pp gear-wallp? `(gear-predict: ,xp))
  279. (gear-solve xs h k xp
  280. (lambda (xc nfx err niter) ;converged in NITER
  281. (wallp-pp gear-wallp?
  282. `(gear-solve: ,xc)
  283. `(err= ,err
  284. accum= ,err-accum
  285. niter= ,niter))
  286. (let ((naccum (+ err err-accum)))
  287. (gear-control err wins h k naccum niter spice-mode?
  288. (lambda (nh nk) ;good step
  289. (cont h (update-table xc xs)
  290. nfx nh nk (fix:+ wins 1) naccum))
  291. (lambda (nh nk) ;careful step
  292. (cont h (update-table xc xs)
  293. nfx nh nk 1 0.0))
  294. (lambda (nh nk) ;bad step
  295. (gear-step xs fx nh nk 0 0.0 cont)))))
  296. (lambda () ;failed to converge
  297. (gear-step xs
  298. fx
  299. (/ h *gear-fixed-point-failure-contraction*)
  300. (max (fix:- k 1) *gear-min-order*) ; was k
  301. 1
  302. 0.0
  303. cont))))))
  304. gear-step)
  305. (define (update-table new table)
  306. (if (fix:< (length table) *gear-max-order*)
  307. (cons new table)
  308. (cons new (reverse (cdr (reverse table))))))
  309. (define (gear-predict-maker dimension implicit?)
  310. (let ((clip-vector
  311. (if implicit?
  312. (vector-clipper dimension)
  313. (lambda (v) v))))
  314. (define (gear-predict xs h k cont)
  315. ;; continuation cont = (lambda (xp) ...)
  316. (let ((tn (vector-ref (car xs) 0)))
  317. (cont ((vector-ref lagrange-extrapolators k)
  318. (map clip-vector xs)
  319. (+ tn h)))))
  320. gear-predict))
  321. (define (gear-solve-maker f&df lte-measure convergence-measure dimension implicit?)
  322. (let ((clip-vector (vector-clipper dimension))
  323. (pad-vector (vector-padder dimension))
  324. (I (m:make-identity (J-dimension dimension))))
  325. (define (gear-solve xs h order xp succeed fail)
  326. (let* ((ts (map (lambda (v) (vector-ref v 0)) xs))
  327. (gear-coeffs ((vector-ref gear-correctors order) h ts))
  328. (alpha (car gear-coeffs))
  329. (alpha*I (scalar*matrix alpha I))
  330. (b
  331. (let lp ((i 1) (gc (cdr gear-coeffs)) (xs xs))
  332. (let ((x (clip-vector (car xs))))
  333. (if (fix:= i order)
  334. (scalar*vector (car gc) x)
  335. (vector+vector (scalar*vector (car gc) x)
  336. (lp (fix:+ i 1) (cdr gc) (cdr xs)))))))
  337. (last-fx 0.0))
  338. (vector-fixed-point-with-failure
  339. (lambda (x continue)
  340. ;; continue = (lambda (newx newfx) ...)
  341. (f&df x
  342. (lambda (fx dfx)
  343. (full-pivot-solve ; A*ds = b
  344. (matrix-matrix alpha*I dfx) ;A ; FBE: Dfx -> dfx
  345. (vector-vector (clip-vector fx) ;b
  346. (vector+vector (scalar*vector alpha
  347. (clip-vector x))
  348. b))
  349. (lambda (ds . rest) ;succeed
  350. (continue (vector+vector (pad-vector ds) x) fx))
  351. (lambda ()
  352. (wallp-pp gear-wallp? '(gear-solve: singular matrix))
  353. (fail))))))
  354. xp
  355. convergence-measure
  356. (lambda (x-corr last-fx niter)
  357. (let ((err (lte-measure x-corr xp)))
  358. (succeed x-corr last-fx err niter)))
  359. (lambda (last-x last-fx)
  360. (wallp-pp gear-wallp? '(gear-solve: did not converge))
  361. (fail)))))
  362. (define (implicit-gear-solve xs h order clipped-xp succeed fail)
  363. (let* ((ts (map (lambda (v) (vector-ref v 0)) xs))
  364. (gear-coeffs ((vector-ref gear-correctors order) h ts))
  365. (alpha (car gear-coeffs))
  366. (b
  367. (let lp ((i 1) (gc (cdr gear-coeffs)) (xs xs))
  368. (let ((x (clip-vector (car xs))))
  369. (if (fix:= i order)
  370. (scalar*vector (car gc) x)
  371. (vector+vector (scalar*vector (car gc) x)
  372. (lp (fix:+ i 1) (cdr gc) (cdr xs))))))))
  373. (f&df b alpha clipped-xp
  374. convergence-measure
  375. (lambda (x-corr count) ;assumes x-corr is bigger than clipped.
  376. (let ((err (lte-measure (clip-vector x-corr) clipped-xp)))
  377. (succeed x-corr 'ignore err count)))
  378. (lambda args
  379. (wallp-pp gear-wallp? '(gear-solve: did not converge))
  380. (fail)))))
  381. (if implicit? implicit-gear-solve gear-solve)))
  382. (define (gear-control err wins h k err-accum niter
  383. spice-mode good-step careful-step bad-step)
  384. ;; good-step = (lambda (nh nk) ...)
  385. ;; bad-step = (lambda (nh nk) ...)
  386. (cond (spice-mode
  387. (cond ((fix:> niter *spice-order-too-big*)
  388. (bad-step (spice-contract h niter)
  389. (max (fix:- k 1) *gear-min-order*)))
  390. ((fix:> niter *spice-step-too-big*)
  391. (bad-step (spice-contract h niter) k))
  392. ((fix:> niter *spice-good-step*)
  393. (careful-step (spice-contract h niter) k))
  394. ((fix:> niter *spice-step-too-small*)
  395. (good-step h k))
  396. ((fix:> niter *spice-order-too-small*)
  397. (good-step (spice-expand h niter) k))
  398. (else
  399. (good-step (spice-expand h niter)
  400. (min (fix:+ k 1) *gear-max-order*)))))
  401. ((> err *gear-error-too-big*) ; Have to reduce step.
  402. (let ((contract (expt (+ err *gear-protect*)
  403. (/ -1.0 (exact->inexact (fix:+ k 1))))))
  404. (cond ((< contract (* (exact->inexact k) *gear-decrease-order*))
  405. ;;(write-line `(order-down: ,(max (- k 1) *gear-min-order*)))
  406. (bad-step (* contract *contract-order* h)
  407. (max (fix:- k 1) *gear-min-order*)))
  408. (else (bad-step (* contract h) k)))))
  409. ;; Step is acceptable.
  410. ((<= wins (fix:* *gear-step-refractory-period* k)) ;do nothing
  411. (good-step h k))
  412. (else
  413. (let ((expand (expt (+ (/ err-accum (exact->inexact wins)) *gear-protect*)
  414. (/ -1.0 (exact->inexact (fix:+ k 1))))))
  415. (cond ((fix:> wins (fix:* *gear-order-refractory-period* k))
  416. (careful-step (min (* *gear-damping* expand h)
  417. (* *gear-max-step-increase* h))
  418. (min (fix:+ k 1) *gear-max-order*)))
  419. ((and (< *gear-dead-zone-low* expand)
  420. (< expand *gear-dead-zone-high*))
  421. (good-step h k))
  422. (else
  423. (careful-step (min (* *gear-damping* expand h)
  424. (* *gear-max-step-increase* h))
  425. k)))))))
  426. (define (spice-expand h niter)
  427. (let* ((m (/ (- 1.0 *spice-step-expansion*)
  428. (exact->inexact
  429. (fix:- *spice-step-too-small* *spice-order-too-small*))))
  430. (b (- 1.0 (* m (exact->inexact *spice-step-too-small*)))))
  431. (* (+ (* m (exact->inexact niter)) b) h)))
  432. (define (spice-contract h niter)
  433. (let* ((m (/ (- *spice-step-reduction* 1.0)
  434. (exact->inexact
  435. (fix:- *spice-step-too-big* *spice-good-step*))))
  436. (b (- 1.0 (* m (exact->inexact *spice-good-step*)))))
  437. (/ h (+ (* m (exact->inexact niter)) b))))
  438. (define gear-wallp? false)
  439. ;;; Stepsize and order control parameters
  440. ;;; The available orders are:
  441. (define *gear-max-order* 4) ;hmmmmm
  442. (define *gear-min-order* 1)
  443. ;;; Define a dead zone for the bang-bang controller
  444. (define *gear-dead-zone-low* .9)
  445. (define *gear-dead-zone-high* 1.1)
  446. ;;; Any error larger than this is unacceptable
  447. (define *gear-error-too-big* 2.0)
  448. ;;; Acceptable steps are not even touched in the refractory period
  449. (define *gear-step-refractory-period* 2)
  450. (define *gear-order-refractory-period* 3)
  451. ;;; When step tries to shrink faster than this, try lower order.
  452. (define *gear-decrease-order* .2)
  453. ;;; When order decreases, also cut step by this.
  454. (define *contract-order* .5)
  455. ;;; To prevent step size from growing too fast.
  456. (define *gear-damping* 1.0)
  457. ;;; On any one step, the step will not increase by more than this factor.
  458. (define *gear-max-step-increase* 2.0)
  459. ;;; To prevent divide-by-zero errors in step-size adjust.
  460. (define *gear-protect* 1e-20)
  461. ;;; Corrector must converge to within this fraction of the allowed
  462. ;;; local-truncation error.
  463. (define *gear-fixed-point-margin* .1)
  464. ;;; If it does not do so in *vector-fixed-point-iteration-loss*
  465. ;;; step size will be reduced by this factor
  466. (define *gear-fixed-point-failure-contraction* 8.0) ;see SPICE
  467. (define *spice-order-too-big* 12)
  468. (define *spice-step-too-big* 10)
  469. (define *spice-good-step* 6)
  470. (define *spice-step-too-small* 4)
  471. (define *spice-order-too-small* 2)
  472. (define *spice-step-reduction* 8.0) ;SPICE uses 8
  473. (define *spice-step-expansion* 2.0)
  474. #|
  475. ;;; To generate gear-type correctors (and predictors!):
  476. (define (gear-generator order deriv-index)
  477. ;; deriv-index for corrector = 0, predictor = 1
  478. (let ((n (1+ order)))
  479. (let ((dtns (list-head '(dt1 0 dt3 dt4 dt5 dt6 dt7) n)))
  480. (let ((C (generate-vector n
  481. (lambda (i)
  482. (if (= i 0)
  483. 0
  484. (* i (expt (list-ref dtns deriv-index)
  485. (- i 1)))))))
  486. (B (m:generate n n
  487. (lambda (i j)
  488. (if (= i 0)
  489. 1
  490. (expt (list-ref dtns j) i))))))
  491. (let ((coeffs (g:simplify (m:rsolve C B)))
  492. (tnames (list-head '(tn-1 tn-2 tn-3 tn-4 tn-5 tn-6) order)))
  493. (text/cselim
  494. `(lambda (dt1 ts) ;dt1=step
  495. (let* (,@(generate-list order
  496. (lambda (i)
  497. `(,(list-ref tnames i) (list-ref ts ,i))))
  498. ,@(map (lambda (dtn-k+1 tn-k) `(,dtn-k+1 (- ,tn-k tn-1)))
  499. (cddr dtns)
  500. (cdr tnames)))
  501. (list ,@(map expression (cdr coeffs)))))))))))
  502. ;;; For example, we can produce the standard stiffly-stable
  503. ;;; integrators for equally-spaced intervals (see Gear.)
  504. (pp (map (compose expression rcf:simplify (lambda (x) (* 'h x)))
  505. ((lambda->interpreted-generic-procedure (gear-generator 1 0))
  506. 'h '(0))))
  507. (1 -1)
  508. ;No value
  509. (pp (map (compose expression rcf:simplify (lambda (x) (* 'h x)))
  510. ((lambda->interpreted-generic-procedure (gear-generator 2 0))
  511. 'h (list 0 (- 'h)))))
  512. (3/2 -2 1/2)
  513. ;No value
  514. (pp (map (compose expression rcf:simplify (lambda (x) (* 'h x)))
  515. ((lambda->interpreted-generic-procedure (gear-generator 3 0))
  516. 'h (list 0 (- 'h) (* -2 'h)))))
  517. (11/6 -3 3/2 -1/3)
  518. ;No value
  519. (pp (map (compose expression rcf:simplify (lambda (x) (* 'h x)))
  520. ((lambda->interpreted-generic-procedure (gear-generator 4 0))
  521. 'h (list 0 (- 'h) (* -2 'h) (* -3 'h)))))
  522. (25/12 -4 3 -4/3 1/4)
  523. ;No value
  524. ;;; More simply, for h=1:
  525. (pp ((eval (gear-generator 4 0) generic-environment)
  526. '1 '(0 -1 -2 -3)))
  527. (25/12 -4 3 -4/3 1/4)
  528. ;No value
  529. (pp ((eval (gear-generator 5 0) generic-environment)
  530. '1 '(0 -1 -2 -3 -4)))
  531. (137/60 -5 5 -10/3 5/4 -1/5)
  532. ;No value
  533. ;;; The preceeding is run in the symbolic environment to produce
  534. ;;; the next hairy frobs:
  535. (define gc1
  536. (lambda (dt1 ts)
  537. (list (/ 1 dt1) (/ -1 dt1))))
  538. (define gc2
  539. (lambda (dt1 ts)
  540. (let ((dt3 (- (list-ref ts 1) (list-ref ts 0))))
  541. (let ((V-32 (* dt1 dt3)) (V-31 (* -1 dt3)))
  542. (list
  543. (/ (+ (* 2 dt1) V-31) (+ (expt dt1 2) (* V-31 dt1)))
  544. (/ (+ dt1 V-31) V-32)
  545. (/ (* -1 dt1) (+ V-32 (* -1 (expt dt3 2)))))))))
  546. (define gc3
  547. (lambda (dt1 ts)
  548. (let ((tn-1 (list-ref ts 0)) (V-33 (expt dt1 2)))
  549. (let ((dt4 (- (list-ref ts 2) tn-1)) (dt3 (- (list-ref ts 1) tn-1)))
  550. (let ((V-42 (expt dt4 2))
  551. (V-41 (expt dt3 2))
  552. (V-38 (* -1 dt4))
  553. (V-37 (* -1 dt3))
  554. (V-36 (* dt3 dt4))
  555. (V-35 (* dt1 dt4))
  556. (V-34 (* dt1 dt3)))
  557. (let ((V-40 (* V-36 dt1)) (V-39 (+ (* -1 V-33) V-35)))
  558. (list
  559. (/ (+ (* 3 V-33) (* V-34 -2) (* V-35 -2) V-36)
  560. (+ (expt dt1 3) (* V-37 V-33) (* V-38 V-33) (* V-35 dt3)))
  561. (/ (+ V-39 V-34 (* V-37 dt4)) V-40)
  562. (/ V-39
  563. (+ (* dt1 V-41)
  564. (* V-34 V-38)
  565. (* -1 (expt dt3 3))
  566. (* V-41 dt4)))
  567. (/ (+ V-33
  568. (* V-34 -1))
  569. (+ V-40
  570. (* -1 dt1 V-42)
  571. (* V-37 V-42)
  572. (expt dt4 3))))))))))
  573. (define gc4
  574. (lambda (dt1 ts)
  575. (let ((V-63 (* -1 dt1))
  576. (V-46 (* 2 dt1))
  577. (tn-1 (list-ref ts 0))
  578. (V-44 (expt dt1 2))
  579. (V-43 (expt dt1 3)))
  580. (let ((dt5 (- (list-ref ts 3) tn-1))
  581. (dt4 (- (list-ref ts 2) tn-1))
  582. (dt3 (- (list-ref ts 1) tn-1))
  583. (V-45 (* -3 V-44)))
  584. (let ((V-71 (expt dt5 3))
  585. (V-69 (expt dt5 2))
  586. (V-68 (expt dt4 3))
  587. (V-66 (expt dt4 2))
  588. (V-64 (expt dt3 2))
  589. (V-62 (expt dt3 3))
  590. (V-61 (+ (* -1 V-43) (* V-44 dt4)))
  591. (V-58 (* dt1 dt5))
  592. (V-56 (* dt1 dt4))
  593. (V-53 (* dt3 dt5))
  594. (V-52 (* -1 dt5))
  595. (V-51 (* -1 dt4))
  596. (V-50 (* -1 dt3))
  597. (V-49 (* dt4 dt5))
  598. (V-48 (* V-46 dt5))
  599. (V-47 (* dt3 dt4)))
  600. (let ((V-70 (* dt3 V-69))
  601. (V-67 (* V-50 V-56))
  602. (V-65 (* V-63 V-64))
  603. (V-59 (* V-58 dt3))
  604. (V-57 (* V-49 -1))
  605. (V-55 (+ V-43 (* V-50 V-44) (* V-52 V-44)))
  606. (V-54 (* V-49 dt1)))
  607. (let ((V-60 (* V-59 dt4)))
  608. (list
  609. (/ (+ (* 4 V-43)
  610. (* V-45 dt3)
  611. (* V-45 dt4)
  612. (* V-45 dt5)
  613. (* V-46 V-47)
  614. (* V-48 dt3)
  615. (* V-48 dt4)
  616. (* V-49 V-50))
  617. (+ (expt dt1 4)
  618. (* V-50 V-43)
  619. (* V-51 V-43)
  620. (* V-52 V-43)
  621. (* V-47 V-44)
  622. (* V-53 V-44)
  623. (* V-49 V-44)
  624. (* V-54 V-50)))
  625. (/ (+ V-55
  626. (* V-51 V-44)
  627. (* V-56 dt3)
  628. (* V-53 dt1)
  629. V-54
  630. (* V-57 dt3))
  631. V-60)
  632. (/ (+ V-61
  633. (* V-44 dt5)
  634. (* V-57 dt1))
  635. (+ (* dt1 V-62)
  636. (* V-65 dt4)
  637. (* V-65 dt5)
  638. V-60
  639. (* -1 (expt dt3 4))
  640. (* V-62 dt4)
  641. (* V-62 dt5)
  642. (* V-52 V-64 dt4)))
  643. (/ (+ V-55 V-59)
  644. (+ (* dt1 dt3 V-66)
  645. (* V-67 dt5)
  646. (* V-63 V-68)
  647. (* V-58 V-66)
  648. (* V-50 V-68)
  649. (* V-53 V-66)
  650. (expt dt4 4)
  651. (* V-52 V-68)))
  652. (/ (+ V-61 (* V-44 dt3) V-67)
  653. (+ (* V-56 V-53)
  654. (* V-70 V-63)
  655. (* V-51 dt1 V-69)
  656. (* dt1 V-71)
  657. (* V-70 V-51)
  658. (* dt3 V-71)
  659. (* dt4 V-71)
  660. (* -1 (expt dt5 4))))))))))))
  661. #|
  662. (pp (gear-generator 5 0))
  663. |#
  664. (define gc5
  665. (lambda (dt1 ts)
  666. (let ((V-569 (* -1 dt1)) (tn-1 (list-ref ts 0)))
  667. (let ((dt6 (- (list-ref ts 4) tn-1))
  668. (dt5 (- (list-ref ts 3) tn-1))
  669. (dt4 (- (list-ref ts 2) tn-1))
  670. (dt3 (- (list-ref ts 1) tn-1)))
  671. (let ((V-585 (expt dt6 2))
  672. (V-583 (expt dt6 4))
  673. (V-582 (expt dt6 3))
  674. (V-581 (* dt5 dt4))
  675. (V-573 (* dt3 dt4))
  676. (V-572 (* dt1 dt3))
  677. (V-562 (* -1 dt4))
  678. (V-560 (* -1 dt6))
  679. (V-558 (* -1 dt3))
  680. (V-557 (* -1 dt5))
  681. (V-554 (+ dt5 dt6))
  682. (V-550 (* -2 dt5))
  683. (V-549 (* dt6 dt5))
  684. (V-548 (+ (* 3 dt5) (* 3 dt6))))
  685. (let ((V-586 (+ (* V-557 V-585) V-582))
  686. (V-584 (+ (* V-582 dt5) (* -1 V-583)))
  687. (V-578 (+ dt5 V-560))
  688. (V-576 (+ V-557 dt6))
  689. (V-571 (* V-558 dt4))
  690. (V-567 (+ V-562 V-560))
  691. (V-566 (* V-549 V-562))
  692. (V-564 (* V-557 dt6))
  693. (V-563 (+ V-557 V-560))
  694. (V-559 (+ V-557 V-558 dt1))
  695. (V-556 (+ dt4 V-554))
  696. (V-555 (+ (* V-554 dt4) V-549))
  697. (V-552 (* V-549 dt4))
  698. (V-551 (* V-550 dt6)))
  699. (let ((V-587 (+ V-584 (* V-586 dt4)))
  700. (V-579 (* V-578 (expt dt5 3)))
  701. (V-577 (* V-576 (expt dt5 2)))
  702. (V-575 (* (+ (* (+ V-554 V-562) dt4) V-564) (expt dt4 2)))
  703. (V-574 (+ (* (+ V-563 dt4) dt4) V-549))
  704. (V-570 (+ V-556 V-569))
  705. (V-568 (+ V-567 V-557))
  706. (V-565 (+ (* V-563 dt4) V-564))
  707. (V-561 (+ V-559 V-560))
  708. (V-553 (* V-552 dt3)))
  709. (let ((V-580 (+ (* V-577 dt4) V-579)))
  710. (list
  711. (/ (+ (* (+ (* (+ (* (+ (* 5 dt1)
  712. (* -4 dt3)
  713. (* -4 dt4)
  714. (* -4 dt5)
  715. (* -4 dt6))
  716. dt1)
  717. (* (+ V-548 (* 3 dt4)) dt3)
  718. (* V-548 dt4)
  719. (* V-549 3))
  720. dt1)
  721. (* (+ (* (+ V-550 (* -2 dt6)) dt4) V-551) dt3)
  722. (* V-551 dt4))
  723. dt1)
  724. V-553)
  725. (* (+ (* (+ (* (+ V-555
  726. (* V-556 dt3)
  727. (* (+ V-561 V-562) dt1)
  728. ) dt1)
  729. (* V-565 dt3)
  730. V-566)
  731. dt1)
  732. V-553)
  733. dt1))
  734. (/ (+ (* (+ (* (+ V-565 (* V-568 dt3) (* (+ V-570 dt3) dt1))
  735. dt1)
  736. (* V-555 dt3)
  737. V-552)
  738. dt1)
  739. (* V-571 V-549))
  740. (* V-572 V-552))
  741. (/ (* (+ (* (+ V-565 (* V-570 dt1)) dt1) V-552) dt1)
  742. (+ (* V-572
  743. (+ (* (+ V-555 (* (+ V-568 dt3) dt3)) dt3) V-566))
  744. (* (+ (* (+ V-565 (* (+ V-556 V-558) dt3)) dt3) V-552)
  745. (expt dt3 2))))
  746. (/ (* (+ (* (+ (* V-561 dt1) (* V-554 dt3) V-549) dt1)
  747. (* V-549 V-558))
  748. dt1)
  749. (+ (* (+ (* V-573 V-574) V-575) dt1)
  750. (* V-575 dt3)
  751. (* V-574 (expt dt4 3))))
  752. (/ (* (+ (* (+ (* (+ V-569 dt3 dt4 dt6) dt1)
  753. (* V-567 dt3)
  754. (* V-562 dt6))
  755. dt1)
  756. (* V-573 dt6))
  757. dt1)
  758. (+ (* (+ V-580 (* (+ (* V-581 V-578) V-577) dt3)) dt1)
  759. (* V-580 dt3)
  760. (* V-579 dt4)
  761. (* V-576 (expt dt5 4))))
  762. (/ (* (+ (* (+ (* (+ V-559 V-562) dt1)
  763. (* (+ dt4 dt5) dt3) V-581) dt1)
  764. (* V-571 dt5))
  765. dt1)
  766. (+ (* (+ V-587
  767. (* (+ V-586 (* (+ V-549 (* -1 V-585)) dt4)) dt3))
  768. dt1)
  769. (* V-587 dt3)
  770. (* V-584 dt4)
  771. (* V-557 V-583)
  772. (expt dt6 5))))))))))))
  773. |#
  774. ;;; A bit of further hacking yields:
  775. ;;; (pp (flonumize (gear-generator 1 0)))
  776. (define (gc1 dt1 ts)
  777. (list (flo:/ 1. dt1) (flo:/ -1. dt1)))
  778. ;;; (pp (flonumize (gear-generator 2 0)))
  779. (define (gc2 dt1 ts)
  780. (let ((dt3 (flo:- (list-ref ts 1) (list-ref ts 0))))
  781. (let ((V-106 (flo:* dt1 dt3)) (V-105 (flo:* -1. dt3)))
  782. (list (flo:/ (flo:+ (flo:* 2. dt1) V-105)
  783. (flo:+ (flo:* dt1 dt1) (flo:* V-105 dt1)))
  784. (flo:/ (flo:+ dt1 V-105) V-106)
  785. (flo:/ (flo:* -1. dt1)
  786. (flo:+ V-106 (flo:* -1. (flo:* dt3 dt3))))))))
  787. ;;; (pp (flonumize (gear-generator 3 0)))
  788. (define (gc3 dt1 ts)
  789. (let ((tn-1 (list-ref ts 0)) (V-86 (flo:* dt1 dt1)))
  790. (let ((dt4 (flo:- (list-ref ts 2) tn-1))
  791. (dt3 (flo:- (list-ref ts 1) tn-1)))
  792. (let ((V-95 (flo:* dt4 dt4))
  793. (V-94 (flo:* dt3 dt3))
  794. (V-91 (flo:* dt4 -1.))
  795. (V-90 (flo:* dt3 -1.))
  796. (V-89 (flo:* dt3 dt4))
  797. (V-88 (flo:* dt1 dt4))
  798. (V-87 (flo:* dt1 dt3)))
  799. (let ((V-93 (flo:* V-89 dt1)) (V-92 (flo:+ (flo:* -1. V-86) V-88)))
  800. (list (flo:/ (flo:+ (flo:* 3. V-86)
  801. (flo:+ (flo:+ (flo:* V-87 -2.)
  802. (flo:* V-88 -2.))
  803. V-89))
  804. (flo:+ (flo:* V-86 dt1)
  805. (flo:+ (flo:+ (flo:* V-90 V-86)
  806. (flo:* V-91 V-86))
  807. (flo:* V-88 dt3))))
  808. (flo:/ (flo:+ (flo:+ V-92 (flo:* V-90 dt4)) V-87) V-93)
  809. (flo:/ V-92
  810. (flo:+ (flo:* dt1 V-94)
  811. (flo:+ (flo:* V-87 V-91)
  812. (flo:+ (flo:* -1. (flo:* V-94 dt3))
  813. (flo:* V-94 dt4)))))
  814. (flo:/ (flo:+ V-86 (flo:* V-87 -1.))
  815. (flo:+ V-93
  816. (flo:+ (flo:+ (flo:* -1. (flo:* dt1 V-95))
  817. (flo:* V-90 V-95))
  818. (flo:* V-95 dt4))))))))))
  819. ;;;(pp (flonumize (gear-generator 4 0)))
  820. (define (gc4 dt1 ts)
  821. (let ((V-137 (flo:* dt1 -1.))
  822. (V-119 (flo:* 2. dt1))
  823. (tn-1 (list-ref ts 0))
  824. (V-114 (flo:* dt1 dt1)))
  825. (let ((dt5 (flo:- (list-ref ts 3) tn-1))
  826. (dt4 (flo:- (list-ref ts 2) tn-1))
  827. (dt3 (flo:- (list-ref ts 1) tn-1))
  828. (V-115 (flo:* V-114 dt1)))
  829. (let ((V-142 (flo:* dt5 dt5))
  830. (V-139 (flo:* dt4 dt4))
  831. (V-135 (flo:* dt3 dt3))
  832. (V-131 (flo:* dt5 dt1))
  833. (V-130 (flo:* dt1 dt4))
  834. (V-126 (flo:* dt5 dt3))
  835. (V-125 (flo:* dt5 -1.))
  836. (V-124 (flo:* dt4 -1.))
  837. (V-123 (flo:* dt3 -1.))
  838. (V-122 (flo:* dt5 dt4))
  839. (V-121 (flo:* V-119 dt5))
  840. (V-120 (flo:* dt4 dt3))
  841. (V-118 (flo:* V-114 dt5))
  842. (V-117 (flo:* V-114 dt4))
  843. (V-116 (flo:* V-114 dt3)))
  844. (let ((V-144 (flo:* V-142 dt5))
  845. (V-143 (flo:* dt3 V-142))
  846. (V-141 (flo:* V-139 dt4))
  847. (V-140 (flo:* V-123 V-130))
  848. (V-138 (flo:* V-135 V-137))
  849. (V-136 (flo:* V-135 dt3))
  850. (V-134 (flo:+ V-117 (flo:* -1. V-115)))
  851. (V-132 (flo:* V-131 dt3))
  852. (V-129 (flo:* V-122 -1.))
  853. (V-128 (flo:+ (flo:+ (flo:* V-125 V-114) (flo:* V-123 V-114))
  854. V-115))
  855. (V-127 (flo:* V-122 dt1)))
  856. (let ((V-133 (flo:* V-132 dt4)))
  857. (list (flo:/ (flo:+ (flo:+ (flo:+ (flo:* 4. V-115)
  858. (flo:* V-116 -3.))
  859. (flo:+ (flo:* V-117 -3.)
  860. (flo:* V-118 -3.)))
  861. (flo:+ (flo:+ (flo:* V-119 V-120)
  862. (flo:* V-121 dt3))
  863. (flo:+ (flo:* V-121 dt4)
  864. (flo:* V-122 V-123))))
  865. (flo:+ (flo:+ (flo:+ (flo:* V-114 V-114)
  866. (flo:* V-123 V-115))
  867. (flo:+ (flo:* V-124 V-115)
  868. (flo:* V-125 V-115)))
  869. (flo:+ (flo:+ (flo:* V-120 V-114)
  870. (flo:* V-126 V-114))
  871. (flo:+ (flo:* V-122 V-114)
  872. (flo:* V-127 V-123)))))
  873. (flo:/ (flo:+ (flo:+ V-128
  874. (flo:* V-129 dt3))
  875. (flo:+ (flo:+ V-127
  876. (flo:* V-126 dt1))
  877. (flo:+ (flo:* V-130 dt3)
  878. (flo:* V-124 V-114))))
  879. V-133)
  880. (flo:/ (flo:+ (flo:+ V-134 (flo:* V-129 dt1)) V-118)
  881. (flo:+ (flo:+ (flo:+ (flo:* dt1 V-136)
  882. (flo:* V-138 dt4))
  883. (flo:+ (flo:* V-138 dt5)
  884. V-133))
  885. (flo:+ (flo:+ (flo:* -1. (flo:* V-135 V-135))
  886. (flo:* V-136 dt4))
  887. (flo:+ (flo:* V-136 dt5)
  888. (flo:* V-125
  889. (flo:* dt4 V-135))))))
  890. (flo:/ (flo:+ V-128 V-132)
  891. (flo:+ (flo:+ (flo:+ (flo:* dt1 (flo:* dt3 V-139))
  892. (flo:* V-140 dt5))
  893. (flo:+ (flo:* V-137 V-141)
  894. (flo:* V-131 V-139)))
  895. (flo:+ (flo:+ (flo:* V-123 V-141)
  896. (flo:* V-126 V-139))
  897. (flo:+ (flo:* V-139 V-139)
  898. (flo:* V-125 V-141)))))
  899. (flo:/ (flo:+ (flo:+ V-134 V-140) V-116)
  900. (flo:+ (flo:+ (flo:+ (flo:* V-130 V-126)
  901. (flo:* V-143 V-137))
  902. (flo:+ (flo:* V-124 (flo:* V-142 dt1))
  903. (flo:* dt1 V-144)))
  904. (flo:+ (flo:+ (flo:* V-143 V-124)
  905. (flo:* dt3 V-144))
  906. (flo:+ (flo:* dt4 V-144)
  907. (flo:* -1.
  908. (flo:* V-142
  909. V-142)))))))))))))
  910. (define gear-correctors
  911. (vector 0 gc1 gc2 gc3 gc4 ;gc5
  912. ))
  913. ;;; The following are the coefficients of the LTE term for fixed
  914. ;;; stepsize gear correctors.
  915. (define gear-corrector-errors
  916. (vector 0 -1/2 -2/9 -3/22 -12/125 -10/137 -60/1029))
  917. (define (gear-error k)
  918. (let ((C (vector-ref gear-corrector-errors k))
  919. (k+1 (fix:+ k 1))
  920. (dfk 1)) ;ugh!
  921. (lambda (h)
  922. (real:* C (expt h k+1) dfk))))
  923. ;;; Ugbletchreous Lagrange polynomial extrapolators.
  924. (define (extrap1 xs t)
  925. (let ((s1 (car xs)))
  926. (generate-vector (vector-length s1)
  927. (lambda (i)
  928. (if (fix:= i 0)
  929. t
  930. (vector-ref s1 i))))))
  931. (define (lag1 t1 t)
  932. (lambda (x1) x1))
  933. (define (extrap2 xs t)
  934. (let* ((s1 (car xs)) (r1 (cdr xs))
  935. (s2 (car r1)))
  936. (let ((e (lag2 (vector-ref s1 0)
  937. (vector-ref s2 0)
  938. t)))
  939. (generate-vector (vector-length s1)
  940. (lambda (i)
  941. (e (vector-ref s1 i)
  942. (vector-ref s2 i)))))))
  943. (define (lag2 t1 t2 t)
  944. (let ((t21 (- t2 t1)))
  945. (let ((s89 (- t t1)) (s88 (- t t2)))
  946. (lambda (x1 x2)
  947. (/ (- (* x2 s89) (* x1 s88)) t21)))))
  948. (define (extrap3 xs t)
  949. (let* ((s1 (car xs)) (r1 (cdr xs))
  950. (s2 (car r1)) (r2 (cdr r1))
  951. (s3 (car r2)))
  952. (let ((e (lag3 (vector-ref s1 0)
  953. (vector-ref s2 0)
  954. (vector-ref s3 0)
  955. t)))
  956. (generate-vector (vector-length s1)
  957. (lambda (i)
  958. (e (vector-ref s1 i)
  959. (vector-ref s2 i)
  960. (vector-ref s3 i)))))))
  961. (define (lag3 t1 t2 t3 t)
  962. (let ((t32 (- t3 t2)) (t21 (- t2 t1)) (t31 (- t3 t1)))
  963. (let ((s86 (- t t1)) (s85 (- t t2)) (s84 (- t t3)))
  964. (lambda (x1 x2 x3)
  965. (/ (- (* (/ (- (* x3 s85) (* x2 s84))
  966. t32)
  967. s86)
  968. (* (/ (- (* x2 s86) (* x1 s85))
  969. t21)
  970. s84))
  971. t31)))))
  972. (define (extrap4 xs t)
  973. (let* ((s1 (car xs)) (r1 (cdr xs))
  974. (s2 (car r1)) (r2 (cdr r1))
  975. (s3 (car r2)) (r3 (cdr r2))
  976. (s4 (car r3)))
  977. (let ((e (lag4 (vector-ref s1 0)
  978. (vector-ref s2 0)
  979. (vector-ref s3 0)
  980. (vector-ref s4 0)
  981. t)))
  982. (generate-vector (vector-length s1)
  983. (lambda (i)
  984. (e (vector-ref s1 i)
  985. (vector-ref s2 i)
  986. (vector-ref s3 i)
  987. (vector-ref s4 i)))))))
  988. (define (lag4 t1 t2 t3 t4 t)
  989. (let ((t41 (- t4 t1)) (t31 (- t3 t1))
  990. (t21 (- t2 t1)) (t42 (- t4 t2))
  991. (t32 (- t3 t2)))
  992. (let ((s96 (- t t1)) (s95 (- t t2))
  993. (s94 (- t t3)) (s93 (- t t4)))
  994. (lambda (x1 x2 x3 x4)
  995. (let ((s97 (/ (- (* x3 s95) (* x2 s94)) t32)))
  996. (/ (- (* (/ (- (* (/ (- (* x4 s94) (* x3 s93))
  997. (- t4 t3))
  998. s95)
  999. (* s97 s93))
  1000. t42)
  1001. s96)
  1002. (* (/ (- (* s97 s96)
  1003. (* (/ (- (* x2 s96) (* x1 s95)) t21)
  1004. s94))
  1005. t31)
  1006. s93))
  1007. t41))))))
  1008. (define (extrap5 xs t)
  1009. (let* ((s1 (car xs)) (r1 (cdr xs))
  1010. (s2 (car r1)) (r2 (cdr r1))
  1011. (s3 (car r2)) (r3 (cdr r2))
  1012. (s4 (car r3)) (r4 (cdr r3))
  1013. (s5 (car r4)))
  1014. (let ((e (lag5 (vector-ref s1 0)
  1015. (vector-ref s2 0)
  1016. (vector-ref s3 0)
  1017. (vector-ref s4 0)
  1018. (vector-ref s5 0)
  1019. t)))
  1020. (generate-vector (vector-length s1)
  1021. (lambda (i)
  1022. (e (vector-ref s1 i)
  1023. (vector-ref s2 i)
  1024. (vector-ref s3 i)
  1025. (vector-ref s4 i)
  1026. (vector-ref s5 i)))))))
  1027. (define (lag5 t1 t2 t3 t4 t5 t)
  1028. (let ((s103 (- t t1))
  1029. (s102 (- t t2))
  1030. (s101 (- t t3))
  1031. (s100 (- t t4))
  1032. (s99 (- t t5)))
  1033. (let ((t51 (- t5 t1))
  1034. (t41 (- t4 t1))
  1035. (t31 (- t3 t1))
  1036. (t21 (- t2 t1))
  1037. (t52 (- t5 t2))
  1038. (t53 (- t5 t3))
  1039. (t54 (- t5 t4))
  1040. (t42 (- t4 t2))
  1041. (t43 (- t4 t3))
  1042. (t32 (- t3 t2)))
  1043. (lambda (x1 x2 x3 x4 x5)
  1044. (let ((s105 (/ (- (* x3 s102) (* x2 s101)) t32))
  1045. (s104 (/ (- (* x4 s101) (* x3 s100)) t43)))
  1046. (let ((s106 (/ (- (* s104 s102) (* s105 s100)) t42)))
  1047. (/ (- (* (/ (- (* (/ (- (* (/ (- (* x5 s100) (* x4 s99))
  1048. t54)
  1049. s101)
  1050. (* s104 s99))
  1051. t53)
  1052. s102)
  1053. (* s106 s99))
  1054. t52)
  1055. s103)
  1056. (* (/ (- (* s106 s103)
  1057. (* (/ (- (* s105 s103)
  1058. (* (/ (- (* x2 s103) (* x1 s102))
  1059. t21)
  1060. s101))
  1061. t31)
  1062. s100))
  1063. t41)
  1064. s99))
  1065. t51)))))))
  1066. (define lagrange-extrapolators
  1067. (vector 0 extrap1 extrap2 extrap3 extrap4 extrap5))