Jon Harrop email the right answers. So, ...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#light 
#nowarn "62" 
open Microsoft.FSharp.Math 


let rec fixedPoint f x = 
    match f x with 
    | fx when x = fx -> x 
    | x -> fixedPoint f x 


let partial_d f_xs f (xs: vector) i xi = 
    let delta = sqrt epsilon_float 
    xs.[i] <- xi + delta 
    try (f xs - f_xs) / delta finally 
    xs.[i] <- xi 


let grad f xs = 
    Vector.mapi (partial_d (f xs) f xs) xs 


let descend alpha beta f (f': _ -> vector) (lambda, xs: vector, f_xs) 
= 
    let xs_2 = xs - lambda * f' xs 
    let f_xs_2 = f xs_2 
    if f_xs_2 >= f_xs then 
        alpha * lambda, xs, f_xs 
    else 
        beta * lambda, xs_2, f_xs_2 


let gradient_descent f f' xs = 
    let _, xs, _ = 
        fixedPoint (descend 0.5 1.1 f f') (1.0, xs, f xs) 
    xs 


let f (v: vector) = 
    let x, y = v.[0], v.[1] 
    x**4.0 + y**2.0 - x**3.0 * y - 3.0 * x 


printfn "%A" (gradient_descent f (grad f) (vector [0.0; 0.0])) 


printfn "" 

The output shows:

vector [1.1274523; 0.716579731]

By on 2/12/2009 10:27 AM ()
IntelliFactory Offices Copyright (c) 2011-2012 IntelliFactory. All rights reserved.
Home | Products | Consulting | Trainings | Blogs | Jobs | Contact Us | Terms of Use | Privacy Policy | Cookie Policy
Built with WebSharper