Дескриптор рекурсивной функции в MATLAB

Предположим следующее:

u=[1 2 3];
W_in=[4 5 6]';
W=[1 2 3;4 5 6;7 8 9];
x=zeros(3,4); %initialization
x(:,1)=[1 2 3]';

Как я могу создать дескриптор функции такой, что:

x(:,i)=@(gamma) (1-gamma)*x(:,i-1)+gamma*(W*x(:,i-1)+W_in*u(i-1)) 

где gamma это скаляр от 0 до 1.

Поскольку я НЕ МОГУ использовать двойной массив для хранения дескриптора функции, я попытался использовать массив ячеек для хранения дескрипторов функций, сгенерированных в цикле:

x=cell(1,4);
x{1}=[1 2 3]';
for i=2:4,
    x{i}=@(gamma) (1-gamma)*x{i-1}+gamma*(W*x{i-1}+W_in*u(i-1)) 
end

Если я установлю гамму на 0,4 и попытаюсь получить доступ к x{2}(0,4), я получу [7,8 16 24,2]', и это то, что я хочу. Однако, когда я пытаюсь получить доступ к x{3}(0.4), я получаю сообщение об ошибке "Неопределенный оператор" * для входных аргументов типа "function_handle". '

Хорошо, тогда я изменяю дескриптор функции следующим образом,

x{i}=@(gamma) (1-gamma)*x{i-1}(gamma)+gamma*(W*x{i-1}(gamma)+W_in*u(i-1)) 

На этот раз, когда я пытаюсь получить доступ к x{2}(0.4), я получаю еще одну ошибку, говорящую "Индексы нижнего индекса должны быть либо натуральными натуральными числами, либо логическими.", Что означает, что 0.4 не следует использовать в качестве индекса. Здесь меня смущает то, что раньше я мог делать X{2}(0.4), но на этот раз MATLAB, похоже, интерпретирует x{i}(j) по-другому, на этот раз j должно быть целым числом и не может быть десятичными. Поэтому я не знаю, где в этом случае назначить значение гаммы и как избавиться от ошибки.

Обычно причина, по которой мне нужен дескриптор функции, заключается в том, что я помещу окончательный дескриптор функции ошибки, который включает только гамму, в генетический алгоритм ga() или другую встроенную функцию оптимизации в MATLAB и найду оптимальное значение для гаммы.

Итак, в конце концов, когда у меня в конце концов появятся массивы ячеек функций, х-х. я мог бы сделать

errorFunction=@(gamma) sum(arrayfun(@(x_q,y_q) y_q-x_q{1}(gamma),x,y));
[gamma global_minimum]=ga(errorfunction,1);

чтобы получить мою оптимальную гамму.

1 ответ

Вы также должны передать аргумент предыдущим функциям, тогда все будет работать так, как вы хотели:

u=[1 2 3];
W_in=[4 5 6]';
W=[1 2 3;4 5 6;7 8 9];
x=cell(1,4);
x{1}=@(gamma)[1 2 3]';
for i=2:4,
    x{i}=@(gamma) (1-gamma)*x{i-1}(gamma)+gamma*(W*x{i-1}(gamma)+W_in*u(i-1)) 
end

Если вы опустите (gamma) в x{i-1}(gamma) затем вы пытаетесь умножить скаляр на дескриптор функции, который, очевидно, не будет работать. И если вы опустите @(gamma) в определении x{1} тогда вы пытаетесь позвонить x{1} как функция (в x{2}), но на самом деле Matlab замечает, что это не функция, а просто постоянная матрица, поэтому он пытается использовать (..) как индекс, но так как это число с плавающей запятой (вы сказали, например, 0.5) он выдаст указанную ошибку при индексации.

Напоследок: использование таких дескрипторов функций работает, но не очень хорошо: это довольно медленно, особенно если у вас большое количество вложенных вызовов. В противном случае вы можете построить многочлен, так как это просто построение выражения многочлена в gammaИнструкции можно найти здесь.

Другие вопросы по тегам