1、人们通常将实验室里进行的飞机模型试验叫做“模拟”试验。模拟的例子很多,比如建造一个水库大坝也要经过模拟试验,大家还可以想出其它的例子。从上面的例子可以看出“模拟”的几个特点:(1)模拟对象的复杂性在上例中,飞机在高空飞行遇到各种气流变化时,飞机的状态和性能会产什么样的变化,这是设计师说不清楚的,有些情况甚至是想象不到的。假如设计师能通过某一个公式把飞机的各种状况准确地计算出来,而且计算也不复杂,他也就不会再费力做模拟试验了。(2)模拟系统与模拟对象的相象性在风洞里做试验的飞机模型与实际设计的飞机原型要尽量相象,飞机的机身与机翼的尺寸比例、飞机的比重等要与飞机原型相同。风洞中的气流变化也要与实际
2、的高空气流变化尽可能相象。甚至包括飞机模型的表面材料也要尽量一致。但是,飞机模型里面,不一定要有机舱座位等,因为它们不与外界气流直接接触。因此,模拟系统是模拟对象那个复杂系统的近似或抽象,它要能反映原系统中重要的本质性的特征。当然,这里所说的“本质”依赖于模拟的目的。比如,同样是一个新型的飞机,要试验旅客座位的舒适性和安全性,就必须制造出几排座位,用机械产生升空、降落和颠簸的状况,以观测旅客的感觉。如果没有人身安全问题,可能直接由志愿者参加试验,因为“飞机”根本不升空,甚至可能连翅膀都没有。(3)模拟系统的可控性模拟系统比原系统要简单,这是显而易见的。但是,模拟系统不仅是简单,它应该具有可控性
3、。比如,风洞实验室应该能按试验人员的意愿产生不同方向和大小的气流,这可以让设计师观察到各种复杂的情况下飞机的性能。有些情况可能是在实际中很难遇到的,比如,观察飞机在一个机翼失灵时的状况。(4)模拟试验的可重复性模拟试验是科学的,其观察结果是稳定的,虽然可能存在微小的随机误差。基于此性质,人们可以从多次试验结果分析出客观事物存在的规律性。在以上所说的飞机试验模拟中,人们也可以通过不断调整设计的参数,改进飞机的性能。2. 计算机模拟在了解了什么是“模拟”以后,让我们一起来看什么是计算机模拟。与用风洞实验室进行飞机的试验设计不同,计算机模拟所用的模拟系统是利用计算机程序实现的。它不是用有形的风洞和飞
4、机模型,也不是用有形的计算机。如果要模拟计算机在电压不稳时的工作性能,那时模拟系统就是计算机硬件。但现在人们通常说的计算机模拟是用计算机软件实现的。这里所说的“软件”包括商用软件和自编的计算机程序。商用软件不过是别人编的有特定功能的比较完善的计算机程序而已。在具体讨论计算机模拟以前,先介绍一个掷硬币的游戏(参见 Frederick S. Hillier & Gerald J. Lieberman)。例1.1 掷硬币游戏的规则如下:每扔一次硬币就要花1元钱,连续扔硬币,不得中间退出,直到累计出现的正面与反面次数之差的绝对值等于3为止。游戏参加者在结束时可以得到10元。这看来是一个小孩玩的游戏,或
5、者是一个赌博问题,而实际是经营管理中大量遇到的风险投资问题的抽象。用掷硬币这种游戏的方式叙述,是为了简化问题,形象易懂。面对如此一个投资机会,大家都可以凭经验做出判断:参加这一游戏是否值得。一般说来,不能给出肯定的结论,因为大家知道掷硬币有随机性。所以人们会猜测或判断平均说来是赢、是平还是输。喜好数学的朋友首先可能想到这是一个求期望的问题,可以写出公式算一算。但真地写公式时会发现其复杂性令人生畏。有人会想到:何不在家里“模拟”一下,真的拿硬币掷一掷?其结果可能是:甲掷了5次,4次正面,1次反面,赢了5元;乙掷了15次,6次反面,9次正面,输了5元。哪一个结果可信呢?聪明人会说:“要估计平均值,
6、应该进行许多次,再求平均”。但掷多少次为好呢?如果一个人要掷一天硬币,除了胳膊疼、心里烦以外,时间的成本也是应该考虑的。在有了计算机以后,人们会想到:能否让计算机去做上面的模拟实验呢?因为计算机在算术方面比人们快得多,只要能解决“掷硬币”问题就行了。所谓“掷硬币”,就是要求计算机能象实际掷硬币似地决定“出正面”或“出反面”,并体现硬币的均匀性和随机性。要体现均匀性是容易的,只要简单地让“正面”与“反面”交替出现即可。但是,它与实际掷硬币的情形相差太远。在掷硬币时,出现“正”、“反”、 “正”、“反”、.的情况的概率极小,与连续出“正”或连续出“反”的情形一样。也许有人提出置疑:“这种情形的概率
7、与任何一种排列顺序出现的概率是一样的”。是的,但问题在于不能在多次重复时只是采用“正面”与“反面”交替出现的方式,没有变化。解决问题的关键是要让计算机能产生出“变化的”序列,同时保持“正”、“反”出现的概率相同或非常接近。换句话说,如果计算机能产生出遵循一定概率分布的随机数就好了。关于产生随机数的方法我们以后再细讲,但我们可以告诉大家,这个问题已经解决了。如果用Excel,只要调用rand()函数即可返回一个介于0和1之间的随机数。如果熟悉C语言,可以利用其中的RAND()或random()函数产生随机数。以下给出了一个C语言的小程序,它可以模拟100次掷硬币的游戏。 #include std
8、lib.hvoid main() int i, n_head, n_tail; int num_test=100; float v, earnings=10; for(i=0;inum_test;i+) n_head=0; n_tail=0; do v=(float)rand()/RAND_MAX; if(v=0.5,1,0)”,然后将此单元格复制、粘贴到“是否正面”列的其它999个单元格中。该IF函数的作用是:如果刚才产生的随机数大于或等于0.5,那么该单元格的值就为1,即本次投掷的硬币为正面;如果随机数小于0.5,那么该单元格的值就为0,即本次投掷的硬币为反面。这样,我们就实现了随机投掷硬
9、币1000次的正反面结果。接下来,我们需要根据题目所给出的条件“直到累计出现的正面与反面次数之差的绝对值等于3为止”来判断“是否结束”。因此,我们需要计算出累计正面的次数和累计反面的次数,并计算它们的差值,从而判断“是否结束”,类似地,我们也是利用IF()函数和求和函数SUM()来实现上述过程。我们分别在单元格D4和E4内输入公式“=SUM(C$4:C4)”和“=A4-D4”,然后分别将此两单元格复制、粘贴到“累积正面”列和“累积反面”列的其它999个单元格中。接下来,我们利用IF()函数来判断“是否结束”,以“1”表示“结束”,“0”表示“不结束”。因为第1次不可能结束,所以我们可以直接在单
10、元格F4中填入“0”。我们从第2次投掷硬币起开始判断,于是我们在单元格F5中输入公式“=IF(D5-E5=B$2,1,0)”,并将此单元格复制、粘贴到“是否结束”列的其它998个单元格中。Excel中的相对引用、绝对引用和混合引用随着公式的位置变化,所引用单元格位置也是在变化的是相对引用;而随着公式位置的变化所引用单元格位置不变化的就是绝对引用。混合引用具有绝对列和相对行,或是绝对行和相对列。当选中公式中的单元格地址时,使用F4键能简单地对单元格的相对引用、绝对引用和混合引用进行切换。上面单元格F5中所输入公式中的B$2即为混合引用,具有绝对行和相对列。不过,这样做存在一定的问题,即可能会出现
11、游戏已经结束但对游戏是否结束的判断仍然继续的情况!如上图中本来第5次投掷硬币后游戏已经结束,但程序仍然对第6次及以后游戏是否结束做出判断。因此,我们需要加入一个约束条件来消除上述情形的发生,也就是说,采用两层嵌套IF函数的方法。具体的做法是:我们在单元格F5中输入公式“=IF(F4=1,1,IF(D5-E5=B$2,1,0)”,即“如果上次已经结束,则本次结束,否则对本次是否结束进行判断”。我们将此单元格复制、粘贴到“是否结束”列的其它998个单元格中。最后,我们需要计算玩此游戏的最终收益,也就是最后所得报酬减去每次投币所花的钱。因为第1次不可能结束,所以我们可以直接在单元格G4中填入“-1”(因为每次投币需要花1元钱)。类似“是否结束”列的做法,我们从第2次投掷硬币起开始判断,在单元格G5中输入公式“=IF(F4=1,G4,IF(F5=1,D$2-A5,-A5)”,即“如果上次已经结束,则本次赢得等于上次赢得,否则根据本次是否结束来计算赢得如果结束,则得到最终报酬减去已经投币的花费;否则即为已经投币的花费”。我们将此单元格复制、粘贴到“赢得”列的其它998个单元格中。然后,在单元
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1