MathGroup Archive 2009

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

Search the Archive

Re: Option instead of a function argument: is it possible?

  • To: mathgroup at smc.vnet.net
  • Subject: [mg98068] Re: Option instead of a function argument: is it possible?
  • From: Helen Read <hpr at together.net>
  • Date: Sun, 29 Mar 2009 02:46:07 -0500 (EST)
  • References: <gqkv21$4dn$1@smc.vnet.net>
  • Reply-to: HPR <read at math.uvm.edu>

Alexei Boulbitch wrote:
> Dear Community,
> 
> If we need to write functions depending upon several parameters the 
> latter are usually passed to the function as its arguments. I wonder 
> however, if you know a way to pass some parameters to a function in the 
> same way as options are passed to operators in Mathematica. That is, if 
> the default value of the parameter in question is OK,  you  do not even 
> mention such a parameter among the function arguments. If you need to 
> specify such a parameter you include an argument having the form 
> Option->optionValue.
> 
> Let me explain precisely within a simple example what I would like to:
> 
> 1. Consider a function that solves a system of 2 ordinary differential 
> equations and draws a trajectory on the (x, y) plane:
> 
> trajectory1[eq1_, eq2_, point_, tmax_] :=
>  Module[{s, eq3, eq4},
>   eq3 = x[0] == point[[1]];
>       eq4 = y[0] == point[[2]];
>   s = NDSolve[{eq1, eq2, eq3, eq4}, {x, y}, {t, tmax}];
>           ParametricPlot[Evaluate[{x[t], y[t]} /. s], {t, 0, tmax},
>    PlotRange -> All]]
> 
> Equations can be fixed say, like these:
> 
> eq1 = x'[t] == -y[t] - x[t]^2;
> eq2 = y'[t] == 2 x[t] - y[t]^3;
> 
> and initial conditions are passed by the parameter point. The function 
> can be called:
> 
> trajectory1[eq1, eq2, {1, 1}, 30]
> 
> 2. Assume now that I need to specify the accuracy goal and MaxSteps 
> parameters. Then the function will take a slightly different form:
> 
> trajectory2[eq1_, eq2_, point_, tmax_, accuracyGoal_, maxSteps_] :=
>  Module[{s, eq3, eq4},
>   eq3 = x[0] == point[[1]];
>       eq4 = y[0] == point[[2]];
>   s = NDSolve[{eq1, eq2, eq3, eq4}, {x, y}, {t, tmax},
>     AccuracyGoal -> accuracyGoal, MaxSteps -> maxSteps];
>           ParametricPlot[Evaluate[{x[t], y[t]} /. s], {t, 0, tmax},
>    PlotRange -> All]]
> 
> and also called:
> 
> trajectory2[eq1, eq2, {1, 1}, 30, 10, 1000]
> 
> However, I would like to achieve a function
> 
> trajectory3[eq1_, eq2_, point_, tmax_]
> 
>  that can be addressed both as
> 
> trajectory3[eq1, eq2, {1, 1}, 30]
> 
> (if I agree with the default values of the AccuracyGoal and MaxSteps) 
> and as
> 
> trajectory3[eq1, eq2, {1, 1}, 30, AccuracyGoal->10, MaxSteps->10000],
> 
> if a change in these options is necessary.  Is it possible?

Sure, you just need optional arguments to your function.

Here's a simple example.

f[x_, y_: 3, z_: 2] := x *y + z

y and z are optional arguments. If you don't specify them, the default 
values (3 and 2 respectively) are used.

Try evaluating these:

f[x]

f[x,5]

f[x,-4,6]

-- 
Helen Read
University of Vermont


  • Prev by Date: Re: Option instead of a function argument: is it possible?
  • Next by Date: Re: HoldAll for Integrate
  • Previous by thread: Re: Option instead of a function argument: is it possible?
  • Next by thread: Re: Option instead of a function argument: is it possible?