MathGroup Archive 1999

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: typing starting values in FindMinimum

  • To: mathgroup at
  • Subject: [mg15503] Re: [mg15391] typing starting values in FindMinimum
  • From: BobHanlon at
  • Date: Mon, 18 Jan 1999 23:47:08 -0500
  • Sender: owner-wri-mathgroup at


In the reply below, for efficiency reasons, I should have applied Union
(to eliminate duplicates) prior to using Select to eliminate the
operator names. Those lines would then read

Union[f[[Sequence @@ #]]& /@ Position[f, _Symbol]]

vars = Select[%,LowerCaseQ[StringTake[ToString[#], 1]]&]

Bob Hanlon

In a message dated 1/12/99 7:21:27 AM, amaydeu at writes:

>Consider the use of FindMinimum when the function to be minimized
>depends on several variables
>e={0.56 -l1 l2,0.48 -l1 l3, 0.42 -l2 l3};
>{8.68919*^-23, {l1->.8, l2->.7, l3->.6}}
>Does anyone know to avoid having to type in all the variables names and
>starting values? 
>I have some problems with 100 variables!
>Of course I can construct
>start ={0.5,0.5,0.5};
>but that is not what FindMinimum is expecting.


e={0.56 -l1*l2,0.48 -l1*l3, 0.42 -l2*l3}; f = Apply[Plus,e^2];

To determine the variable names used in f

vars = Union[Cases[f, _Symbol, 4]]

{l1, l2, l3}

However, this requires all the variables to be at the same level.  If
this is not the case in the actual problem, 

f[[Sequence @@ #]]& /@ Position[f, _Symbol]

{Plus, Power, Plus, Times, l1, l2, Power, Plus, Times, 
  l1, l3, Power, Plus, Times, l2, l3}

To eliminate all of the names of the operators

vars = Union[Select[%,LowerCaseQ[StringTake[ToString[#], 1]]&]]

{l1, l2, l3}

This assumed that all the variables start with a lower case letter.

If all the starting values (estimates) are all the same

startValue = 0.5;
varStart = Transpose[{vars, 
			Table[startValue, {Length[vars]}]}];

Since you are using the Newton method, only one starting value is needed
for each variable and we have the required lists.  FindMinimum requires
that these be entered as a Sequence and the immediate application of
the Sequence must be forced (Evaluate):

FindMinimum[f, Evaluate[Sequence @@ varStart], 
	Method->Newton, Gradient->j]

  {l1 -> 0.7999999999868436, l2 -> 0.7000000000066607, 
   l3 -> 0.6000000000051076}}

Which is the result that you sought.

Bob Hanlon

  • Prev by Date: CellGroupingRules?
  • Next by Date: RE: HOW DO I........?
  • Previous by thread: Re: typing starting values in FindMinimum
  • Next by thread: list of lists