MathGroup Archive 2011

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

Search the Archive

Re: NMinimize problem: fct minimized uses FindRoot

  • To: mathgroup at smc.vnet.net
  • Subject: [mg123684] Re: NMinimize problem: fct minimized uses FindRoot
  • From: Oliver Ruebenkoenig <ruebenko at wolfram.com>
  • Date: Thu, 15 Dec 2011 04:56:14 -0500 (EST)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com
  • References: <201112141102.GAA10218@smc.vnet.net>


On Wed, 14 Dec 2011, Oleksandr Rasputinov wrote:

> On Tue, 13 Dec 2011 10:41:11 -0000, Andrzej Kozlowski <akoz at mimuw.edu.pl>
> wrote:
>
>>
>> On 12 Dec 2011, at 12:43, Oleksandr Rasputinov wrote:
>>
>>> For example, the erroneous usage:
>>>
>>> Block[{a = 1, b = 2}, Return[a]; Return[b]]
>>>
>>> gives:
>>>
>>> Return[1]
>>>
>>> but a correct usage:
>>>
>>> Do[Block[{a = 1, b = 2}, Return[a]; Return[b]], {1}]
>>>
>>> gives (because of the enclosing Do):
>>>
>>> 1
>>
>> This is not quite the whole story. For example, while the above use of
>> Return in Block does not work, this one (in a function call) does:
>>
>> f[] := Block[{a = 1, b = 2}, Return[a]; Return[b]]
>>
>> f[]
>>
>> 1
>>
>> Moreover, if you replace the Do loop in your example with a While loop,
>> you will get:
>>
>> n = 1; While[n < 10, Block[{a = 1, b = 2}, Return[a]; Return[b]]]
>>
>> Return[1]
>>
>> All of this is purposeful design and can be explained and justified but
>> I don't think it's worth the bother since Mathematica has far superior
>> means of flow control than this clumsy and arcane construct.
>>
>> Andrzej
>>
>
> Thanks for the additional examples. Yes, there are limitations to what
> Return (or Break, or Continue) will accept as a control flow construct; I
> imagine most people would have suspected that Block does not count but it
> is a little surprising to find that While doesn't either.
>
> The documentation for Return also states that "Return[expr] exits control
> structures within the definition of a function, and gives the value expr
> for the whole function", by which it apparently means that delayed
> definitions do count as enclosing control flow, although in apparent
> contradiction to the documented behaviour Function does not. (This seems
> to be another example of a virtually meaningless statement about functions
> in the documentation made on the assumption that the reader is stuck in
> the mindset of another language and prefers a loose analogy to the actual
> behaviour over a factually accurate account.)
>
> Oliver Ruebenkoenig's reply demonstrates the almost undocumented
> two-argument form of Return, the existence of which (I think) suggests
> that the list of constructs accepted by Return were not considered
> completely indisputable by the designers of Mathematica. However, the
> two-argument form still cannot be used inside Compile, where it seems it
> would be most useful.
>
>

Just for comepletness sake:

this does work

cf = Compile[{{n, _Integer}},
   Module[{res = 0}, Do[res += i; If[res > 10, Throw[0, cfe]], {i, n}];
     res]]

Catch[cf[111], cfe]


Related:
http://stackoverflow.com/questions/8184548/do-return-behave-differently-in-compile-why/8194565#8194565

Oliver



  • Prev by Date: Re: How to run ".nb" file always in dos command line
  • Next by Date: Re: Function calling another function that uses NSolve - can't get this
  • Previous by thread: Re: NMinimize problem: fct minimized uses FindRoot
  • Next by thread: Re: NMinimize problem: fct minimized uses FindRoot