matlab除数为0的解决办法

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也在逐渐增大,这在计算的过程中,都要注意。防止大数吃小数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值