找回密码
 注册
Simdroid-非首页
查看: 137|回复: 0

一个小球碰撞的模拟

[复制链接]
发表于 2010-8-23 10:42:27 | 显示全部楼层 |阅读模式 来自 河北廊坊
最近看本老外的书,上面提到一个例子:一个球静止躺在一个方形的桌上,球被撞击一下,然后无限的运动,问在什么情况下,小球可以回到原来的点,老外给出的方法就是把平面区域展开的方法,给了一个例子,但是我模拟了下,感觉不对(按老外的观点NN次就可以回到原点,但是模拟的结果不是,我运行了2*NN次,大致回到那个位置,但是好像不在那个点,不知是不时计算精度的问题),以下是我的程序,我愿意和有兴趣的读者一起讨论,

  1. clear; clc; close all
  2. step = 0.01;
  3. N=1000;
  4. xdir=1;
  5. ydir=1;
  6. xlow=1;
  7. xup=2;
  8. hold on
  9. grid on
  10. set(gca,'GridLineStyle','-');
  11. daspect([1,1,1]);
  12. % [x,y] = meshgrid((xlow+.1):step:(xup-.1));
  13. % pos=unidrnd(numel(x));
  14. % x0=x(pos);
  15. % y0=y(pos);
  16. x0=1.2;
  17. y0=1.5;
  18. xs=x0;ys=y0;
  19. x2=x0;
  20. y2=y0;
  21. tanfz=3;
  22. tanfm=7;
  23. % tanfz=randint(1,1,[1,10]);
  24. % tanfm=randint(1,1,[1,10]);
  25. tany=tanfz/tanfm;
  26. axis([0 16 0 8]);
  27. plot(x0,y0,'go','markersize',5);
  28. h=plot(x0,y0,'r.','markersize',20);
  29. h1=plot(x0,y0,'g.','markersize',20);
  30. set(gca,'xtick',0:1:16,'ytick',0:1:8);
  31. gc=gcd(tanfz,tanfm);
  32. NN=tanfm/gc/step;
  33. for i=1:2*NN
  34.     x1=x0;
  35.     y1=y0;
  36.     x3=x2;
  37.     y3=y2;
  38.     x0=x0+xdir*step;
  39.     y0=y0+ydir*step*tany;
  40.     x2=x2+step;
  41.     y2=y2+step*tany;
  42.     if x0>=xup || x0<=xlow
  43.         xdir = -xdir;
  44.     end
  45.     if y0>=xup || y0<=xlow
  46.         ydir = -ydir;
  47.     end
  48.     set(h,'xdata',x0,'ydata',y0);
  49.     set(h1,'xdata',x2,'ydata',y2);
  50.     plot([x1,x0],[y1,y0],'k-','linewidth',1);
  51.     plot([x3,x2],[y3,y2],'y--','linewidth',1);
  52.     pause(0.001);
  53.     if dist([xs,ys],[x0;y0])<eps
  54.         break
  55.     end
  56. end
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-6 19:29 , Processed in 0.051590 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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