问题描述
我使用matlab进行符号计算.经过长时间的计算,我得到了一个x函数,它是贝塞尔函数的组合,我想找到它的零.
为此,我在Matlab中使用fzero
函数.但是,尽管它非常适合单个贝塞尔函数,但不适用于我的一个.
为什么会这样?该如何解决?
预先感谢
我认为您误以为符号表示形式的函数句柄.
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)
I use matlab for symbolic calculations. After long calculations I've got a function of x, which is the combination of bessel functions and I want to find it's zeros.
For that purpose I use fzero
function in Matlab. But while it works perfectly for single bessel functions, it wont work for the mine one.
>> 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)
Why this happens? How to solve the issue?
Thanks in advance
I think you've mistaken function handles with symbolic representation.
fzero needs a function handle.
so if you do:
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)
you get
3.8173
note that if you want to call a symbolic function, you'll have to do it indirectly:
fzero(@(x)eval(DELTA_xi), 3.5)
这篇关于使用fzero:类型为'sym'的输入参数的未定义函数或方法'isfinite'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!