algorithm - 贝塞尔函数的自然对数,溢出

标签 algorithm matlab math bessel-functions

我正在尝试在 MATLAB 中计算第二类修正贝塞尔函数的对数,即类似的东西:

log(besselk(nu, Z)) 

例如

nu = 750;
Z = 1;

我有一个问题,因为 log(besselk(nu, Z)) 的值趋于无穷大,因为 besselk(nu, Z) 是无穷大。但是,log(besselk(nu, Z)) 确实应该很小。

我正在尝试写类似的东西

f = double(sym('ln(besselk(double(nu), double(Z)))'));

但是,我收到以下错误:

Error using mupadmex Error in MuPAD command: DOUBLE cannot convert the input expression into a double array. If the input expression contains a symbolic variable, use the VPA function instead.

Error in sym/double (line 514) Xstr = mupadmex('symobj::double', S.s, 0)`;

我怎样才能避免这个错误?

最佳答案

您做错了几件事。将 double 用于 besselk 的两个参数并将输出转换为符号是没有意义的。您还应该避免对 sym 进行旧的基于字符串的输入。相反,您想以符号方式计算 besselk(这将返回大约 1.02×102055,比 realmax 大得多),以符号方式计算结果的对数,然后转换回 double 。

以下就足够了——当一个或多个输入参数是符号时,besselk 的符号版本将被使用:

f = double(log(besselk(sym(750), sym(1))))

或者旧的字符串形式:

f = double(sym('log(besselk(750, 1))'))

如果你想保持你的参数符号化并在以后评估:

syms nu Z;
f = log(besselk(nu, Z))
double(subs(f, {nu, Z}, {750, 1}))

确保您没有翻转数学中的 nuZ 值,因为大订单 (nu) 不是很常见。

关于algorithm - 贝塞尔函数的自然对数,溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32484696/

相关文章:

math - 双轮廓 - 噪声函数的法向量

sql - 如何撰写T-SQL WHERE语句,以确定特定的过滤器值是否为从列值可收集的2的幂

arrays - 将 MATLAB 元胞数组导出到 csv 文件

regex - 如何在 Matlab 中编辑字符串,使其仅包含字母 A-Z

c++ - c++中的atan问题

javascript - 来自 javascript 中 crypto.randomBytes() 的 float

java - 误解嵌套 for 循环时间复杂度分析的小细节......如何区分 O(n) 和 O(n²)

python-3.x - 我如何改进此解决方案以使其使用 numpy 更快?

algorithm - 电脑订票系统 : how to efficiently reserve tickets?

java - Matlab + Java + JNI : java. lang.UnsatisfiedLinkError