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