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