Как сделать функцию из символического выражения в MATLAB?

как я могу сделать функцию символического выражения? Например, у меня есть следующее:

syms beta
n1,n2,m,aa= Constants
u = sqrt(n2-beta^2);
w = sqrt(beta^2-n1);
a = tan(u)/w+tanh(w)/u;
b = tanh(u)/w;
f = (a+b)*cos(aa*u+m*pi)+a-b*sin(aa*u+m*pi);  %# The main expression

если я хочу использовать f в специальной программе, чтобы найти его нули, как я могу конвертировать f функции? Или, что я должен сделать, чтобы найти нули f и такие вложенные выражения?

4 ответов


у вас есть несколько вариантов...

опция #1: автоматическое создание функции

если у вас версия 4.9 (R2007b+) или позднее на Символических Элементов вы можете преобразовать символьное выражение в анонимную функцию или M-файл функции с помощью matlabFunction#2: создание функции рука!--9-->

поскольку вы уже написали набор символических уравнений, вы можете просто вырезать и вставить часть кода в функцию. Вот как будет выглядеть ваш пример выше:

function output = f(beta,n1,n2,m,aa)
  u = sqrt(n2-beta.^2);
  w = sqrt(beta.^2-n1);
  a = tan(u)./w+tanh(w)./u;
  b = tanh(u)./w;
  output = (a+b).*cos(aa.*u+m.*pi)+(a-b).*sin(aa.*u+m.*pi);
end

при вызове этой функции f вы должны ввести значения beta и 4 константы, и он вернет результат оценки вашего основного выражения.


Примечание: так как вы также упомянули, что хотите найти нули f, вы можно попробовать использовать решить функция на вашем символическом уравнении:

zeroValues = solve(f,'beta');


кто-то пометил этот вопрос Matlab, поэтому я предположу, что вы занимаетесь решением уравнения с Matlab. Если у вас есть копия Matlab Symbolic toolbox, вы сможете решить ее напрямую, как предложил предыдущий респондент.

Если нет, то я предлагаю вам написать M-файл Matlab для оценки вашей функции f (). Псевдокод, который вы уже написали, будет переведен почти непосредственно в строки Matlab. Как я читал, ваша функция f () является функцией только переменной beta, так как вы указываете,что N1,n2, m и a-все константы. Я предлагаю вам построить значения f (beta) для диапазона значений. На графике будет указано, где находятся 0 функции, и вы можете легко закодировать бисекцию или аналогичный алгоритм, чтобы дать вам их значения с желаемой степенью точности.


Если вас интересует только ответ на это конкретное уравнение, попробуйте Вольфрам Альфа, который даст вам такие ответы, как:

alt текст http://www4c.wolframalpha.com/Calculate/MSP/MSP642199013hbefb463a9000051gi6f4heeebfa7f?MSPStoreType=image/gif&s=15

Если вы хотите решить этот тип уравнения программно, вам, вероятно, нужно использовать некоторые программные пакеты для символической алгебры, например SymPy для питон.

цитирую официальная документация:

>>> from sympy import I, solve
>>> from sympy.abc import x, y

решить полиномиальное уравнение:

>>> solve(x**4-1, x)
[1, -1, -I, I]

решите линейную систему:

>>> solve((x+5*y-2, -3*x+6*y-15), x, y)
{x: -3, y: 1}

если у вас широкое намерение иметь числовые значения определенных символических выражений, у вас есть, например, у вас есть большая программа, которая генерирует символические выражения, и вы хотите использовать эти выражения для числовых целей, вы можете просто оценить их с помощью "eval". Если их параметры имеют числовые значения в рабочей области, просто используйте eval для выражения. Например,

syms beta
%n1,n2,m,aa= Constants
% values to exemplify
n1 = 1; n2 = 3; m = 1; aa = 5;
u = sqrt(n2-beta^2);
w = sqrt(beta^2-n1);
a = tan(u)/w+tanh(w)/u;
b = tanh(u)/w;
f = (a+b)*cos(aa*u+m*pi)+a-b*sin(aa*u+m*pi);  %# The main expression

если beta имеет значение

beta = 1.5;
eval(beta)

это вычислит значение f в частности beta. Используя его как функцию. Это решение подойдет вам в сценарии использования автоматически генерируемых символьных выражений и будет интересно для быстрого тестирования с ними. Если вы пишете программу для поиска нулей, достаточно будет использовать eval(f) когда вы должны оценить функцию. При использовании функции Matlab для поиска нулей с помощью анонимной функции будет лучше, но вы также можете обернуть eval(f) внутри m-файла.