When using ODE45 (or similar functions), what is the benefit of using anonymous functions over passing additional parameters as trailing arguments?

152 views (last 30 days)
Jiro Doke
Jiro Doke on 24 Feb 2011
Commented: Walter Roberson on 21 Apr 2019
When I want to solve a differential equation with additional parameters
function dx = myfun(t, x, p1, p2)
using ode45, I used to call it by passing the parameters as trailing arguments:
[T, Y] = ode45(@myfun, ts, x0, [], p1, p2);
Now, the documentation recommends that I use anonymous functions instead:
[T, Y] = ode45(@(t,x) myfun(t, x, p1, p2), ts, x0);
What is the benefit of the latter method over the former?

Accepted Answer

Jiro Doke
Jiro Doke on 24 Feb 2011
These are some comments I received from a developer:
  1. Some of the newer "function functions" that were introduced since we switched to the newer methods don't support the older syntax. For example, the older BVP solver bvp4c allows the trailing parameters syntax, while the newer BVP solver bvp5c does not. Thus switching from one solver to another will work if you use the anonymous or nested function approach (well, at least back to release R14 when we introduced anonymous and nested functions) but may not if you use the trailing parameters syntax. Similarly, quad supports trailing parameters while quadgk does not. This was a deliberate decision based on the experiences we've had with the two other considerations below.
  2. If you use the trailing parameters syntax for a function function that receives (either directly or via the options structure) multiple functions, all those functions must accept all the trailing parameters, even if they don't use any of them. So if you call ode45 with an ODE function and an options structure that sets the OutputFcn, Jacobian, Events and Mass options to be function handles and each of those takes a distinct additional parameter, all five functions will need to accept all five additional parameters.
  3. If you want to call quad with a function handle and limits of integration (just the required inputs) and an additional parameter you will need to specify empty arrays for the tol and trace inputs. Failing to do so will result in MATLAB using one of your additional parameters as the tolerance or trace value and passing one too few additional parameters into your function handle. This causes a lot of confusion for users, somewhat for quad, but even more for one of the Optimization Toolbox "function functions": fmincon. fmincon has only four required inputs but the additional parameters don't start until the eleventh input. [fun, x0, A, b are required; Aeq, beq, lb, ub, nonlcon, options are optional.] Missing a [] and having fmincon error while trying to interpret your first additional parameter as an options structure happens fairly frequently.
  4. Personally, I like having the additional parameters included right next to (indeed, inside) the function that uses them as opposed to at the end of a (potentially long; see fmincon) function call. In my opinion, the locality helps readability.

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!