Advertisement
Guest User

project1.scm

a guest
Jan 16th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.88 KB | None | 0 0
  1. ; default infinitesimal approximation
  2. (define h 0.0001)
  3.  
  4. ; helpers
  5. (define (square x) (* x x))
  6. (define (*4 x) (* x 4))
  7.  
  8. (define (close-enough? a b)
  9. (< (abs (- a b)) 0.001))
  10.  
  11. (define (foldr func acc xs)
  12. (if (null? xs)
  13. acc
  14. (func (car xs) (foldr func acc (cdr xs)))))
  15.  
  16. (define (foldl func acc xs)
  17. (if (null? xs)
  18. acc
  19. (foldl func (func acc (car xs)) (cdr xs))))
  20.  
  21. ; Requires special form to be lazy
  22. (define (thunk val) (lambda () val))
  23.  
  24. (define (stream f current end?)
  25. (if (end? current)
  26. '()
  27. (cons (f current) (thunk (stream f (f current) end?)))))
  28.  
  29. (define (next s) ((cdr s)))
  30.  
  31. (define (pour s)
  32. (if (null? s)
  33. '()
  34. (cons (car s) (pour (next s)))))
  35.  
  36. (define (stream-range a b inc)
  37. (stream (lambda (x) (+ x inc))
  38. a
  39. (lambda (x) (close-enough? x b))))
  40.  
  41. ; Problem 1
  42. (define (integral func num-steps x1 x2)
  43. (if (zero? num-steps)
  44. 0
  45. (let ((delta-x (/ (- x2 x1) num-steps))
  46. (height (func x1)))
  47. (+ (* height delta-x)
  48. (integral func (- num-steps 1) (+ x1 delta-x) x2)))))
  49.  
  50. ; Problem 2
  51. (define (circle-func x) (sqrt (- 1 (expt x 2))))
  52.  
  53. (define (approx-pi num-steps)
  54. (* 4
  55. (integral circle-func num-steps 0 1)))
  56.  
  57. ; Problem 3
  58. (define (integral-with piece func num-steps x1 x2)
  59. (if (zero? num-steps)
  60. 0
  61. (let* ((delta-x (/ (- x2 x1) num-steps))
  62. (area (piece func x1 (+ x1 delta-x))))
  63. (+ area
  64. (integral-with piece func (- num-steps 1) (+ x1 delta-x) x2)))))
  65.  
  66. (define (rectangle func x1 x2)
  67. (* (func x1) (- x2 x1)))
  68.  
  69. (define (trapezoid func x1 x2)
  70. (* (/ (+ (func x1) (func x2))
  71. 2)
  72. (- x2 x1)))
  73.  
  74. ; Problem 4
  75. (define (better-pi num-steps)
  76. (* 4
  77. (integral-with trapezoid circle-func num-steps 0 1)))
  78.  
  79. ; Optional Integration Function
  80. ; (define (numer-derivative func x)
  81. ; (/ (- (func (+ x h)) (func x))
  82. ; h))
  83. ; (define (integrate))
  84.  
  85. (define (numer-second-derivative func x)
  86. (/ (+ (- (func (+ x h))
  87. (* 2 (func x)))
  88. (func (- x h)))
  89. (expt h 2)))
  90.  
  91.  
  92. ; variable width intervals
  93. ; determines width of interval based on acceleration of the curve at a point
  94. ; delta-x = h / |f''(x)| when f''(x) > 1
  95. ; Pros: more accurate and faster on constant and linear functions
  96. ; Cons: less accurate and slower on most other functions,
  97. ; does not handle cases where second dervative is undefined
  98. (define (integral-vwi func x1 x2)
  99. (if (close-enough? x1 x2)
  100. 0
  101. (let* ((curvature (numer-second-derivative func x1))
  102. ; delta-x in range (0, x2 - x1]
  103. (delta-x (min (- x2 x1)
  104. (/ h
  105. (if (= 0 curvature) h (abs curvature))))) ; avoid dividing by zero
  106. (area (trapezoid func x1 (+ x1 delta-x))))
  107. (+ area
  108. (integral-vwi func (+ x1 delta-x) x2)))))
  109. ; Tests
  110. (print (integral-vwi square 0 1))
  111. ;Value .33233
  112. ;Should be: .33_
  113.  
  114. (print (integral-vwi *4 0 1))
  115. ;Value 2
  116. ;Should be: 2
  117.  
  118. ; Part 2
  119. (define (deriv-constant wrt constant)
  120. 0)
  121.  
  122. ; Problem 5
  123. (define (deriv-variable wrt var)
  124. (if (equal? wrt var) 1 0))
  125.  
  126. ; Problem 6
  127. (define constant? number?)
  128. (define variable? symbol?)
  129.  
  130. (define (sum? expr) (equal? (car expr) '+))
  131. (define (product? expr) (equal? (car expr) '*))
  132.  
  133. (define (derivative wrt expr)
  134. (cond ((constant? expr) (deriv-constant wrt expr))
  135. ((variable? expr) (deriv-variable wrt expr))
  136. ((sum? expr) (deriv-sum wrt expr))
  137. ((product? expr) (deriv-product wrt expr))
  138. (else (print "Don't know how to differentiate" expr))))
  139.  
  140. (define (deriv-sum wrt expr)
  141. (let ((terms (cdr expr))) ; terms = expressions after operator
  142. ; make list of differentiated terms, preprend with '+ operator to form new sum
  143. (cons '+
  144. (map (lambda (subexpr) (derivative wrt subexpr)) (cdr expr)))))
  145.  
  146. (define (deriv-product wrt expr)
  147. (let* ((terms (cdr expr)))
  148. ; Run product rule on pairs of the accumulated term and current term
  149. (foldr (lambda (A B)
  150. (list '+
  151. (list '* (derivative wrt A) B)
  152. (list '* (derivative wrt B) A)))
  153. (car terms) ; use the first term as the initial value of the accumulator
  154. (cdr terms))))
  155.  
  156. ;Tests
  157. ;(print (derivative 'x '(+ 1 2 3)))
  158. ;Value: (+ 0 0 0) equivalent to 0
  159. ;Should be equivalent to: 0
  160.  
  161. ;(print (derivative 'x '(* x (* x 1))))
  162. ;Value: (+ (* (+ (* 0 x) (* 1 1)) x) (* 1 (* x 1))) equivalent to (* 2 x)
  163. ;Should be equivalent to (* 2 x)
  164.  
  165. ;(print (derivative 'y '(* x y)))
  166. ;Value: (+ (* 1 x) (* 0 y)) equivalent to x
  167. ;Should be equivalent to x
  168.  
  169. ;(print (derivative 'x '(* x x x)))
  170. ;Value (+ (* 1 (+ (* 1 x) (* 1 x))) (* (+ (+ (* 1 1) (* 0 x)) (+ (* 1 1) (* 0 x))) x)) equivalent to (* 3 (* x x))
  171. ;Should be equivalent to (* 3 (* x x))
  172.  
  173.  
  174. ; (define (simplify-bin-expr expr)
  175. ; (let ((op (eval (car expr)))
  176. ; (A (cadr expr))
  177. ; (B (caddr expr)))
  178. ; (cond ())))
  179.  
  180. ; (define (simplify-sum sum)
  181. ; (let ((terms (cdr expr)))
  182. ; (foldr (lambda (acc curr)
  183. ; (cond (?)))
  184.  
  185. ;; Extra (incomplete) algebra system for simplification
  186. (define raw-constant? number?)
  187. (define raw-variable? symbol?)
  188.  
  189. (define (const? expr) (equal? (exprtype expr) 'const))
  190. (define (var? expr) (equal? (exprtype expr) 'var))
  191. (define (op? expr) (equal? (exprtype expr) 'op))
  192.  
  193. (define exprtype car)
  194. (define exprvalue cdr)
  195. (define (mkconst const) (cons 'const const))
  196. (define (mkvar var) (cons 'var var))
  197. (define (mkop op) (list 'op (car op) (mkexpr (cadr op)) (mkexpr (caddr op))))
  198.  
  199. ; (Number | Symbol | [Number|Symbol]) -> Expr
  200. (define (mkexpr raw-expr)
  201. (cond ((raw-constant? raw-expr) (mkconst raw-expr))
  202. ((raw-variable? raw-expr) (mkvar raw-expr))
  203. ((list? raw-expr) (mkop raw-expr)) ; should have a stronger condition based on first element of the list
  204. (else (print "Cannot make expression from" raw-expr))))
  205.  
  206. (define (simplify-expr expr)
  207. (cond ((const? expr) expr)
  208. ((var? expr) expr)
  209. ((op? expr) ; 3 cases, is there a better way to handle this?
  210. (let* ((op (eval (cadr expr)))
  211. (operand1 (caddr expr))
  212. (operand2 (cadddr expr))
  213. (t1 (exprtype operand1))
  214. (t2 (exprtype operand2)))
  215. (cond ((and (const? operand1) (const? operand2))
  216. (mkconst (op (exprvalue operand1)
  217. (exprvalue operand2))))
  218. ((and (var? ))))))))
  219.  
  220. ; (type (Expr)
  221. ; | (cons 'const Number)
  222. ; | (cons 'var Symbol)
  223. ; | (list 'op Symbol Expr Expr)) ; Generalize to [Expr]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement