Re: R: Local iterator
- To: mathgroup at smc.vnet.net
- Subject: [mg29409] Re: [mg29398] R: Local iterator
- From: BobHanlon at aol.com
- Date: Mon, 18 Jun 2001 03:39:09 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
In a message dated 2001/6/16 10:56:16 PM, vvasta at btinternet.com writes:
>Given a function y = f[x] I would like to write a function that returns,
>for a given interval and a
>given step, the maximum value of y, and the x that generated this value.
>For
>example:
>
> In[4] := funMax[ Log[x]/x^3 ,x ,1 ,3 ,0.001 ]
> Out[4]= {0.122626, 1.396}
>
>With my very little knowledge of Mathematica I wrote funMax like this:
>
> Clear[funMax];
> SetAttributes[funMax, HoldAll];
> funMax[fun_, v_, x1_, x2_, step_] := Block[
> {v, maxVal = {0, 0} , fval},
> For[v = x1, v <= x2, v += step,
> fval = fun;
> If [maxVal[[1]] < fval,
> maxVal = { fval, v}, 0]
> ];
> maxVal
> ]
>
>This function works and I'm happy with that but I would like to know how
>can
>I write it using an
> iterator. It is just a curiosity about the language.
>
SetAttributes[funMax1, HoldAll];
funMax1[fun_, v_, x1_, x2_, step_] :=
Block[{v, maxVal = {0, 0} , fval},
For[v = x1, v <= x2, v += step,fval = fun;
If [maxVal[[1]] < fval,maxVal = { fval, v}, 0]];
maxVal];
SetAttributes[funMax2, HoldFirst];
funMax2[func_, {x_Symbol, x1_?NumericQ, x2_?NumericQ, xstep_:1}] :=
Module[{},
Last[Sort[Table[{func, x}, {x, x1, x2, xstep}]]]];
funMax1[Log[x]/x^3, x, 1, 3, 0.001]//Timing
{0.4499999999970896*Second,
{0.12262643786818798, 1.3959999999999564}}
funMax2[Log[x]/x^3, {x, 1, 3, 0.001}]//Timing
{0.21666666665987577*Second,
{0.12262643786818797, 1.396}}
However, finding the actual maximum is much faster than these estimations
({-#[[1]], x/.#[[2]]}& [FindMinimum[-Log[x]/x^3, {x, 1.5}]])//Timing
{0.01666666667733807*Second,
{0.12262648039045491, 1.3956127273029095}}
Bob Hanlon
Chantilly, VA USA