1.0 - u(1)/(u(2) + (u(2)==0)*eps)
是matlab中自带例程ABS中计算滑移率的一个公式。
关于它是什么意思:
先从中间读起,u(2)=0若为真,返回u(2)==0为1,1*eps=eps。u(2)+eps=u(2)=eps=2的-54方。然后作除数,被u(1)除
第二种是u(2)=0不成立,返回0。原式变为u(1)/u(2)
Tips:
当除数为0时计算会报错,可以在分母位置加eps
eps解释参考:
https://blog.csdn.net/qq_33965676/article/details/96314432
首先matlab中eps是一个函数,可以返回某一个数N的最小浮点数精度,形式例如eps(N)。eps(a)是|a|与大于|a|的最小的浮点数之间的距离,距离越小表示精度越高。
默认a=1,即eps = eps(1); 我们在matlab中敲入eps和eps(1)可以发现结果是一样的。eps = eps(1) = 2.2204e-16。
>> eps
ans =
2.2204e-16
>> eps(1)
ans =
2.2204e-16
>> eps(0)
ans =
4.9407e-324
eps为系统运算时计算机允许取到的最小值。例如对于函数y=cosx/x。由于在编程时分母可能出现为0,所以编程时要写成:y=cosx/(x+eps)。
浮点数其实是离散的,有限的,而且间隔是不均匀的。我们可以说一个数旁边的数是什么,而它们之间的距离就反应了其精度。越靠近0,数和数之间就越密集,精度就越高。
简图中黑色实心点代表的是数轴的数,例如1,红圈与1的距离代表的就是eps(1),那么在1+eps(1)/2到1之间的所有数,都被认作1,MATLAB无法识别介于1和1+eps(1)/2之间的数。
例一,eps(1)
>> eps(1)
ans =
2.2204e-16
>> 1+0.3*eps(1)
ans =
1
>> 1+0.7*eps(1)
ans =
1.0000
>> 1+0.7*eps(1)==1
ans =
logical
0
>> 1+0.7*eps(1)==1+eps
ans =
logical
1
由于matlab无法区分1到1+eps(1)/2之间的数,所以就将中间的这些数四舍五入到1或者1+eps(1),比如上图中,1+0.3eps(1)就被舍入到1,然后大于0.5时,1+0.7eps(1)就被近似为1+eps(1)。
例2,eps(2)以及eps(N)
>> eps(0)
ans =
4.9407e-324
>> eps(1)
ans =
2.2204e-16
>> eps(2)
ans =
4.4409e-16
>> eps(100)
ans =
1.4211e-14
>> eps(10000)
ans =
1.8190e-12
我们可以发现最小精度eps(N)随着数量级增大,eps也在逐渐增大,这在计算的过程中,都要注意。防止大数吃小数。