我使用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)
为什么会这样?如何解决这个问题?
提前致谢
答案 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)
因为输入变量的名称和符号变量不匹配。