Передача странного дескриптора функции в MATLAB ode solvers - Что означает этот код? - PullRequest
3 голосов
/ 29 марта 2011

Я знаю, как использовать ode15s или другой решатель од в MATLAB, в чем я не уверен, является ли этот код (из CellML ) мне неясным:

[VOI, STATES] = ode15s(@(VOI, STATES)computeRates(VOI, STATES, CONSTANTS), tspan, INIT_STATES, options);

Более конкретно, что означает следующее (?):

@(VOI, STATES)computeRates(VOI, STATES, CONSTANTS)

Заголовок функции "computeRates" следующий:

function [RATES, ALGEBRAIC] = computeRates(t, STATES, CONSTANTS)

Я знаю, что "@computeRates" означает дескриптор функции, но что означает

@(VOI, STATES)computeRates(VOI, STATES, CONSTANTS)

Почему он ставит (VOI, STATES) между @ и "computeRates"?

Кстати, согласно справке MATLAB, если мы хотим интегрировать следующую функцию:

function dy = rigid(t,y)
dy = zeros(3,1);    % a column vector
dy(1) = y(2) * y(3);
dy(2) = -y(1) * y(3);
dy(3) = -0.51 * y(1) * y(2);

нам нужно только написать:

options = odeset('RelTol',1e-4,'AbsTol',[1e-4 1e-4 1e-5]);
[T,Y] = ode45(@rigid,[0 12],[0 1 1],options) 

Ответы [ 2 ]

2 голосов
/ 29 марта 2011

Как R. М. правильно указывает , то, что вы видите в этом коде, является анонимной функцией . Создание одного происходит следующим образом:

fhandle = @(arglist) expr

Где arglist - список входных аргументов, которые используются при вычислении выражения функции expr.

Что вас может смутить, так это , почему код требует создания анонимной функции вместо простого использования дескриптора функции для существующей функции. Процедуры решателя MATLAB, такие как ode15s и ode45, передают только два входа в переданный им дескриптор функции: скаляр t и вектор столбца y. Если у вас возникла ситуация, когда вы хотите, чтобы в функцию было передано больше параметров, чтобы определить ее поведение, вы должны передать функции эти параметры другими способами, как описано в документации для параметризационных функций .

Анонимные функции - один из способов сделать это. В вашем примере вы можете видеть, что функция computeRates принимает третий аргумент CONSTANTS, который снабжает функцию дополнительными параметрами. Когда выполняется анонимная функция, этот третий ввод фиксируется на значении (значениях), которые он содержал в тот момент. Таким образом, анонимная функция действует как оболочка, которая заставляет функцию с тремя входами вести себя как функция с двумя входами, так что она может использоваться подпрограммами решателя, снабжая упакованную функцию дополнительными входными данными, в которых она нуждается, что процедуры подсистемы не могут перейти к нему.

2 голосов
/ 29 марта 2011

Они называются анонимными функциями, и позволяют вам создавать короткие, изящные функции на лету, не создавая отдельный файл m. Две переменные в скобках после символа @ являются входными данными для функции. Далее следует определение функции. Например,

f=@(x,y)x+y;%# define an anonymous function to add the two inputs

f(2,3)
ans = 

    5
...