Re: Option instead of a function argument: is it possible?
- To: mathgroup at smc.vnet.net
- Subject: [mg98073] Re: Option instead of a function argument: is it possible?
- From: Bill Rowe <readnews at sbcglobal.net>
- Date: Sun, 29 Mar 2009 02:47:05 -0500 (EST)
On 3/28/09 at 5:44 AM, Alexei.Boulbitch at iee.lu (Alexei Boulbitch)
wrote:
>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:
<code with additional arguments snipped>
>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?
Yes, rewriting your function as:
trajectory1[eq1_, eq2_, point_, tmax_, opts___] :=
Module[{s, eq3, eq4},
eq3 = x[0] == point[[1]];
eq4 = y[0] == point[[2]];
s = NDSolve[{eq1, eq2, eq3, eq4}, {x, y}, {t, tmax}, opts];
ParametricPlot[Evaluate[{x[t], y[t]} /. s], {t, 0, tmax},
PlotRange -> All]]
will do the trick
Even better would be to use the function FilterRules as:
trajectory1[eq1_, eq2_, point_, tmax_, opts___] :=
Module[{s, eq3, eq4},
eq3 = x[0] == point[[1]];
eq4 = y[0] == point[[2]];
s = NDSolve[{eq1, eq2, eq3, eq4}, {x, y}, {t, tmax}, Sequence@@FilterR=
ules[{opts},Options[NDSolve]]];
ParametricPlot[Evaluate[{x[t], y[t]} /. s], {t, 0, tmax},
PlotRange -> All]]
Using FilerRules will prevent passing invalid options to
NDSolve. Also, for more complex problems using FilterRules
allows you to include options for other functions and pass only
the appropriate options on to each function you have in the body
of your code.
Finally, I note you can alter the AccuracyGoal and MaxSteps
without changing your original code. For example, doing
SetOptions[NDSolve, AccuracyGoal->10] before evaluating your
code will cause it to work with an AccuracyGoal of 10.