三体运动的程序模拟

前几天看了《三体》,很不错的科幻小说。说到三体,我想到我大学的一个舍友叫王晶,和香港那个导演同名同姓同性别.记得有一次几个同学在一块聊天,有个女生问他:父母为什么给他取名叫晶.他说叫晶是父母希望能有三个太阳守护着他。那时我还很单纯,不会用五行缺什么的话来讽刺他,只是说,如果给他起名叫王晶晶的话,那就有6个太阳守护他了.现在对三体有了一些了解,才意识到被三个太阳罩着,那不叫守护,应该是被蹂躏.三体内的行星,感觉是被三个恒星玩弄于股掌之间,如同球一样踢来踢去.

空间中三个星体,受万有引力作用下的运动被称为三体运动,这是最简单且引人注目的混沌。混沌确定系统是庞加莱在研究三体问题时第一次发现的。仅仅三颗星体的运动,就能变得复杂而眩目。这种复杂曾令数学家们在百年间困惑不已。如果只有两个天体,那么一切是多么简单,18世纪的伯努利就已解出了运动的所有可能轨迹,用合适的坐标,就能用简单的曲线描述。但仅仅是多了一个天体,就要等到19世纪的庞加莱,才给出了差强人意的答案:没有漂亮的解(正式术语是三体系统是不可积的)。这并非因为人类的智慧所限,而是从本质上来说,三个天体之间的运动轨迹不可能用简单的式子表达。自然并不像原来期盼的那么简单,它的复杂性令人绝望。但正是这种复杂性孕育了无数可能。并非所有三体系统都不可理解,通过合适的构造,我们可以得到一些会沿着既定曲线运转的系统。通过合适地安排速度和位置,我们也可以使其中一颗星体按照任意给定的顺序探访其余两颗星体。但这些系统是如此脆弱,一点点扰动就会打破微妙的平衡,后果可能是其中一颗星体被抛射出去,从此分道扬镳。混沌,似乎代表了无尽的不确定性,以及所带来的恐惧,就像我们的祖先曾感受过的那样。

软件运行后,会有三个大点的球代表恒星,三个球互相影响着旋转.可以为三体世界添加一个行星,和一个彗星.可以看到行星的恒纪元,乱纪元.

代码使用万有引力和势能动能守恒定律为基础,详细见我上一篇文章:行星运动轨迹的程序实现.当然程序写得很简化,其精度是没法保证的.如果真要做精确的话,微积分是必需的.还有就是在恒纪元时,行星容易进入恒星的内部,所以我做了点篡改,保证行星在恒星外部旋转.这一修改会使用行星的轨迹线不够平滑.

程序启动后,会出现三个随机大小的球体在运动.

鼠标右键用于控制视角
键盘U用于开关UI用户界面.
通过UI用户界面可以设置三个球体的质量,设置万有引力系数,设置天体运行速度,设置球体的显示大小.

键盘1,2,3用于开关三个球体运动轨迹的显示
键盘9,用于开关行星,启动后,会有一个小球体被三体所吸引
键盘0,用于开关慧星,启动后,会有发射一个球体.
键盘4,5分别用于开关行星和彗星运动轨迹的显示

键盘G,用于开关三维网格的显示
键盘C,用于开关坐标轴的显示
键盘P,用于暂停
键盘R,用于重置,这时会随机为三个球体设置质量与初速度.

软件下载地址:http://files.cnblogs.com/WhyEngine/Chaos.7z

时间: 2024-08-09 15:25:46

三体运动的程序模拟的相关文章

N体运动的程序模拟

这依然是与<三体>有关的一篇文章.空间中三个星体在万有引力作用下的运动被称之为三体问题,参见我的上一篇文章:三体运动的程序模拟.而这一节,对三体问题进行了扩展,实现了空间中N个星体在万有引力下的运动模拟. 程序中使用了两个物理定律: (1)万有引力定律 这是牛顿发现的:任意两个质点有通过连心线方向上的力相互吸引.该引力的大小与它们的质量乘积成正比,与它们距离的平方成反比,与两物体的化学本质或物理状态以及中介物质无关. 以数学表示为: 其中: : 两个物体之间的引力 : 万有引力常数 : 物体1

编程序模拟银行家算法

一.编程序模拟银行家算法 1)对用银行家算法来避免死锁的方法有较深入的了解,给出系统的初始状态,模拟避免死锁的动态过程. 2)银行家算法中的数据结构 (1)可利用资源向量Available.这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变.Available[j]=K,则表示系统中现有Rj类资源K个. (2)最大需求矩阵Max.这是一个n*m的矩阵,它定义了系统中n个进程中的每一个进程对

rabbitmq的安装和命令介绍及python程序模拟生产者和消费者

[介绍] RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. RabbitMQ是流行的开源消息队列系统,用erlang语言开发 RabbitMQ是AMQP(高级消息队列协议)的标准实现 官网:http://www.rabbitmq.com/ [安装] 方式:yum/rpm 系统环境 [[email protected]_server scripts]# ifconfig | sed -n 's#.*inet addr:

java程序模拟浏览器访问Web服务器的处理过程

import java.net.*; import java.io.*; /* * 演示浏览器访问Web服务器的处理过程 */ public class WebServerDemo { public static void main(String[] args)throws IOException{ ServerSocket ss=new ServerSocket(10000); Socket s=ss.accept(); byte[] bytes=new byte[1024]; int len

WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构

原文:WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构 细算起来,已经有好几个月没有真正的写过文章了.近半年以来,一直忙于我的第一本WCF专著<WCF技术剖析>的写作,一直无暇管理自己的Blog.到目前为止<WCF技术剖析(卷1)>的写作暂告一段落,初步预计于下个月由武汉博文视点出版.在<WCF技术剖析>写作期间,对WCF又有了新的感悟,为此以书名开始本人的第三个WCF系列.本系列的目的在于对<WCF技术剖析>的补充,会对书中的一些内容进行展

C程序模拟实现银行家算法

上周又做操作系统实验,题目是用程序模拟实现银行家算法,写了半天还真有点晕,主要是因为想尽可能符合课本上的描述,所以写出来的程序就比较恶心了,好了,银行家算法就不多说了,不了解的可以先看一下百度百科上的描述,分段上代码吧.完整代码包下载地址:http://files.cnblogs.com/pianoid/Banker.rar 首先要定义一些结构体,为了符合课本描述,我只定义了一个结构体: typedef struct { int A; int B; int C;}RESOURCE; 结构体里面的

Android应用程序模拟手机按键

记得以前在做一个C++项目时,需要在某一步操作之后人为用代码模拟敲键盘上的回车键(Enter)效果. 出于好奇,这几天研究了一下Android中手机(或平板)上各种按键的键值.模拟方法及最终效果. 1.先来看看Android中对按键和值的定义方式: 1 public static final int KEYCODE_UNKNOWN = 0; 2 /** Key code constant: Soft Left key. */ 3 public static final int KEYCODE_S

一个简单java程序模拟与Mysql Server建立连接及发送查询SQL

使用普通socket来模拟与Mysql Server建立连接及发送查询SQL,如下代码所示: Socket socket = new  Socket("127.0.0.1",3306); OutputStream out = socket.getOutputStream(); BufferedOutputStream bos = new BufferedOutputStream(out); //建立连接报文信息 来自wireshark(捕捉终端执行mysql -u root -p -h

【转】使用java程序模拟页面发送http的post请求

在web应用程序中,一般都是通过页面发送http的post请求,但也可以使用java程序来模拟页面发送请求,代码如下: [java] view plaincopy import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.