7

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

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

4 回答 4

11

你有几个选择...

选项 #1:自动生成函数

如果您拥有4.9 (R2007b+) 或更高版本符号工具箱,您可以使用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');
于 2010-01-03T17:06:21.817 回答
1

有人用 Matlab 标记了这个问题,所以我假设你关心的是用 Matlab 求解方程。如果您有 Matlab 符号工具箱的副本,您应该能够按照之前的受访者的建议直接解决它。

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

于 2010-01-03T17:19:19.687 回答
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特定的值beta。将其用作函数。此解决方案将适合您使用自动生成的符号表达式的场景,并且对于使用它们进行快速测试很有趣。eval(f)如果您正在编写一个程序来查找零点,那么当您必须评估函数时使用它就足够了。当使用 Matlab 函数查找零时,使用匿名函数会更好,但您也可以将eval(f)内部包装为 m 文件。

于 2016-10-24T02:58:25.237 回答
-1

如果您只对这个特定方程的答案感兴趣,请尝试Wolfram Alpha,它会为您提供如下答案:

替代文字 http://www4c.wolframalpha.com/Calculate/MSP/MSP642199013hbefb463a9000051gi6f4heeebfa7f?MSPStoreType=image/gif&s=15

如果您想以编程方式求解此类方程,您可能需要使用一些用于符号代数的软件包,例如用于 python 的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}
于 2010-01-03T16:45:27.263 回答