aern2-mfun-0.2.9.0: src/AERN2/BoxFun/TestFunctions.hs
module AERN2.BoxFun.TestFunctions where
import MixedTypesNumPrelude
import AERN2.MP.Ball
import qualified Data.List as List
import AERN2.AD.Differential
import AERN2.BoxFun.Type
import AERN2.Linear.Vector.Type ((!), Vector)
import qualified AERN2.Linear.Vector.Type as V
fromListDomain :: [(Rational, Rational)] -> Vector (CN MPBall)
fromListDomain [] = V.empty
fromListDomain [x] = V.singleton $ fromEndpointsAsIntervals (cn $ mpBallP (prec 53) $ (fst x)) (cn $ mpBallP (prec 53) (snd x))
fromListDomain (x:xs) = V.cons (fromEndpointsAsIntervals (cn $ mpBallP (prec 53) $ (fst x)) (cn $ mpBallP (prec 53) (snd x))) (fromListDomain xs)
symmetricDomain :: Integer -> Rational -> Rational -> Vector (CN MPBall)
symmetricDomain n l r =
V.map (\_ -> fromEndpointsAsIntervals (cn $ mpBallP (prec 53) $ l) (cn $ mpBallP (prec 53) r)) $ V.enumFromTo 1 n
griewank :: Integer -> BoxFun
griewank n =
BoxFun
n
(\v ->
let
ord = order (v ! 0)
sm = List.foldl' (+) (differential ord (cn $ mpBall 0)) [let x = (v ! k) in x^2 | k <- [0 .. V.length v - 1]]
prd = List.foldl' (*) (differential ord (cn $ mpBall 1)) [cos $ (v ! k) / (sqrt $ 1 + mpBallP p k) | k <- [0 .. V.length v - 1]]
p = getPrecision v
in
1 + ((setPrecision p $ mpBall 1)/(setPrecision p $ mpBall 4000)) * sm - prd
)
(symmetricDomain n (-600.0) 600.0)
rosenbrock :: BoxFun
rosenbrock =
BoxFun
2
(\v ->
let
p = getPrecision v
x = v ! 0
y = v ! 1
a = mpBallP p 1
b = mpBallP p 100
amx = a - x
ymxs = y - x*x
in
amx^2 + b*ymxs^2
)
(symmetricDomain 2 (-1.2) 1.2)
himmelblau :: BoxFun
himmelblau =
BoxFun
2
(\v ->
let
x = v ! 0
y = v ! 1
a = (x^2 + y - 11)
b = (x + y^2 - 7)
in
a^2 + b^2
)
(symmetricDomain 2 (-600.0) 600.0)
shekel :: BoxFun
shekel =
BoxFun
2
(\v ->
let
x = v ! 0
y = v ! 1
c0 = 1; a00 = 43; a01 = 23
c1 = 17; a10 = 6; a11 = 9
in
- 1/(c0 + (x - a00)^2 + (y - a01)^2)
- 1/(c1 + (x - a10)^2 + (y - a11)^2)
)
(symmetricDomain 2 (-600.0) 600.0)
siam4 :: BoxFun
siam4 =
BoxFun
2
(\v ->
let
x = v ! 0
y = v ! 1
in
exp(sin(50 * x)) + sin(60 * exp y)
+ sin(70 * sin(x)) + sin(sin(80 * y))
- sin(10 * (x + y))
+ (x^2 + y^2) / 4
)
(symmetricDomain 2 (-10.0) 10.0)
ratz4 :: BoxFun
ratz4 =
BoxFun
2
(\v ->
let
x = v ! 0
y = v ! 1
xs = x^2
ys = y^2
in
sin(xs + 2 * ys) * exp (-xs - ys)
)
(symmetricDomain 2 (-3.0) 3.0)
-- global minimum at bukin(-10, 1) ~ 0
-- bukin :: BoxFun
-- bukin =
-- BoxFun
-- 2
-- (\v ->
-- let
-- x = v!0
-- y = v!1
-- in
-- 100 * sqrt (abs (y - x^2 / 100)) + abs(x + 10) / 100
-- )
-- (fromListDomain [(-15.0, 5.0), (-3.0, 3.0)])
ackley :: BoxFun
ackley =
BoxFun
2
(\v ->
let
x = v!0
y = v!1
p = getPrecision v
pi = piBallP p
in
-20 * exp(sqrt((x^2 + y^2) / 2) / (-5)) - exp((cos (2 * pi * x) + cos(2 * pi * y)) / 2) + exp(mpBallP p 1) + 20
)
(symmetricDomain 2 (-5.0) 5.0)
-- eggholder :: BoxFun
-- eggholder =
-- BoxFun
-- 2
-- (\v ->
-- let
-- x = v!0
-- y = v!1
-- in
-- -(y + 47) * sin (sqrt (abs (x / 2 + (y + 47)))) - x * sin (sqrt (abs (x - (y + 47))))
-- )
-- (symmetricDomain 2 (-512.0) 512.0)
-- heron :: BoxFun
-- heron =
-- BoxFun
-- 2
-- (\v ->
-- let
-- x = v!0
-- y = v!1
-- p = getPrecision v
-- eps = 1/2^(23)
-- i = 2
-- in
-- max
-- min
-- max
-- (y - sqrt x)
-- ((sqrt x - y) - (mpBallP p 1/2)^(2^(i-1)) - 6 * eps * (i-1))
-- max
-- (sqrt x - y)
-- (- (sqrt x - y) - (mpBallP p 1/2)^(2^(i-1)) - 6 * eps * (i-1))
-- min
-- max
-- ((y + x/y)/2 - sqrt x)
-- (- (sqrt x - (y+x/y)/2) + (mpBallP p 1/2)^(2^i) + 6 * eps * (i-1))
-- max
-- (sqrt x - (y+x/y)/2)
-- ((sqrt x - (y+x/y)/2) + (mpBallP p 1/2)^(2^i) + 6 * eps * (i-1))
-- )
-- (fromListDomain [(0.5, 2.0), (0.8, 1.8)])
-- max (min (max 1p 1q) (max 2p 2q)) (min (max 3p 3q) (max 4p 4q))
i :: Integer
i = 3
heron1p :: BoxFun
heron1p =
BoxFun
2
(\v ->
let
x = v!0
y = v!1
_p = getPrecision v
_eps = 1/2^(23)
in
(y - sqrt x)
)
(fromListDomain [(0.5, 2.0), (0.8, 1.8)])
heron1q :: BoxFun
heron1q =
BoxFun
2
(\v ->
let
x = v!0
y = v!1
p = getPrecision v
eps = 1/2^(23)
in
((sqrt x - y) - (mpBallP p 1/2)^(2^(i-1)) - (mpBallP p 6) * eps * (i-1))
)
(fromListDomain [(0.5, 2.0), (0.8, 1.8)])
heron2p :: BoxFun
heron2p =
BoxFun
2
(\v ->
let
x = v!0
y = v!1
_p = getPrecision v
_eps = 1/2^(23)
in
(sqrt x - y)
)
(fromListDomain [(0.5, 2.0), (0.8, 1.8)])
heron2q :: BoxFun
heron2q =
BoxFun
2
(\v ->
let
x = v!0
y = v!1
p = getPrecision v
eps = 1/2^(23)
in
(- (sqrt x - y) - (mpBallP p 1/2)^(2^(i-1)) - (mpBallP p 6) * eps * (i-1))
)
(fromListDomain [(0.5, 2.0), (0.8, 1.8)])
heron3p :: BoxFun
heron3p =
BoxFun
2
(\v ->
let
x = v!0
y = v!1
_p = getPrecision v
_eps = 1/2^(23)
in
((y + x/y)/2 - sqrt x)
)
(fromListDomain [(0.5, 2.0), (0.8, 1.8)])
heron3q :: BoxFun
heron3q =
BoxFun
2
(\v ->
let
x = v!0
y = v!1
p = getPrecision v
eps = 1/2^(23)
in
(- (sqrt x - (y+x/y)/2) + (mpBallP p 1/2)^(2^i) + (mpBallP p 6) * eps * (i-1))
)
(fromListDomain [(0.5, 2.0), (0.8, 1.8)])
heron3p2 :: BoxFun
heron3p2 =
BoxFun
2
(\v ->
let
x = v!0
y = v!1
_p = getPrecision v
_eps = 1/2^(23)
_i = 4
in
((y + x/y)/2 - sqrt x)
)
(fromListDomain [(0.633758544921875, 0.63385009765625), (0.79999999999999982236431605997495353221893310546875, 0.80006103515624982239142111428709114306911942549049854278564453125)])
heron3q2 :: BoxFun
heron3q2 =
BoxFun
2
(\v ->
let
x = v!0
y = v!1
p = getPrecision v
eps = 1/2^(23)
_i = 4
in
(- (sqrt x - (y+x/y)/2) + (mpBallP p 1/2)^(2^i) + (mpBallP p 6) * eps * (i-1))
)
(fromListDomain [(0.633758544921875, 0.63385009765625), (0.79999999999999982236431605997495353221893310546875, 0.80006103515624982239142111428709114306911942549049854278564453125)])
heron4p :: BoxFun
heron4p =
BoxFun
2
(\v ->
let
x = v!0
y = v!1
_p = getPrecision v
_eps = 1/2^(23)
in
(sqrt x - (y+x/y)/2)
)
(fromListDomain [(0.5, 2.0), (0.8, 1.8)])
heron4q :: BoxFun
heron4q =
BoxFun
2
(\v ->
let
x = v!0
y = v!1
p = getPrecision v
eps = 1/2^(23)
in
((sqrt x - (y+x/y)/2) + (mpBallP p 1/2)^(2^i) + (mpBallP p 6) * eps * (i-1))
)
(fromListDomain [(0.5, 2.0), (0.8, 1.8)])
-- heronFull :: BoxFun
-- heronFull =
-- BoxFun
-- 3
-- (\v ->
-- let
-- x = v!0
-- y = v!1
-- i = v!2
-- p = getPrecision v
-- eps = 1/2^(23)
-- in
-- ((sqrt x - (y+x/y)/2) + (mpBallP p 1/2)^(2^i) + (mpBallP p 6) * eps * (i-1))
-- )
-- (fromListDomain [(0.5, 2.0), (0.8, 1.8), (1.0, 5.0)])
mxp1 :: BoxFun
mxp1 =
BoxFun
2
(\v ->
let
x = v!0
-- y = v!1
in
-x+1
)
(fromListDomain [(0.0, 2.0), (0.0, 2.0)])
xm1 :: BoxFun
xm1 =
BoxFun
2
(\v ->
let
x = v!0
-- y = v!1
in
x-1
)
(fromListDomain [(0.0, 2.0), (0.0, 2.0)])
xe2p1 :: BoxFun
xe2p1 =
BoxFun
2
(\v ->
let
x = v!0
-- y = v!1
in
x^2+1
)
(fromListDomain [(0.0, 2.0), (0.0, 2.0)])
xe2m1 :: BoxFun
xe2m1 =
BoxFun
2
(\v ->
let
x = v!0
-- y = v!1
in
x^2-1
)
(fromListDomain [(0.0, 2.0), (0.0, 2.0)])