fork download
  1.  
  2. object Main extends App {
  3. def xx(x:Double):Double = math.pow(x, x)
  4.  
  5. def trapezoid(f:Double=>Double, a:Double, b:Double):Double = {
  6. (b-a)*(f(a)+f(b))/2
  7. }
  8. def simpson(f:Double=>Double, a:Double, b:Double):Double = {
  9. (b-a)*(f(a) + 4*f((a+b)/2) + f(b))/6
  10. }
  11. def simpson38(f:Double=>Double, a:Double, b:Double):Double = {
  12. (b-a)*(f(a) + 3*f((2*a+b)/3) + 3*f((a+2*b)/3) + f(b))/8
  13. }
  14. def boole(f:Double => Double, a:Double, b:Double):Double = {
  15. (b-a)*(7*f(a) + 32*f((3*a+b)/4) + 12*f((a+b)/2) + 32*f((a+3*b)/4) + 7*f(b))/90
  16. }
  17.  
  18.  
  19. def integrate(f:Double => Double,
  20. algorithm:(Double=>Double, Double, Double)=>Double,
  21. a:Double, b:Double, n:Long):Double = {
  22. (0L until n).foldLeft(0.0)((r,i) => {
  23. val x0 = a + (b-a)*i/n
  24. val x1 = a + (b-a)*(i+1)/n
  25. r + algorithm(f, x0, x1)
  26. })
  27. }
  28.  
  29.  
  30. def diff(method:(Double=>Double, Double, Double)=>Double, n:Int):Double = {
  31. 17128.111274826415512 - integrate(xx, method, 1, 6, n)
  32. }
  33.  
  34. def solve(method:(Double=>Double, Double, Double)=>Double,
  35. eps:Double, n:Int=1):Int = {
  36. if (diff(method, n).abs>eps){
  37. solve(method, eps, n+1)
  38. } else {
  39. n
  40. }
  41. }
  42.  
  43. println("trapezoid: %d".format(solve(trapezoid, 0.1)))
  44. println("simpson: %d".format(solve(simpson, 0.1)))
  45. println("simpson38: %d".format(solve(simpson38, 0.1)))
  46. println("boole: %d".format(solve(boole, 0.1)))
  47.  
  48. }
  49.  
Success #stdin #stdout 1.89s 382272KB
stdin
Standard input is empty
stdout
trapezoid: 1648
simpson: 40
simpson38: 32
boole: 10