arithmetic-geometric-harmonic_mean.sf 954 B

123456789101112131415161718192021222324252627282930313233343536
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 17 March 2018
  4. # https://github.com/trizen
  5. # Arithmetic-geometric-harmonic mean (AGHM) for a list of three values.
  6. # Extension of the arithmetic-geometric mean (AGM).
  7. func A(*a) { a.sum / a.len }
  8. func G(*a) { a.prod.root(a.len) }
  9. func H(*a) { a.len / a.map{.inv}.sum }
  10. func AGHM(a, g, h, p=100) {
  11. loop {
  12. var a1 = A(a, g, h)
  13. var g1 = G(a, g, h)
  14. var h1 = H(a, g, h)
  15. if (
  16. (a1.round(-p) == a.round(-p)) &&
  17. (g1.round(-p) == g.round(-p)) &&
  18. (h1.round(-p) == h.round(-p))
  19. ) {
  20. return a
  21. }
  22. (a, g, h) = (a1, g1, h1)
  23. }
  24. }
  25. say AGHM(1, 2, 3) #=> 1.81174228573045668252604274570860756877576751416
  26. say AGHM(1, 1/2, 1/3) #=> 0.551954882256789004514874128479233200903459376603
  27. say AGHM(5, 1/sqrt(2), 1/sqrt(3)) #=> 1.33688849807307128479412972909072330610099261518