Можно использовать matlabFunction
, чтобы сгенерировать указатель на функцию MATLAB®, который вычисляет численные значения, как будто вы заменяли числами переменные в символьном выражении. Кроме того, matlabFunction
может создать файл, который принимает числовые аргументы и выполняет символьное выражение, применился к аргументам. Сгенерированный файл доступен для использования в любом вычислении MATLAB, имеет ли петляющий компьютер лицензию на функции Symbolic Math Toolbox™.
Если вы работаете в MuPAD® Notebook, смотрите, Создают функции MATLAB из Выражений MuPAD.
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) ...