Re: Re: Gradient Option in FindMinimum

*To*: mathgroup at smc.vnet.net*Subject*: [mg13413] Re: [mg13265] Re: Gradient Option in FindMinimum*From*: Carl Woll <carlw at fermi.phys.washington.edu>*Date*: Thu, 23 Jul 1998 03:32:58 -0400*Sender*: owner-wri-mathgroup at wolfram.com

Hi Robert, Sorry to post this to you a second time, but my previous post seems to have been garbled a bit. I noticed your response to Chris' question, but it leaves me somewhat confused. Consider the following: f1=2 x; f2={2 x}; FindMinimum[x^2, {x,1.}, Gradient->2 x] FindMinimum[x^2, {x,1.}, Gradient->{2 x}] FindMinimum[x^2, {x,1.}, Gradient->f1] FindMinimum[x^2, {x,1.}, Gradient->f2] FindMinimum[x^2, {x,1.}, Gradient->{f1}] fail, but instead, the only one that has an error is the one with f2, which is essentially the one that gave Chris problems. All the others return the same, correct, answer. So, the problem with f2 must be a little more complicated then the HoldAll attribute of FindMinimum. Perhaps you could explain what is going on here? Thanks, Carl Woll Dept of Physics U of Washington On Fri, 17 Jul 1998, Robert Knapp wrote: > Chris Farr wrote: > > > > Math Group: > > > > Is the following a bug? > > > > First, I set nameofgrad equal to 2*x. > > > > In[32]:= nameofgrad = {2*x} > > Out[32]= {2 x} > > > > Second, I show that if {2*x} is put directly into the FindMin. = > > expression everything works okay. > > > > In[33]:= FindMinimum[x^2,{x,1.},Gradient->{2* x}] Out[33]= { 0.,{x > > -> 0.} } > > > > Third, here is the bug (I think), when I put nameofgrad into the = > > FindMin. expression (which is just equal to {2*x}), I get an error = > > message! > > > > In[34]:= FindMinimum[x^2,{x,1.},Gradient->nameofgrad] > > > > FindMimimum::fmgl : Gradient {{2.}} is not a length 1 list of real = > > numbers at {x} = {1.} > > > > Can anyone duplicate this on their machine? Any ideas? > > > > This is quite reproducible since it is caused by the evaluation > semantics of FindMinimum, in particular that it has the HoldAll > attribute. Thus, the arguments are passed to the function unevaluated, > so FindMinimum sees the gradient as just the symbol nameofgrad which is > noty a list. Since it needs the gradient to be a list, it warps a list > around that, leading to your eventual problem. > > This can easily be remedied by simply using > > FindMinimum[x^2,{x,1.},Evaluate[Gradient->nameofgrad]] > > which forces the third argument to be evaluated. > > Rob Knapp >