2016-08-17 424 views
1

我在Matlab的函数erf/erfc函数的准确性方面存在问题。在matlab中erf/erfc函数的问题

正如我们所知,erf(x)只有等于1,如果x是无穷大。

但是,在Matlab中,令我感到惊讶的是erf(6)已经等于1,而6甚至不是很大!

erfc(x)更好一点,因为erfc(27)非零,而erfc(28)为零。

有没有办法提高这个函数的数值性能?即,增加erf(x)的值的范围以获得不完全是1的值? (并且erfc也是0)

+1

你需要多少位数的精度? erf提供15位数字,erfc下降到“e-300”。如果您需要更高的精确度,那么您可能错误地使用了该功能 – Trogdor

+0

您是否有理由要求这样一个精度值大的参数值? –

回答

1

您处理double precision floating pointerfc的执行方式不同,因为值的间隔比0更接近于0。如果您确实需要更高的精度(您不清楚为什么会这么做),则需要用不同的数字系统表示值。如果您有符号数学工具箱,请尝试使用variable precision arithmetic。尝试

erf(vpa(6)) 

它返回符号值0.99999999999999997848026328750109。随着参数变大,您需要使用digits。当然,如果你用double将结果转换回浮点数,你将失去所有额外的精度。

+0

不幸的是,我需要使用erf/erfc的输出进行优化。我实际上必须记录erfc的日志。如果erfc的值为0,那么优化算法将不会运行。 – user1237300

+2

@ user1237300在这种情况下,您可能需要查看指数级缩放互补错误函数“erfcx”。 – njuffa

+0

@njuffa是对的。试试'x = 30;'log(erfcx(x)) - x。^ 2'来实现'log(erfc(x))'。你可以用'double(log(erfc(vpa(30))))'验证结果。 – horchler