MATLAB-对称函数中的负值变为NaN

时间:2018-08-09 13:22:14

标签: matlab

有人可以解释为什么下面的对称函数不能传递一定的负值限制吗?

D = 0.1; l = 4;
c = @(x,v) (v/D).*exp(-v*x/D)./(1-exp(-v*l/D));
v_vec = -25:0.01:25;

figure(2)
hold on
plot(v_vec,c(l,v_vec),'b')
plot(v_vec,c(0,v_vec),'r')

请注意图中蓝线的切割位置,这是获得inf / nan值的位置。

enter image description here

2 个答案:

答案 0 :(得分:2)

似乎Matlab尝试计算太大的结果,输出+ inf,然后对其进行运算,从而产生+/- inf和NaN。 例如,在v = -25时,函数的一部分将计算exp(-(-25)* 4 / 0.1),即exp(1000),并输出+ inf。 (大于可表示的最大双精度浮点数)。

您可以通过重写函数来避免操作如此大(或非常小的)数字(例如,通过重组包含exp()函数的分数)来解决该问题。

答案 1 :(得分:1)

使用参数exp()触发溢出时,确实遇到了相同的障碍。有时很难追溯数字不精确度或收敛误差。原则上,使用exp()的函数定义仅将中间问题作为转换函数的用途。我想的目的是提供一个连续的功能。 我对这个问题的解决方案是将参数分成多个区域,并在每个区域中提供一个近似函数。在您的情况下,负x为零,正x与x成正比。在两者之间可以使用原始功能。应注意使区域边界处的近似值与连续微分的数量相匹配,这对于循环收敛很重要。