1

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

为此,我fzero在 Matlab 中使用函数。但是,虽然它非常适用于单贝塞尔函数,但它不适用于地雷函数。

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

为什么会发生这种情况?如何解决问题?

提前致谢

4

2 回答 2

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)
于 2011-05-20T17:39:34.193 回答
2

拉斯曼已经为您的问题提供了一个解决方案,但我想我会更详细地解释您为什么会遇到错误并为您提供另一种可能的解决方案。

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

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

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

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

fcn2 = @(x) DELTA_xi;

这个函数接受一个输入参数x,但是应该如何处理这个输入参数呢?MATLAB 不会自动知道将输入变量连接x到 中的符号变量'x'DELTA_xi因此当此函数由 FZERO 求值时,它只会返回符号方程DELTA_xi(如您看到的错误所示,FZERO 无法使用该符号方程)。

Rasman 的解决方案中使用函数EVAL将使用从 FZERO 传递给匿名函数的可用值进行评估,从而解决您的问题。但是,另一种解决方案是像这样使用SUBS函数:DELTA_xix

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

它将用输入值替换中的符号变量的x每次出现,本质上与 EVAL 做同样的事情,但明确说明输入参数替换哪个符号变量。区别?请注意,这将起作用:'x'DELTA_xi

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

但这不会:

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

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

于 2011-05-20T19:06:14.330 回答