查看: 157|回复: 1|关注: 0

[已解决] 二项式展开在matlab实现的误差

[复制链接]

新手

18 麦片

财富积分


050


7

主题

13

帖子

0

最佳答案
在对二项式验证的时候发现指数很大时候二项式结果不一样了。。
  1. z=1;N=60;
  2. y1=(z/(z+1))^N;
  3. y2=0;
  4. for p=0:N
  5.     y2=y2+nchoosek(N,p)*(-1/(z+1))^p;
  6. end
复制代码
这里面存在什么问题吗
回复主题 已获打赏: 0 积分

举报

论坛优秀回答者

5

主题

2338

帖子

706

最佳答案
  • 关注者: 196
发表于 2020-6-2 08:58:19 | 显示全部楼层 |此回复为最佳答案
因为计算机内存有限,存储数据时会有精度限制,默认情况下数字以浮点形式储存,导致存在一个机器精度,做高精度运算时候要考虑这部分引起的误差。官网就有介绍的资料
https://www.mathworks.com/help/m ... -point-numbers.html

另外也可以看看 深蓝孩童 的帖子
https://www.ilovematlab.cn/thread-573210-1-1.html

想精确相等,请用symbolic型数据
  1. for p = 0 : 1 : N
  2.     y2 = y2 + nchoosek( sym( N ), sym( p ) ) * ( - 1 / ( z + 1 ) )^p;
  3. end
复制代码


否则N较大时,浮点型数据会因精度不够而产生误差,很容易验证
  1. N = 60; p = N / 2;
  2. fprintf( '%d\n', nchoosek( sym( N ), sym( p ) ) )
  3. fprintf( '%d\n', nchoosek( N, p ) )
复制代码

118264581564861424 % 精确结果
118264581564861408 % 浮点数据导致最后两位已经有了误差



提问请:①准确描述问题②提出你的思考(等着抄作业的一律锁帖)③提供代码文本而非截图④及时反馈
回复此楼 已获打赏: 0 积分

举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表