如何从MATLAB中的符号表达式创建函数?

时间:2010-01-03 16:39:58

标签: matlab symbolic-math

如何从符号表达式创建函数?例如,我有以下内容:

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 个答案:

答案 0 :(得分:11)

你有几个选择......

选项#1:自动生成函数

如果您拥有version 4.9 (R2007b+) or laterSymbolic Toolbox,则可以使用matlabFunction函数将符号表达式转换为匿名函数或函数M文件。文档中的一个例子:

>> syms x y
>> r = sqrt(x^2 + y^2);
>> ht = matlabFunction(sin(r)/r)

ht = 

     @(x,y)sin(sqrt(x.^2+y.^2)).*1./sqrt(x.^2+y.^2)

选项#2:手动生成功能

由于您已经编写了一组符号方程式,因此您可以简单地将部分代码剪切并粘贴到函数中。以下是您的上述示例:

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的零,您可以尝试在符号方程中使用SOLVE函数:

zeroValues = solve(f,'beta');

答案 1 :(得分:1)

有人用Matlab标记了这个问题所以我假设你关心用Matlab解决这个问题。如果您有Matlab Symbolic工具箱的副本,您应该能够像之前的受访者建议的那样直接解决它。

如果没有,那么我建议你写一个Matlab m文件来评估你的函数f()。您已编写的伪代码几乎直接转换为Matlab行。当我读到它时,你的函数f()只是变量beta的函数,因为你指出n1,n2,m和a都是常量。我建议你绘制一系列值的f(beta)值。该图表将指示函数的0位置,您可以轻松编写二分法或类似算法,以便为您提供所需精度的值。

答案 2 :(得分:0)

如果您的广泛意图是拥有某些符号表达式的数值,例如,您有一个更大的程序来生成符号表达式,并且您希望将这些表达式用于数字目的,则可以使用'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的{​​{1}}的值。将它用作功能。在使用自动生成的符号表达式的情况下,此解决方案将适合您,并且对于使用它们进行快速测试将非常有用。如果您正在编写程序来查找零,那么在必须评估函数时使用beta就足够了。当使用Matlab函数使用匿名函数查找零时会更好,但您也可以将eval(f)包装在m文件中。

答案 3 :(得分:-1)

如果您对此特定等式的答案感兴趣,请尝试Wolfram Alpha,它将为您提供以下答案:

alt text http://www4c.wolframalpha.com/Calculate/MSP/MSP642199013hbefb463a9000051gi6f4heeebfa7f?MSPStoreType=image/gif&s=15

如果你想以编程方式解决这种类型的方程式,你可能需要使用一些软件包来进行符号代数,比如SymPy用于python。

引用the official documentation

>>> 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}