PasteRack.org
Paste # 49016
2017-02-03 16:00:23

Fork as a new paste.

Paste viewed 986 times.


Embed:

hardy_weinberg.rkt

  1. #lang racket
  2.  
  3. (define (calculate-generations runs first-gen-prob)
  4.  
  5.   (define (next-gen current-gen-prob)
  6.     (let ((p (first current-gen-prob))
  7.           (q (second current-gen-prob)))
  8.       (letrec ((a1a1 (* p p))
  9.                (a1a2 (* 2 p q))
  10.                (a2a2 (* q q))
  11.                (result
  12.                 (format "a1a1: ~a a1a2: ~a a2a2: ~a\n" a1a1 a1a2 a2a2)))
  13.         (display result)
  14.         (unless (equal? (+ a1a1 a1a2 a2a2) 1.0)
  15.           (error "Misscalculation of Hardy-Weinberg frequencies."))
  16.         (list p q))))
  17.  
  18.   (when (> runs 0)
  19.     (begin
  20.       (display (format "generation ~a\n" runs))
  21.       (calculate-generations (- runs 1) (next-gen first-gen-prob)))))
  22.  
  23. (define a1a1 0.15)
  24. (define a2a2 0.35)
  25. (define a1a2 (- 1 (+ a1a1 a2a2)))
  26.  
  27. (define p (+ a1a1 (/ a1a2 2)))
  28. (define q (- 1 p))
  29.  
  30. (define first-gen-prob (list p q))
  31. (calculate-generations 12 first-gen-prob)

=>

generation 12

a1a1: 0.16000000000000003 a1a2: 0.48 a2a2: 0.36

generation 11

a1a1: 0.16000000000000003 a1a2: 0.48 a2a2: 0.36

generation 10

a1a1: 0.16000000000000003 a1a2: 0.48 a2a2: 0.36

generation 9

a1a1: 0.16000000000000003 a1a2: 0.48 a2a2: 0.36

generation 8

a1a1: 0.16000000000000003 a1a2: 0.48 a2a2: 0.36

generation 7

a1a1: 0.16000000000000003 a1a2: 0.48 a2a2: 0.36

generation 6

a1a1: 0.16000000000000003 a1a2: 0.48 a2a2: 0.36

generation 5

a1a1: 0.16000000000000003 a1a2: 0.48 a2a2: 0.36

generation 4

a1a1: 0.16000000000000003 a1a2: 0.48 a2a2: 0.36

generation 3

a1a1: 0.16000000000000003 a1a2: 0.48 a2a2: 0.36

generation 2

a1a1: 0.16000000000000003 a1a2: 0.48 a2a2: 0.36

generation 1

a1a1: 0.16000000000000003 a1a2: 0.48 a2a2: 0.36