exponenta event banner

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

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