Как сделать функцию из символического выражения в 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 функции, и вы можете легко закодировать бисекцию или аналогичный алгоритм, чтобы дать вам их значения с желаемой степенью точности.
Если вас интересует только ответ на это конкретное уравнение, попробуйте Вольфрам Альфа, который даст вам такие ответы, как:
Если вы хотите решить этот тип уравнения программно, вам, вероятно, нужно использовать некоторые программные пакеты для символической алгебры, например 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-файла.