MathGroup Archive 2005

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

Search the Archive

Re: Nestwhile

  • To: mathgroup at smc.vnet.net
  • Subject: [mg57228] Re: [mg57201] Nestwhile
  • From: DrBob <drbob at bigfoot.com>
  • Date: Sat, 21 May 2005 02:39:58 -0400 (EDT)
  • References: <200505200844.EAA00668@smc.vnet.net>
  • Reply-to: drbob at bigfoot.com
  • Sender: owner-wri-mathgroup at wolfram.com

First of all, d[e_,dw_] should be defined (like that) with patterns on the left.

Secondly, d is used with three arguments but not defined in that case.

Third, NestWhile's first and third arguments should be functions, for instance {e += 0.01, dw += 0.1} &, not just a loop body.

Fourth, NestWhile stops after one iteration because the test fails immediately -- e==1 isn't true, and the other test fails even before that. Maybe you meant NestUntil -- but there is no such thing in Mathematica.

Fifth, w is undefined.

Sixth, never, ever use Return. If it's the last thing in a Module (the only time it doesn't promote spaghetti-code), it's a waste of keystrokes, since the last expression is returned anyway.

Possibly you meant something more like this:

Module[{e = 0.05, dw = 0.04},
   NestWhile[(e += 0.01; dw += 0.1) &,
       anythingAtAllBecauseItIsNotUsed,
       ! (10^-2 < d[e, dw] < 0 || e == 1) &];
   Print@{dw,e};
   d[e, dw]
]

Seventh, there's no reason to group statements with List, when semicolons do just as well.

Eighth, you're not actually nesting anything, so While is far more appropriate:

Module[{e = 0.05, dw = 0.04},
   While[! (10^-2 < d[e, dw] < 0 || e == 1), e += 0.01; dw += 0.1];
   Print@{dw, e}; d[e, dw]]

Finally, there's nothing in your code to select a minimum. Try Minimize or NMinimize.

Or something like this:

Module[{e = 0.05, dw = 0.04, best}, best = {Infinity, e, dw};
   While[! (10^-2 < d[e, dw] < 0 || e == 1), If[d[e, dw] < First@best, best = {
     d[e, dw], e, dw}]; e += 0.01; dw += 0.1];
   best]

or

Module[{e = 0.05, dw = 0.04, best, now}, best = {Infinity, e, dw};
   While[now = d[e, dw]; ! (10^-2 < now < 0 || e == 1),
      If[now < First@best, best = {now, e, dw}]; e += 0.01; dw += 0.1];
   best]

That doesn't work without a value for w, of course, and it varies e and dw in lock-step, rather than independently (like your code).

Bobby

On Fri, 20 May 2005 04:44:10 -0400 (EDT), Pratik Desai <pdesai1 at umbc.edu> wrote:

> Hi,
> I am having problem with using NestWhile in a code which basically boils
> down to finding values for the variables (e,dw)  for which a function
> d[e, dw] is "minimized" while one variable (e) goes up to 1. I have been
> using the following approach, which unfortunately loops for 1
> iteration..There is definitely a better probably a simpler  way to do
> this...Thanks in advance for your help
>
> Here is the attempt :
>
> d[ e, dw] =
> Abs[0. + 1143.8189785870038/((-2.0224920432639264 +
> e)*(22.50249204326393 + e)) +
>    (e^3*(-2.3561944901923435 -
> 1.3322676295501878*^-15*w))/((-2.0224920432639264 +
> e)*(22.50249204326393 + e)) -
>    56.548667764616276*w - (2573.5927018207585*dw)/((-2.0224920432639264
> + e)*(22.50249204326393 + e)) +
>    (e^2*(-73.38760438785755 +
> 56.54866776461624*dw))/((-2.0224920432639264 + e)*(22.50249204326393 +
> e)) +
>    (e*(-407.4855111216201 +
> 1158.1167158193412*dw))/((-2.0224920432639264 + e)*(22.50249204326393 +
> e))] +
>  8.*Abs[0. + 0./((-2.0224920432639264 + e)*(22.50249204326393 + e)) +
>     (0.*dw)/((-2.0224920432639264 + e)*(22.50249204326393 + e)) +
>     e^2*(0./((-2.0224920432639264 + e)*(22.50249204326393 + e)) +
> (0.*dw)/((-2.0224920432639264 + e)*
>         (22.50249204326393 + e))) + e*(0. + 0./((-2.0224920432639264 +
> e)*(22.50249204326393 + e)) +
>       (0.*dw)/((-2.0224920432639264 + e)*(22.50249204326393 + e)))] +
>  Abs[0. + (e*(-107.23302924253159 -
> 7.105427357601*^-14*dw))/((-2.0224920432639264 + e)*(22.50249204326393 +
> e)) +
>    (e^3*(2.3561944901923453 -
> 4.440892098500626*^-16*dw))/((-2.0224920432639264 +
> e)*(22.50249204326393 + e)) +
>    e^2*(48.25486315913923/((-2.0224920432639264 + e)*(22.50249204326393
> + e)) +
>      (0.*dw)/((-2.0224920432639264 + e)*(22.50249204326393 + e)))]
>
> Module[{e = 0.05, dw = 0.04}, NestWhile[{e += 0.01,dw += 0.1},
>    d[ e, dw],10^-2 <d[ e,  dw] <0&&e==1 ]; Print[dw,d[ e, dw],e];
> Return[d[j, e, dw], Module]]
>
> 0.14
> 25.415
>



-- 
DrBob at bigfoot.com


  • References:
    • Nestwhile
      • From: Pratik Desai <pdesai1@umbc.edu>
  • Prev by Date: Re: Optimization doing more function evaluations than claimed?
  • Next by Date: Re: Nestwhile
  • Previous by thread: Nestwhile
  • Next by thread: Re: Nestwhile