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
- References:
- Re: NMinimize problem: fct minimized uses FindRoot
- From: "Oleksandr Rasputinov" <oleksandr_rasputinov@hmamail.com>
- Re: NMinimize problem: fct minimized uses FindRoot