对于统计应用程序,我需要评估微小的卡方概率。但是当它小于 matlab 的双精度限制
realmin
(大约 1e-308)时,它返回 0。
x=50;
p=chi2cdf(x^2,4,'upper')
>> 0
我所需要的只是存储数字的数量级和一些前导数字。我知道使用
vpa
您可以将小于 realmin
的微小数字存储为任意精度:
y = vpa('1e-5000')
>> 1.0e-5000
log10(y)
>> -5000.0
但这似乎不适用于
chi2cdf
:
x = vpa('50');
chi2cdf(x^2,4,'upper')
抛出错误。
这是否意味着某些 Matlab 函数(例如
chi2cdf
)根本不适合处理可变精度输入?还有其他办法吗?
看起来
chi2cdf
不支持符号输入。卡方 CDF 可以用正则化不完全伽马函数表示,在 Matlab 中为 gammainc
,但也不支持符号输入。
int
手动将 CDF 定义为符号积分,仅使用具有符号版本的函数:
x = 2500; % input value
k = 2; % input value
d = 30; % number of digits
syms ks xs
result = int(xs^(ks/2-1)*exp(-xs/2)/2^(ks/2)/gamma(ks/2), x, inf);
result = vpa(subs(subs(result, xs, x), ks, k), d)
给予
result =
1.35486998238286942020782923322e-543