Hi everyone,
First of all, thanks very much for GSLL. It's impressively comprehensive, and it's making my life a lot easier.
I've been using `gsl:make-multi-dimensional-minimizer-f' in one of my projects for a while now, and I'm looking at switching to one of the gradient-based methods instead. However, I can't figure out how SCALARSP works with the f-and-gradient function.
As a very simple example, consider the function F(x1 x2) = x1^2 + x2^3:
(defun f (x1 x2) (+ (* x1 x1) (* x2 x2 x2)))
For the function-and-gradient function, I need to return the value at [x1 x2], plus a vector of 2 partial derivatives. In total that's 3 items, so I had thought that the following function would work:
(defun h (x1 x2) (values (+ (* x1 x1) (* x2 x2 x2)) (* 2 x1) (* 3 x2 x2)))
However, when I try to use it like so:
(gsl:make-multi-dimensional-minimizer-fdf gsl:+vector-bfgs2+ 2 '(f g h) #m(9.0 9.0) 0.1d0 0.1d0 t)
I get a TYPE-ERROR: The value NIL is not of type DOUBLE-FLOAT. I'm fairly sure that my definition of H is the problem here, because when I trace F, G, and H, H is the only function that gets called.
I've also tried having H return F(X) as the first value and the gradient vector as the second value, but no dice. (SBCL complains that a double-float vector is not a double-float, which is true. :)
I'm running SBCL and the most recent version of GSLL (I pulled from the master branch about an hour ago). Could anyone give me a hint as to what I'm doing wrong here? I could always implement using non-scalarsp functions, but if that's the only fix, then it seems pointless for make-multi-dimensional-minimizer-fdf to take a scalarsp argument in the first place.
Thanks very much! James
On Tue, Jun 9, 2009 at 6:34 PM, James Wrightjames@chumsley.org wrote:
Hi everyone,
First of all, thanks very much for GSLL. It's impressively comprehensive, and it's making my life a lot easier.
Thanks. Slowly, still more is coming, not complete yet...
I've been using `gsl:make-multi-dimensional-minimizer-f' in one of my projects for a while now, and I'm looking at switching to one of the gradient-based methods instead. However, I can't figure out how SCALARSP works with the f-and-gradient function.
As a very simple example, consider the function F(x1 x2) = x1^2 + x2^3:
You're trying to minimize a cubic? See below.
(defun f (x1 x2) (+ (* x1 x1) (* x2 x2 x2)))
For the function-and-gradient function, I need to return the value at [x1 x2], plus a vector of 2 partial derivatives. In total that's 3 items, so I had thought that the following function would work:
(defun h (x1 x2) (values (+ (* x1 x1) (* x2 x2 x2)) (* 2 x1) (* 3 x2 x2)))
However, when I try to use it like so:
(gsl:make-multi-dimensional-minimizer-fdf gsl:+vector-bfgs2+ 2 '(f g h) #m(9.0 9.0) 0.1d0 0.1d0 t)
I get a TYPE-ERROR: The value NIL is not of type DOUBLE-FLOAT. I'm fairly sure that my definition of H is the problem here, because when I trace F, G, and H, H is the only function that gets called.
I've also tried having H return F(X) as the first value and the gradient vector as the second value, but no dice. (SBCL complains that a double-float vector is not a double-float, which is true. :)
I'm running SBCL and the most recent version of GSLL (I pulled from the master branch about an hour ago). Could anyone give me a hint as to what I'm doing wrong here? I could always implement using non-scalarsp functions, but if that's the only fix, then it seems pointless for make-multi-dimensional-minimizer-fdf to take a scalarsp argument in the first place.
Thanks very much! James
There was definitely a bug in the multidimensional minimizer code, which I've now fixed, so do a fresh pull of master. Thanks for the alert. However, you are giving it a function which has no minimum, because the cubic is unbounded negative. I was kind of hoping GSL would alert you to this fact, but in fact it gets a "solution" which is a bit hard to explain (and definitely not a minimum).
I have created a scalar example which is the same as the vector case, the parabaloid, at the end of the file minimization-multi.lisp. It gets an answer identical to the vector result. It has been added to the examples/tests 'minimization-multi.
Liam
Hi Liam,
As a very simple example, consider the function F(x1 x2) = x1^2 + x2^3:
You're trying to minimize a cubic?
Ha! Whoops. Clearly I should have come up with a less-clueless example. The (non-polynomial) functions that I'm actually trying to minimize do have minima.
There was definitely a bug in the multidimensional minimizer code, which I've now fixed, so do a fresh pull of master.
Thanks very much, that's done the trick.
However, you are giving it a function which has no minimum, because the cubic is unbounded negative. I was kind of hoping GSL would alert you to this fact, but in fact it gets a "solution" which is a bit hard to explain (and definitely not a minimum).
That is kind of confusing. Indeed, after several iterations, gsll:solution actually returns a location that has a larger function value than a location that has been returned on a previous iteration, which kind of puts the lie to the libgsl documentation's claim that gsl_multimin_fdfminimizer_x returns the best estimate of the location of the minimum at all times. Unless they have some notion of "best estimate of the location of the minimum" that does not include "the location where I have computed the smallest value so far".
Thanks again for the speedy fix! James