码迷,mamicode.com
首页 > 其他好文 > 详细

编程模拟自然(八):几种常见力的建模

时间:2016-05-17 07:27:30      阅读:280      评论:0      收藏:0      [点我收藏+]

标签:

  古书记载:大河之东,有美丽佳人,乃天帝之子,机杼女工,年年劳役,织成云雾绢缣之衣,天帝怜其独处,嫁与河西牵牛为妻。

  自此即废织紝之功,留恋不归。天帝大怒,责归河东,令他们每年只有七月七日可以相会一次。有诗云:

  纤云弄巧,飞星传恨,银汉迢迢暗渡。

  金风玉露一相逢,便胜却人间无数。

  柔情似水,佳期如梦,忍顾鹊桥归路。

  两情若是长久时,又岂在朝朝暮暮

第零章 实例化一个长整型

  “无名儿,来个睡前故事吧。”

  “猿叔,我才是小孩子唉!”

  “你当然是小屁孩,我这是培养你的语言表达能力。”

  “哦,那给你讲个牵牛星和织女星的故事。”

  ...

  “从前有个出身码农世家的孩子,爹娘给他取了NewLong的名字。”

  “不愧码农世家,完全符合匈牙利命名法。”元吐槽道。

  “...后来NewLong和一位下凡仙女成为夫妻。”

  “码农怎么可能有女朋友?”元惊讶不已。

  “从此夫妻过着男编女织的生活...”

  “...”元陷入了沉思。

  “直到有一天从天而降的天神打破了原有的平静...”

  “我预感到接下来就是转折。”元不再思考。

  “...天神带走了仙女,NewLong失去了妻子。”

  “哈哈哈哈,我就说码农怎么能有女朋友。”元得意洋洋起来。

第一章 重力

  失去妻子后,NewLong对生活失去了信心,从此没日没夜的写着代码。

  一天儿子Newton哭着从外面回来,说一颗苹果从树上落下砸到了自己。

  NewLong一边安慰着儿子,一边想“为什么苹果不往天上掉,砸死那天神呢?”

  在现实中,我们可能会有一种错觉:质量越大的物体下落速度越快。当然这是错的,而牛顿第二定律告诉我们:质量越小,加速度越大。但是事实并非如此,如果你登上比萨斜塔的顶层,让两个质量不同的铁球同时从上面落下,那个铁球会先着地?伽利略已经在1589年做过这个测试,他发现两个铁球下落加速度相等,最后同时击中地面。

  我们在编程中可以简单的模拟重力。

    Dim gravityVec As New Vector2(0, 0.1 * SubWalker.Mass)
    SubWalker.ApplyForce(gravityVec)

  再模拟一个向右的风力。

    Dim windVec As New Vector2(0.1, 0)
    Dim gravityVec As New Vector2(0, 0.01 * SubWalker.Mass)
    SubWalker.ApplyForce(windVec)
    SubWalker.ApplyForce(gravityVec)

技术分享

图1.1 物体受重力、向右风力作用

  尽管物理下落的速度相等,但质量越小的物体向右运动的加速度越大,因为风力的强度和物体的质量无关。

第二章 摩擦力

  在发现重力后,NewLong对生活恢复了一些信心,继续没日没夜的写着代码。

  一天儿子Newton又哭着从外面回来,说从土坡上滑下来磨破了裤子。

  NewLong一边缝补着裤子,一边想“只要土坡‘足够光滑’,裤子还会破吗?”

  摩擦力是一种耗散力。耗散力的定义是:在运动中使系统总能量减少的力。比如说开车时,脚踩刹车板会让车通过摩擦力使轮胎减速,在这个过程中,动能被转化为热能。只要两个物体的表面相互接触并有相对运动的趋势,它们之间就有摩擦力。摩擦力可分为静摩擦力(物体相对于表面静止不动)和动摩擦力(物体在表面上发生运动)。

  这里我们只对动摩擦力进行模拟。

  Dim frictionMag As Single = 0.1 系数
  Dim frictionVec As New Vector2(SubWalker.Velocity.X, SubWalker.Velocity.Y) 由当前速度向量初始化
  frictionVec = -frictionVec 向量反向
  frictionVec.SetMag(frictionMag) 重新设定向量长度
  SubWalker.ApplyForce(frictionVec)

技术分享

图1.1 物体受重力、向右风力和摩擦力作用

  物体受摩擦力,反弹后无法回到原来的高度。

第三章 空气和流体阻力

  物体通过流体或者气体时同样会受摩擦力的作用,这种摩擦力有很多名字,如粘滞力、阻力和流体阻力。流体阻力产生的效果和前述的摩擦力相同(物体会减速),但是计算阻力的方式却有些不同。

  简化的阻力计算公式:阻力=速度的平方*阻力系数

    Private Sub ApplyDrag(SubWalker As RndWalker)
        Dim vLen As Single = SubWalker.Velocity.Length
        Dim dragMag As Single = 0.05 * vLen * vLen 系数
        Dim dragVec As New Vector2(SubWalker.Velocity.X, SubWalker.Velocity.Y) 由当前速度向量初始化
        dragVec = -dragVec 向量反向
        dragVec.SetMag(dragMag) 重新设定向量长度
        SubWalker.ApplyForce(dragVec)
    End Sub

技术分享

图3.1 物体受重力、流体阻力、向右外力(抛物线)

  不同物体反弹后升起的高度不再一致。

技术分享

 图3.2 物体受重力、流体阻力(垂直下落)

  图中灰色区域是模拟物体落入水中,你会发现物体越小(质量越轻),速度减小的越快。

第四章 万有引力

  后来,NewLong对生活找回了全部信心,他决定生活不再只是代码,还有诗。

  有天晚上NewLong陪着儿子Newton看星星,繁星漫天,有感而发:

  远远的街灯明了/好像闪着无数的明星

  天上的明星现了/好像点着无数的街灯

  想那缥缈的空中/定然有她美丽的身影

  引力是最常见的力,当地球吸引苹果下落的同时,苹果对地球也有引力作用,只不过地球过于庞大,苹果的作用力完全可以忽略不计。

  由引力的计算公式我们可以知道:物体距离越远,引力越弱;物体距离越近,引力越强。

  现在,我们让鼠标指针吸引物体,并假设指针的质量为1.0f

    Private Sub ApplyAttract(SubWalker As RndWalker, MouseVec As Vector2)
        Dim mouseMass As Single = 1.0f 鼠标质量
        Dim gValue As Single = 100f 引力常量
        Dim attractVec As Vector2 = MouseVec - SubWalker.Location 由二者向量差初始化
        Dim aLen As Single = attractVec.Length 距离
        Dim attractMag As Single = (gValue * mouseMass * SubWalker.Mass) / (aLen * aLen) 计算模长
        attractVec.SetMag(attractMag) 重置向量长度
        SubWalker.ApplyForce(attractVec)
    End Sub

  技术分享图4.1 鼠标吸引物体  

  附加题:观察图像并回答鼠标大致在什么位置。(5分)

第五章 长征系列火箭

  当然生活不只是代码和诗,还有远方。NewLong一直有个伟大的计划,他要去天上找回昔日的姑娘。

  --中文名:长征运载火箭

  --外文名:NewLong

  --别称:新长整型号

  --是否拥有轨道舱:是

  --是否拥有返回舱:是

  就在NewLong准备上天前夜,一直默默无闻的老牛突然说话了:“我就要死了,但我一直有个飞天的梦想。”

  月纪8年,9月1日,元告别无名儿后发射火箭离开了月球

  9月20日,元进入地月转移轨道

  10月6日,元抵达地球同步轨道

  10月7日,元与仍旧在轨的NewLong号返回舱完成对接.

  ...

  “返回舱返回程式重新生成中。”

  “生成成功1个,失败0个。”

  “部署成功1个,失败0个。”

  “Console:助推火箭启动,尝试再入角修正”

  “Warning:反椎发动机推力计算时抛出了异常,发生除零运算。”

  元选择了继续。

  “Warning:再入角修正时抛出了异常,这将可能导致坠毁。”

  元看到“坠毁”,一瞬间想了很多。

  “Console:再入速度修正中,即将再入大气层。”

  …

  “Console:软着陆程式就绪,副伞开启。”

  元抬头看了看,原来是一块牛皮伞,这下牛皮真上天了。

后记

  “这是哪儿?”元爬出返回舱时下意识说了句话。

  视野内一片碧蓝,随后仿佛听到了些许鸟语。

  “一Bug还未平息,一Bug又来侵袭,茫茫码海狂风暴雨…”

  “…这里是Sad Pacific Ocean。”

  元这下看清楚了,他眼前飘下来个鸟人。

附录

1.预知前情,请看上回分解。也可以浏览目录导航

2.New是VB.NET语言中的关键字,用以创建一个类的实例

3.参考书籍:《The Nature of Code》[美] Daniel Shiffman 著

编程模拟自然(八):几种常见力的建模

标签:

原文地址:http://www.cnblogs.com/experdot/p/5482691.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!