使用fzero:未定义的函数或方法' isfinite'对于类型' sym'的输入参数

时间:2011-05-20 15:22:24

标签: matlab root equation zero symbolic-math

我使用matlab进行符号计算。经过长时间的计算,我得到了x的函数,这是bessel函数的组合,我想找到它的零。

为此,我在Matlab中使用fzero函数。但是虽然它适用于单个bessel功能,但它不适用于我的功能。

>> fzero(@(x)besselj(0,x), 3.5)
ans =
    2.4048

>> fzero(@(x)DELTA_xi, 3.5) ??? Undefined function or method 'isfinite' for input arguments of type 'sym'.

Error in ==> fzero at 333 elseif ~isfinite(fx) || ~isreal(fx)

>> DELTA_xi besseli(1, (3*x)/10)*besselj(1, (3*x)/10)*besselk(1, x)*bessely(0, x) - besseli(1, (3*x)/10)*besselj(1, (3*x)/10)*besselk(0, x)*bessely(1, x) - besseli(1, (3*x)/10)*bessely(1, (3*x)/10)*besselj(0, x)*besselk(1, x) + besseli(1, (3*x)/10)*bessely(1, (3*x)/10)*besselj(1, x)*besselk(0, x) - besselj(1, (3*x)/10)*besselk(1, (3*x)/10)*besseli(0, x)*bessely(1, x) - besselj(1, (3*x)/10)*besselk(1, (3*x)/10)*besseli(1, x)*bessely(0, x) + besselk(1, (3*x)/10)*bessely(1, (3*x)/10)*besseli(0, x)*besselj(1, x) + besselk(1, (3*x)/10)*bessely(1, (3*x)/10)*besseli(1, x)*besselj(0, x)

为什么会这样?如何解决这个问题?

提前致谢

2 个答案:

答案 0 :(得分:2)

我认为你错误的函数句柄带有符号表示。

fzero需要一个函数句柄。

所以,如果你这样做:

DELTA_xi = @(x) besseli(1, (3*x)/10)*besselj(1, (3*x)/10)*besselk(1, x)*bessely(0, x) - besseli(1, (3*x)/10)*besselj(1, (3*x)/10)*besselk(0, x)*bessely(1, x) - besseli(1, (3*x)/10)*bessely(1, (3*x)/10)*besselj(0, x)*besselk(1, x) + besseli(1, (3*x)/10)*bessely(1, (3*x)/10)*besselj(1, x)*besselk(0, x) - besselj(1, (3*x)/10)*besselk(1, (3*x)/10)*besseli(0, x)*bessely(1, x) - besselj(1, (3*x)/10)*besselk(1, (3*x)/10)*besseli(1, x)*bessely(0, x) + besselk(1, (3*x)/10)*bessely(1, (3*x)/10)*besseli(0, x)*besselj(1, x) + besselk(1, (3*x)/10)*bessely(1, (3*x)/10)*besseli(1, x)*besselj(0, x)
fzero(DELTA_xi, 3.5)

你得到了

3.8173

请注意,如果要调用符号函数,则必须间接执行此操作:

fzero(@(x)eval(DELTA_xi), 3.5)

答案 1 :(得分:2)

Rasman已经为您提供了解决问题的方法,但我想我会更详细地解释您收到错误的原因,并为您提供另一种可能的解决方案。

首先,从代码中考虑这个匿名函数:

fcn1 = @(x) besselj(0,x);

此函数接受一个输入参数x并将其传递给函数BESSELJ以进行评估并作为输出返回。 FZERO使用此功能没有问题。

现在考虑一下代码中的另一个匿名函数,它的表达式是使用符号变量DELTA_xi创建的符号等式'x'

fcn2 = @(x) DELTA_xi;

这个函数接受一个输入参数x,但是这个输入参数应该怎么做? MATLAB不会自动知道将输入变量x连接到'x'中的符号变量DELTA_xi,所以当这个函数被FZERO评估时,它只会返回符号方程{{1 (FZERO无法使用,如您所看到的错误所示)。

使用EVAL中的Rasman's solution函数将使用从{FZERO传递到匿名函数的DELTA_xi的可用值来评估DELTA_xi,从而解决您的问题。但是,另一种解决方案是使用SUBS函数,如下所示:

x

对于fzero(@(x) subs(DELTA_xi,'x',x), 3.5) 中的符号变量x的每次出现,将替换输入值'x'本质上与EVAL执行相同的操作但是显式说明输入参数替换的符号变量。区别?请注意,这将起作用:

DELTA_xi

但这不会:

fzero(@(y) subs(DELTA_xi,'x',y), 3.5)

因为输入变量的名称和符号变量不匹配。