Сгенерируйте функции MATLAB от символьных выражений

Можно использовать 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 для входных параметров с двойной точностью tX, и 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)
...