Сгенерируйте функции MATLAB из символьных выражений

Вы можете использовать matlabFunction чтобы сгенерировать MATLAB® указатель на функцию, который вычисляет числовые значения, как если бы вы подставляли числа для переменных в символьном выражении. Также, matlabFunction может создать файл, который принимает числовые аргументы и оценивает символьное выражение, примененное к аргументам. Сгенерированный файл доступен для использования в любом вычислении MATLAB, независимо от того, имеет ли компьютер, выполняющий файл, лицензию на функции Symbolic Math Toolbox™.

Генерация указателя на функцию

matlabFunction может сгенерировать указатель на функцию из любого символьного выражения. Для примера:

syms x y
r = sqrt(x^2 + y^2);
ht = matlabFunction(tanh(r))
ht = 
  function_handle with value:
    @(x,y)tanh(sqrt(x.^2+y.^2))

Можно использовать этот указатель на функцию для численного вычисления:

ht(.5,.5)
ans =
    0.6089

Вы можете передать обычные числа или матрицы MATLAB двойной точности в указатель на функцию. Для примера:

cc = [.5,3]; 
dd = [-.5,.5];
ht(cc, dd)
ans =
    0.6089    0.9954

Совет

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

Управляйте порядком переменных

matlabFunction генерирует входные переменные в алфавитном порядке из символьного выражения. Вот почему указатель на функцию в Генерации указателя на функцию имеет x перед y:

ht = @(x,y)tanh((x.^2 + y.^2).^(1./2))

Порядок входа переменных можно задать в указателе на функцию с помощью vars опция. Вы задаете порядок путем передачи массива ячеек из векторов символов или символьных массивов или вектора символьных переменных. Для примера:

syms x y z
r = sqrt(x^2 + 3*y^2 + 5*z^2);
ht1 = matlabFunction(tanh(r), 'vars', [y x z])
ht1 = 
  function_handle with value:
    @(y,x,z)tanh(sqrt(x.^2+y.^2.*3.0+z.^2.*5.0))
ht2 = matlabFunction(tanh(r), 'vars', {'x', 'y', 'z'})
ht2 = 
  function_handle with value:
    @(x,y,z)tanh(sqrt(x.^2+y.^2.*3.0+z.^2.*5.0))
ht3 = matlabFunction(tanh(r), 'vars', {'x', [y z]})
ht3 = 
  function_handle with value:
    @(x,in2)tanh(sqrt(x.^2+in2(:,1).^2.*3.0+in2(:,2).^2.*5.0))

Сгенерируйте файл

Можно сгенерировать файл из символьного выражения, в дополнение к указателю на функцию. Укажите имя файла используя file опция. Передайте вектор символов, содержащее имя файла или путь к файлу. Если вы не задаете путь к файлу, matlabFunction создает этот файл в текущей папке.

Этот пример генерирует файл, который вычисляет значение символьной матрицы F для входов двойной точности t, x, и y:

syms x y t
z = (x^3 - tan(y))/(x^3 + tan(y));
w = z/(1 + t^2);
F = [w,(1 + t^2)*x/y; (1 + t^2)*x/y,3*z - 1];
matlabFunction(F,'file','testMatrix.m')

Файл testMatrix.m содержит следующий код:

function F = testMatrix(t,x,y)
%TESTMATRIX
%    F = TESTMATRIX(T,X,Y)

t2 = x.^2;
t3 = tan(y);
t4 = t2.*x;
t5 = t.^2;
t6 = t5 + 1;
t7 = 1./y;
t8 = t6.*t7.*x;
t9 = t3 + t4;
t10 = 1./t9;
F = [-(t10.*(t3 - t4))./t6,t8; t8,- t10.*(3.*t3 - 3.*t2.*x) - 1];

matlabFunction генерирует много промежуточных переменных. Это называется оптимизированным кодом. MATLAB генерирует промежуточные переменные в виде строчной буквы t далее следует автоматически сгенерированный номер, например t32. Промежуточные переменные могут сделать полученный код более эффективным при переиспользовании промежуточных выражений (таких как t4, t6, t8, t9, и t10 в вычислении F). Использование промежуточных переменных может облегчить чтение кода, сохраняя выражения краткими.

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

matlabFunction(F,'file','testMatrix.m','vars',[x y t])

генерирует файл, эквивалентный предыдущему, с другим порядком входов:

function F = testMatrix(x,y,t)
...

Назовите выходные переменные

По умолчанию имена выходных переменных совпадают с именами, которые вы используете при вызове matlabFunction. Для примера, если вы звоните matlabFunction с переменной F

syms x y t
z = (x^3 - tan(y))/(x^3 + tan(y));
w = z/(1 + t^2);
F = [w, (1 + t^2)*x/y; (1 + t^2)*x/y,3*z - 1];
matlabFunction(F,'file','testMatrix.m','vars',[x y t])

сгенерированное имя переменного выхода также F:

function F = testMatrix(x,y,t)
...

Если вы звоните matlabFunction использование выражения вместо отдельных переменных

syms x y t
z = (x^3 - tan(y))/(x^3 + tan(y));
w = z/(1 + t^2);
F = [w,(1 + t^2)*x/y; (1 + t^2)*x/y,3*z - 1];
matlabFunction(w + z + F,'file','testMatrix.m',...
'vars',[x y t])
имена по умолчанию выхода переменных состоят из слова out далее следует номер, например:
function out1 = testMatrix(x,y,t)
...
Чтобы настроить имена переменных выходов, используйте output опция:

syms x y z
r = x^2 + y^2 + z^2;
q = x^2 - y^2 - z^2;
f = matlabFunction(r, q, 'file', 'new_function',...
'outputs', {'name1','name2'})

Сгенерированная функция возвращается name1 и name2 как результаты:

function [name1,name2] = new_function(x,y,z)
...