Re: Repackaging function arguments
- To: mathgroup at smc.vnet.net
- Subject: [mg124950] Re: Repackaging function arguments
- From: "Oleksandr Rasputinov" <oleksandr_rasputinov at ymail.com>
- Date: Mon, 13 Feb 2012 03:44:02 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <jh82ma$oh8$1@smc.vnet.net>
On Sun, 12 Feb 2012 10:01:46 -0000, Sam Takoy <sam.takoy at yahoo.com> wrote:
> Hi,
>
> Suppose I have a variable
>
> params = {AccuracyGoal -> 30, PrecisionGoal -> 30, WorkingPrecision ->
> 50}
>
> How do I "repackage" it so I can pass it to functions such as
> FindRoot?
>
> Thank you in advance,
>
> Sam
>
These would usually be considered options rather than arguments, although
of course one could use the same approach with arguments proper. Anyway,
the solution is:
FindRoot[Sin[x] + Exp[x], {x, 0}, Evaluate[Sequence@@params]]
Note that Evaluate is essential here because FindRoot has the attribute
HoldAll. You have to be a little careful with evaluation control when
using this technique; for example when x has a value:
x = 1;
params = {Sin[x] + Exp[x], {x, 0}, AccuracyGoal -> 30, PrecisionGoal ->
30, WorkingPrecision -> 50};
FindRoot@Evaluate[Sequence @@ params]
does not work, but
params = {Unevaluated[Sin[x] + Exp[x]], Unevaluated[{x, 0}], AccuracyGoal
-> 30, PrecisionGoal -> 30, WorkingPrecision -> 50};
Block[{Unevaluated = Sequence},
FindRoot@Evaluate[Sequence @@ params]
]
does (albeit with a misleading message and strange-looking output because
of inappropriate substitutions for x during the evaluation).