hmatrix-0.1.0.0: examples/minimize.hs
-- the multidimensional minimization example in the GSL manual
import Numeric.GSL
import Numeric.LinearAlgebra
import Graphics.Plot
import Text.Printf(printf)
-- the function to be minimized
f [x,y] = 10*(x-1)^2 + 20*(y-2)^2 + 30
-- its gradient
df [x,y] = [20*(x-1), 40*(y-2)]
-- the conjugate gradient method
minimizeCG = minimizeConjugateGradient 1E-2 1E-4 1E-3 30
-- a minimization algorithm which does not require the gradient
minimizeS f xi = minimizeNMSimplex f xi (replicate (length xi) 1) 1E-2 100
-- Numerical estimation of the gradient
gradient f v = [partialDerivative k f v | k <- [0 .. length v -1]]
partialDerivative n f v = fst (derivCentral 0.01 g (v!!n)) where
g x = f (concat [a,x:b])
(a,_:b) = splitAt n v
main = do
-- conjugate gradient with true gradient
let (s,p) = minimizeCG f df [5,7]
print s -- solution
disp p -- evolution of the algorithm
let [x,y] = drop 2 (toColumns p)
mplot [x,y] -- path from the starting point to the solution
-- conjugate gradient with estimated gradient
let (s,p) = minimizeCG f (gradient f) [5,7]
print s
disp p
mplot $ drop 2 (toColumns p)
-- without gradient, using the NM Simplex method
let (s,p) = minimizeS f [5,7]
print s
disp p
mplot $ drop 3 (toColumns p)
disp = putStrLn . format " " (printf "%.2f")