test-numerics.ss 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. (import (mit core)
  2. (mit curry)
  3. (scmutils base)
  4. (scmutils generic)
  5. (scmutils mechanics)
  6. (scmutils calculus)
  7. (fbe gnuplot))
  8. ;;; **** UNIVARIATE MINIMIZATION ****
  9. (define foo (Lagrange-interpolation-function '(2 1 2) '(2 3 4)))
  10. ;;(brent-min foo 0 5 1e-2)
  11. (minimize foo 0 5)
  12. ;; => (3.0 1.0 5) ; [x-min (f x-min) n-iterations]
  13. (golden-section-min foo 0 5
  14. (lambda (lowx minx highx flowx fminx fhighx count)
  15. (< (abs (- highx lowx)) .001)))
  16. ;; => (3.0001322139227034 1.0000000174805213 17)
  17. (define bar (Lagrange-interpolation-function '(2 1 2 0 3) '(2 3 4 5 6)))
  18. (local-minima bar -10 10 15 .0000001)
  19. ;; => ((5.303446964995252 -0.32916549541536916 18)
  20. ;; (2.5312725379910592 0.4258326399952621 18)
  21. (local-maxima bar -10 10 15 .0000001)
  22. ;; => ((3.8192274368217713 2.067961961032311 17)
  23. ;; (10 680 31)
  24. ;; (-10 19735 29))
  25. ;;; **** MULTIVARIATE MINIMIZATION ****
  26. (define (baz v)
  27. (* (foo (ref v 0)) (bar (ref v 1))))
  28. (multidimensional-minimize baz '(4 3))
  29. ;; => (2.9999927603607803 2.5311967755369285)
  30. (nelder-mead baz '#(4 3) 1 .00001 100)
  31. ;; => (ok ((up 2.9955235887900926 2.5310866303625517)
  32. ;; .
  33. ;; 0.42584120140775594)
  34. ;; 21)
  35. (dfp baz (compose down->vector (D baz)) '#(4 3) .4 .00001 100)
  36. ;; => (ok ((up 2.999971756396209 2.5312137271309987)
  37. ;; .
  38. ;; 0.4258326204265247)
  39. ;; 4)
  40. ;;; **** QUADRATURE ****
  41. (define witch
  42. (lambda (x)
  43. (/ 4.0 (+ 1.0 (* x x)))))
  44. (define integrator (make-definite-integrator))
  45. ;;(integrator 'set-method! 'romberg)
  46. (integrator 'set-error! 1e-12)
  47. (integrator 'set-integrand! witch)
  48. (integrator 'set-lower-limit! 0.0)
  49. (integrator 'set-upper-limit! 1.0)
  50. (integrator 'integral)
  51. ;; => 3.141592653589803
  52. (define (foo n)
  53. ((make-definite-integrator
  54. (lambda (x) (expt (log (/ 1 x)) n))
  55. 0.0 1.0
  56. 1e-12 'open-closed)
  57. 'integral))
  58. (foo 3)
  59. ;; => 5.99999999999799
  60. ;;; **** ODE ****
  61. ;; (set-ode-integration-method! 'qcrk4)
  62. ;; (set-ode-integration-method! 'bulirsch-stoer)
  63. ;; (set-ode-integration-method! 'qcctrap2)
  64. ;; (set-ode-integration-method! 'explicit-gear)
  65. (define* ((ellipse-sysder a b) state)
  66. (let ((t (ref state 0))
  67. (x (ref state 1))
  68. (y (ref state 2)))
  69. (up 1 ; dt/dt
  70. (* -1 a y) ; dx/dt
  71. (* b x)))) ; dy/dt
  72. ;; this kind of monitor is very slow with the 'gnuplot' interface.
  73. (define* ((monitor-xy win) state)
  74. (win 'plot-points (list (ref state 1)) (list (ref state 2))))
  75. (define* (monitor-xy-txt . ignored) write-line)
  76. (define win (make-gplotter))
  77. (win 'hold #t)
  78. ((evolve ellipse-sysder 0.5 2.)
  79. (up 0. .5 .5) ; initial state
  80. (monitor-xy-txt) ; the monitor
  81. 0.01 ; plotting step
  82. 10.) ; final value of t
  83. ((state-advancer ellipse-sysder 0.5 2.0) (up 0. .5 .5) 3.0 1e-10)
  84. ;; We should define a nice interface to accumulate results
  85. (define xy-results
  86. (let ((t-end 10)
  87. (dt 0.01))
  88. (list (make-vector (+ 1 (exact (round (/ t-end dt)))) +nan.0)
  89. (make-vector (+ 1 (exact (round (/ t-end dt)))) +nan.0))))
  90. (define* ((monitor-xy-v xy-vectors t-end dt) state)
  91. (define (index t) (exact (round (/ t dt))))
  92. (let ((t (ref state 0))
  93. (x (ref state 1))
  94. (y (ref state 2)))
  95. (vector-set! (car xy-vectors) (index t) x)
  96. (vector-set! (cadr xy-vectors) (index t) y)))
  97. (let ((t-end 10.0)
  98. (dt 0.01))
  99. ((evolve ellipse-sysder 0.5 2.)
  100. (up 0. .5 .5) ; initial state
  101. (monitor-xy-v xy-results t-end dt) ; the monitor
  102. dt ; plotting step
  103. t-end)) ; final value of t
  104. (define win2 (make-gplotter))
  105. (win2 'plot-points xy-results)
  106. (win2 'grid)
  107. (win2 'xrange -1.3 1.3)
  108. (win2 'yrange -1.3 1.3)
  109. ;;; mechanics example
  110. (define* ((harmonic-sysder m k) state)
  111. (let ((q (coordinate state)) (p (momentum state)))
  112. (let ((x (ref q 0)) (y (ref q 1))
  113. (px (ref p 0)) (py (ref p 1)))
  114. (up 1 ;dt/dt
  115. (up (/ px m) (/ py m)) ;dq/dt
  116. (down (* -1 k x) (* -1 k y)) ;dp/dt
  117. ))))
  118. (define* ((H m k) state)
  119. (+ (/ (square (momentum state))
  120. (* 2 m))
  121. (* 1/2 k
  122. (square (coordinate state)))))
  123. (let ((m 0.5) (k 2.0))
  124. ((evolve harmonic-sysder m k)
  125. (up 0. ; initial state
  126. (up .5 .5)
  127. (down 0.1 0.0))
  128. (lambda (state) ; the monitor
  129. (write-line
  130. (list (time state) ((H m k) state))))
  131. 1.0 ; output step
  132. 10.))