假设我有一个函数fun=@(x)(1-exp(-x))./x
。我想要计算的是fun([0,1])
。可以在x->0
,fun->1
时计算出来。但是,如果我只输入fun([0,1])
,则第一个元素是NaN。是否可以使用命令fun(0)
给出1
?
答案 0 :(得分:1)
就我所知,限制的数值计算在文献和数字包中很少得到解决。它可能更像是一门艺术而非技术。
可能的原因之一是限制的计算确实挑战了数值精度,因为它涉及任意大的值或任意接近给定值的值,导致任何类型的溢出或交叉错误和其他病理。所以直接攻击通常是不可行的。
在某些情况下,可以使用特殊函数来解决不稳定的计算问题。例如,函数e^x-1
在Matlab中随expm1
一起提供,expm1(x) / x
的限制可以比(exp(x) - 1) / x
更好地估算。
泰勒近似通常会有所帮助,但好的解决方案通常需要一定量的符号计算。在给定的情况下,可以在简化后建立(e^x - 1) / x ~ 1 + x/2 + x²/6 + x³/24...
。
答案 1 :(得分:0)
好吧,你不能计算fun(0)
,因为这是一个极限点,所以显然MATLAB会给你一个NaN
值。您需要接近 x=0
才能无限接近1
,但实际上 。那是你的数学。你可以做的是创建一个像
function result = fun(x)
result = (1-exp(-x))./x;
result(x==0)=1; % remove the singularity if present