Как преобразовать символьное выражение в дескриптор функции для оптимизации [Matlab]?

avatar
sgyyhzd
8 апреля 2018 в 02:14
1600
1
1
syms a12 a13
x=sym('x',[1,2]);
fun=a12+a13
fun=subs(fun,[a12 a13],[x(1) x(2)])
%fun=matlabFunction(fun)
fun = @(x) fun

Я использую метод замены всех символов в символьном выражении вектором переменных и преобразования символьного выражения в функцию @(x), чтобы можно было использовать эту функцию для оптимизации.

Источник
sgyyhzd
8 апреля 2018 в 02:17
0

Я пробовал «matlabFunction», но, кажется, рассматриваю (x1, x2) как переменные вместо вектора x

Ответы (1)

avatar
Tommaso Belluzzo
8 апреля 2018 в 12:20
0

Вы были на правильном пути, когда решили использовать matlabfunction. Однако вы, вероятно, пропустили один из его необязательных параметров, явно Vars;

.

Порядок входных переменных или векторов в сгенерированной функции MATLAB, заданный как вектор символов, вектор символьных переменных или одномерный массив ячеек из символьных векторов, символьных переменных, или векторы символьных переменных.

Количество указанных входных переменных должно быть равно или превышать количество свободных переменных в f. Не используйте одни и те же имена для ввода переменные, указанные Vars, и выходные переменные, указанные Выходы.

По умолчанию при преобразовании символьных выражений порядок алфавитный. Когда вы конвертируете символьные функции, их вход аргументы появляются перед другими переменными, и все остальные переменные сортируются в алфавитном порядке.

См. Указание входных аргументов для сгенерированной функции

syms a12 a13;
x = sym('x',[1,2]);
fun = a12 + a13;
fun=subs(fun,[a12 a13],[x(1) x(2)]);
g = matlabFunction(fun,'Vars',{x})

g =   
    function_handle with value:
      @(in1)in1(:,1)+in1(:,2)

Для проверки, работает ли это:

k = [1 2];
g(k) % Output: 3