Re: Why is FindRoot[] HoldAll?
- To: mathgroup at smc.vnet.net
- Subject: [mg81980] Re: [mg81957] Why is FindRoot[] HoldAll?
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Mon, 8 Oct 2007 00:06:53 -0400 (EDT)
- References: <200710070940.FAA20590@smc.vnet.net>
On 7 Oct 2007, at 18:40, Szabolcs Horv=E1t wrote: > Recently there was a question about finding the roots of an equation > that is defined in terms of NIntegrate[]. > > The following *works*, but it gives lots of error messages: > > FindRoot[NIntegrate[Exp[a x], {x, 0, 1}] == 2, {a, 1}] > > The messages suggest that FindRoot evaluates the equation even before > the unknown 'a' is substituted with a numerical value. This is not > consistent with the fact that FindRoot has HoldAll. > > Would it be possible to > > 1. Either remove the attribute HoldAll to make it clear to the > users how > this function works (and allow FindRoot to receive Unevaluated > arguments > so that equations containing NIntegrate[] can be used directly), > > 2. Or prevent FindRoot from evaluating the equation before the unknown > has been substituted with a numerical value. > > If either of these two possibilities is implementable in Mathematica, > then IMO the current behaviour can be considered a bug. If they > are not > implementable, could someone explain why? > > -- > Szabolcs > I am not sure from your message if you are aware of this: FindRoot[NIntegrate[Exp[a x], {x, 0, 1}] == 2, {a, 1}, Evaluated -> False] {a -> 1.25643} No error messages. Of course, one would expect that using this option will in most cases have a negative impact ton the performance. Why the HoldAll attribute? Well, presumably without the HoldAll attribute the function would always be evaluated irrespective of any option settings so one could not use this approach. Not having the HoldAll or HoldFirst argument means that it will always be evaluated, before the function is applied. having it does not mean that the argument will not be evaluated; it only means it will not be "pre- evaluated". It may still be evaluated by the function itself. Andrzej Kozlowski
- References:
- Why is FindRoot[] HoldAll?
- From: Szabolcs Horvát <szhorvat@gmail.com>
- Why is FindRoot[] HoldAll?