Можно использовать 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) ...