Дескриптор рекурсивной функции в 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
Инструкции можно найти здесь.