Вы можете использовать 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) ...