def xx
(x
:Double
):Double
= math.
pow(x, x
)
def trapezoid
(f
:Double
=>Double, a
:Double, b
:Double
):Double
= { (b-a)*(f(a)+f(b))/2
}
def simpson
(f
:Double
=>Double, a
:Double, b
:Double
):Double
= { (b-a)*(f(a) + 4*f((a+b)/2) + f(b))/6
}
def simpson38
(f
:Double
=>Double, a
:Double, b
:Double
):Double
= { (b-a)*(f(a) + 3*f((2*a+b)/3) + 3*f((a+2*b)/3) + f(b))/8
}
def boole
(f
:Double
=> Double, a
:Double, b
:Double
):Double
= { (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
}
def integrate
(f
:Double
=> Double,
algorithm:(Double=>Double, Double, Double)=>Double,
a:Double, b:Double, n:Long):Double = {
(0L until n).foldLeft(0.0)((r,i) => {
val x1
= a +
(b-a
)*(i+
1)/n
r + algorithm(f, x0, x1)
})
}
def diff
(method
:(Double
=>Double, Double, Double
)=>Double, n
:Int
):Double
= { 17128.111274826415512 - integrate(xx, method, 1, 6, n)
}
def solve
(method
:(Double
=>Double, Double, Double
)=>Double,
eps:Double, n:Int=1):Int = {
if (diff
(method, n
).
abs>eps
){ solve(method, eps, n+1)
n
}
}
println("trapezoid: %d".format(solve(trapezoid, 0.1)))
println("simpson: %d".format(solve(simpson, 0.1)))
println("simpson38: %d".format(solve(simpson38, 0.1)))
println("boole: %d".format(solve(boole, 0.1)))
}
Cm9iamVjdCBNYWluIGV4dGVuZHMgQXBwIHsKICBkZWYgeHgoeDpEb3VibGUpOkRvdWJsZSA9IG1hdGgucG93KHgsIHgpCgogIGRlZiB0cmFwZXpvaWQoZjpEb3VibGU9PkRvdWJsZSwgYTpEb3VibGUsIGI6RG91YmxlKTpEb3VibGUgPSB7CiAgICAoYi1hKSooZihhKStmKGIpKS8yCiAgfQogIGRlZiBzaW1wc29uKGY6RG91YmxlPT5Eb3VibGUsIGE6RG91YmxlLCBiOkRvdWJsZSk6RG91YmxlID0gewogICAgKGItYSkqKGYoYSkgKyA0KmYoKGErYikvMikgKyBmKGIpKS82CiAgfQogIGRlZiBzaW1wc29uMzgoZjpEb3VibGU9PkRvdWJsZSwgYTpEb3VibGUsIGI6RG91YmxlKTpEb3VibGUgPSB7CiAgICAoYi1hKSooZihhKSArIDMqZigoMiphK2IpLzMpICsgMypmKChhKzIqYikvMykgKyBmKGIpKS84CiAgfQogIGRlZiBib29sZShmOkRvdWJsZSA9PiBEb3VibGUsIGE6RG91YmxlLCBiOkRvdWJsZSk6RG91YmxlID0gewogICAgKGItYSkqKDcqZihhKSArIDMyKmYoKDMqYStiKS80KSArIDEyKmYoKGErYikvMikgKyAzMipmKChhKzMqYikvNCkgKyA3KmYoYikpLzkwCiAgfQoKCiAgZGVmIGludGVncmF0ZShmOkRvdWJsZSA9PiBEb3VibGUsCiAgICBhbGdvcml0aG06KERvdWJsZT0+RG91YmxlLCBEb3VibGUsIERvdWJsZSk9PkRvdWJsZSwKICAgIGE6RG91YmxlLCBiOkRvdWJsZSwgbjpMb25nKTpEb3VibGUgPSB7CiAgICAoMEwgdW50aWwgbikuZm9sZExlZnQoMC4wKSgocixpKSA9PiB7CiAgICAgIHZhbCB4MCA9IGEgKyAoYi1hKSppL24KICAgICAgdmFsIHgxID0gYSArIChiLWEpKihpKzEpL24KICAgICAgciArIGFsZ29yaXRobShmLCB4MCwgeDEpCiAgICB9KQogIH0KCgogIGRlZiBkaWZmKG1ldGhvZDooRG91YmxlPT5Eb3VibGUsIERvdWJsZSwgRG91YmxlKT0+RG91YmxlLCBuOkludCk6RG91YmxlID0gewogICAgMTcxMjguMTExMjc0ODI2NDE1NTEyIC0gaW50ZWdyYXRlKHh4LCBtZXRob2QsIDEsIDYsIG4pCiAgfQoKICBkZWYgc29sdmUobWV0aG9kOihEb3VibGU9PkRvdWJsZSwgRG91YmxlLCBEb3VibGUpPT5Eb3VibGUsCiAgICBlcHM6RG91YmxlLCBuOkludD0xKTpJbnQgPSB7CiAgICBpZiAoZGlmZihtZXRob2QsIG4pLmFicz5lcHMpewogICAgICBzb2x2ZShtZXRob2QsIGVwcywgbisxKQogICAgfSBlbHNlIHsKICAgICAgbgogICAgfQogIH0KCiAgcHJpbnRsbigidHJhcGV6b2lkOiAlZCIuZm9ybWF0KHNvbHZlKHRyYXBlem9pZCwgMC4xKSkpCiAgcHJpbnRsbigic2ltcHNvbjogJWQiLmZvcm1hdChzb2x2ZShzaW1wc29uLCAwLjEpKSkKICBwcmludGxuKCJzaW1wc29uMzg6ICVkIi5mb3JtYXQoc29sdmUoc2ltcHNvbjM4LCAwLjEpKSkKICBwcmludGxuKCJib29sZTogJWQiLmZvcm1hdChzb2x2ZShib29sZSwgMC4xKSkpCgp9Cg==