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

79 ビュー (過去 30 日間)
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?

採用された回答

Jiro Doke
Jiro Doke 2011 年 2 月 24 日
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.
  8 件のコメント
SHIVANI TIWARI
SHIVANI TIWARI 2019 年 4 月 21 日
編集済み: SHIVANI TIWARI 2019 年 4 月 21 日
Actually i just need MATLAB coding for solving 2nd order differential equations using Runge kutta method.
Walter Roberson
Walter Roberson 2019 年 4 月 21 日
Actually, SHIVANA TIWARI, you need to open your own Question, not post in this unrelated topic.

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeOrdinary Differential Equations についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by