Re: Help with NMinimize
- To: mathgroup at smc.vnet.net
- Subject: [mg82381] Re: Help with NMinimize
- From: Szabolcs Horvát <szhorvat at gmail.com>
- Date: Fri, 19 Oct 2007 04:52:28 -0400 (EDT)
- References: <ff1qmk$9eq$1@smc.vnet.net><ff4fse$dre$1@smc.vnet.net> <ff78qi$o1t$1@smc.vnet.net>
Flavio wrote:
> Thank you for your answer, I'm learning Mathematica and I think I will
> never stop doing it...
>
> I realized just after sending the message to have written (to the
> group) f[x,y,...] instead of f[x_,y_,...] , I'm sorry. Can you please
> tell me where in the help I can find the difference between the
> function declaration
>
> f[x_,y_] :=
>
> and your kind
>
> f[{x_,y_}]:=
>
> What's wrong with the first kind of declaration, which is used many
> times in the examples?
There is nothing wrong with it.
Note that if you have a function definition
fun[x_] := (Print[x]; x^2)
, then fun[a] evaluates to a^2 :
In[2]:= fun[a]
During evaluation of In[2]:= a
Out[2]= a^2
NMinimize evaluates the function passed to it with symbolic arguments
(and if possible, compiles it). Therefore NMinimize[fun[x], x] will see
x^2, and not (Print[x]; x^2).
One solution is to define the function in such a way that it does not
evaluates only with numeric (not symbolic) arguments:
In[3]:=
Clear[fun]
fun[x_?NumericQ]:=(Print[x];x^2)
In[5]:= fun[a]
Out[5]= fun[a]
In[6]:= fun[1]
During evaluation of In[6]:= 1
Out[6]= 1
Try NMinimize[fun[x], x] with this second version and you'll notice that
the Print[x] statement is evaluated for each number NMinimize
subsittues for x in fun[x].
I could have written simply
g[x1_?NumericQ, x2_?NumericQ, x3_?NumericQ,
x5_?NumericQ, x5_?NumericQ] := (...)
, but this is too tedious, so I used a more compact version, with a
named pattern (lst):
g[lst:{x1_, x2_, x3_, x4_, x5} /; And@@NumericQ/@lst] := (...)
The sole reason for putting {x1_, x2_, x3_, x4_, x5_} into a list was
that I wanted to avoid typing, and test that all of them are numerical
in one go. Probably the following solution is a better alternative:
g[x1_, x2_, x3_, x4_, x5_] :=
(...) /; VectorQ[{x1, x2, x3, x4, x5}, NumericQ]
Take a look at the following tutorials to learn about patterns:
http://reference.wolfram.com/mathematica/tutorial/Introduction-Patterns.html
http://reference.wolfram.com/mathematica/tutorial/PatternsAndTransformationRules.html
http://reference.wolfram.com/mathematica/tutorial/PatternsOverview.html
In Mathematica, f[x_] := x^2 isn't really a function definition. 'f' is
not a function in the mathematical sense, and it is not a subroutine
either (a function in the C sense). This expression is the definition
of a transformation rule, attached to the symbol 'f'. Whenever
Mathematica sees the symbol 'f', it checks whether it matches the
pattern f[_]. If it does, it replaces f[(argument)] with (argument)^2.
Many definitions can be attached to the same symbol, e.g.
factorial[0] = 1
factorial[n_Integer?Positive] := factorial[n-1]*n
(* this will be used if the previous two don't match: *)
factorial[_] = "error"
When several definitions are attached to the same symbol, Mathematica
always checks the "more specific" ones first, i.e. factorial[0] before
factoial[n_Integer?Positive], and factorial[n_Integer?Positive] before
factorial[_]. "More specific" is not defined clearly, and sometimes
Mathematica may not be able to decide which pattern is more specific and
which is more general. In this case they are tried in the order they
were defined.
Before you redefine a "function" with many attached rules, Clear[] it,
so old definitions are removed.
--
Szabolcs