Передача странного дескриптора функции решателям MATLAB ode — что означает этот код?

Я знаю, как использовать ode15s или другой решатель ode в 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) 

person Kamran Bigdely    schedule 28.03.2011    source источник


Ответы (2)


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

fhandle = @(arglist) expr

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

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

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

person gnovice    schedule 29.03.2011
comment
На самом деле вы можете передать дополнительные параметры большинству подпрограмм оды, которые будут успешно переданы в функцию решения после t и y. например ode15s(@computeRates, tspan, INIT_STATES, options, CONSTANTS); будет работать нормально, это поведение не задокументировано и может измениться в будущем. Я также должен упомянуть, что в этом случае те же аргументы также будут добавлены к аргументам функции событий и т. д., чего не будет в случае формы анонимной функции. - person crobar; 18.01.2012

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

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

f(2,3)
ans = 

    5
person abcd    schedule 28.03.2011