Re: NMinimize problem: fct minimized uses FindRoot
- To: mathgroup at smc.vnet.net
- Subject: [mg123702] Re: NMinimize problem: fct minimized uses FindRoot
- From: W Craig Carter <ccarter at mit.edu>
- Date: Fri, 16 Dec 2011 05:45:20 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <201112101227.HAA19219@smc.vnet.net> <201112141100.GAA10112@smc.vnet.net>
Hello,
I didn't understand the rationale for the "do not use Return" maxim, so
I constructed a little experiment:
(****** snip start *******)
(*list of lists of random lengths*)
temp = RandomInteger[{0, 100}, #] & /@ RandomInteger[{1, 100},
100000];
(*artificial examples of using Throw or Return*)
returnExample[x_] := Module[
{max, min},
If[Total[x] < 100, Return[0]];
{max, min} = {Max[x], Min[x]};
max^min
]
throwExample[x_] := Module[
{max, min},
If[Total[x] < 100, Throw[0]];
{max, min} = {Max[x], Min[x]};
max^min
]
(*timings*)
Timing[returnExample /@ temp;]
(*I get: {1.08535, Null}*)
Timing[Catch[throwExample[#]] & /@ temp;]
(*I get: {1.20134, Null}*)
(*******snip end********)
OK, this is artificial, but how do I understand why Return is eschewed
when it appears to be faster and its construction is simpler?
Thanks, Craig
W Craig Carter
Professor of Materials Science, MIT
On Dec 14, 2011, at Wed, Dec 14, 11 ---6:00 AM, DrMajorBob wrote:
> There's a large gap between "explained and justified" versus "worth
the
> trouble" or even "sensible".
>
> Do not use Return. It isn't worth the spit you'll need to polish it.
>
> Bobby
>
> On Tue, 13 Dec 2011 04:39:04 -0600, 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
>>
>>
>
>
> --
> DrMajorBob at yahoo.com
>
- References:
- NMinimize problem: fct minimized uses FindRoot
- From: "Doug Tinkham" <dtinkham@live.ca>
- Re: NMinimize problem: fct minimized uses FindRoot
- From: DrMajorBob <btreat1@austin.rr.com>
- NMinimize problem: fct minimized uses FindRoot