Я пытаюсь реализовать определенный тип прогнозирующего управления моделью в среде Simulink-Matlab. Для этого я планировал, чтобы динамическая модель в Simulink вызывала внешнюю S-функцию Matlab, которая, в свою очередь, запускала оптимизацию, вызывающую другой файл Simulink. Следовательно, поток программы будет следующим: Simulink -> Matlab (fmincon
или quadprog
) -> Simulink.
Как видите, S-функция Matlab будет вызывать либо fmincon
, либо quadprog
, но я хотел бы использовать fmincon для своего конкретного типа управления. Пожалуйста, пока игнорируйте любые вопросы, связанные с вычислительной эффективностью.
Я попробовал этот подход, но есть две очень явные проблемы: * Во-первых, чтобы скомпилировать код без ошибок (по сути, получение .mex-файла, мне пока не нужно программировать на C), я добавил команду
coder.extrinsic('fmincon');
Это было необходимо, поскольку в противном случае Simulink не сможет скомпилировать mex-файл. Однако, если вы сделаете это, вы получите следующую ошибку:
Function handles cannot be passed to extrinsic functions.
Я попытался изменить свою функцию стоимости, вызывающую Simulink, на другую, более простую функцию стоимости (x.^2
), но все еще получаю сообщение об ошибке.
В поисках решения проблемы я нашел тот же вопрос (т.е. как вызвать fmincon
из функции Matlab в Simulink) в блоге Mathworks, но без ответа (https://uk.mathworks.com/matlabcentral/answers/65202-optimization-calling-fmincon-in-simulink-embedded-block).
Может ли кто-нибудь дать мне руку? Заранее спасибо!
MATLAB Function
, а не S-функцию m-кода. БлокиMATLAB Function
преобразуются в C и компилируются во время инициализации модели и поддерживают только подмножество языка MATLAB. Вам нужно написать m-код S-функции. Они не преобразуют m-код в C, а запускают его (как интерпретируемый код) в стандартном вычислительном движке MATLAB и, следовательно, поддерживают полный язык MATLAB. - person Phil Goddard   schedule 05.02.2017MATLAB Function
в качестве оболочки вокруг другой функции m-кода. ВMATLAB Function
вы определяете свою другую функцию как внешнюю и просто передаете ей соответствующие входные данные и получаете результат обратно в модель Simulink. Затем в другой функции определите оптимизацию, которую необходимо выполнить. - person Phil Goddard   schedule 06.02.2017fmincon
. - person Filip Cvejic   schedule 11.10.2020Function handles cannot be passed to extrinsic functions
здесь. - person Filip Cvejic   schedule 11.10.2020