三体问题的仿真与实现_简单装配体运动仿真
三体问题的仿真与实现由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“简单装配体运动仿真”。
前 言
1.1 论文的背景
在太阳系内的天体都可以近似看做球形,并且与他们之间的距离相比,他们的的大小就可以忽略不计,因而他们能被看做质点。因此,可以用现代动力天文学的基础理论来研究这个问题。这部分的天体力学以牛顿的万有引力理论开始。从1687年的《数学原理》出版之时开始,证实牛顿的理论是否能够独立的提供一个完整的关于天体如何在太空中运动的认识是非常重要的。沿着这个思路进行研究,我们需要根据牛顿的万有引力定律来确定彼此吸引的n体之间的相对运动。
牛顿曾经用几何学原理解决了只存在相互引力作用的两个球的运动这一两体问题。在1710年,Johann Bernoulli证明,在两体问题中,一个粒子相对于另外一个粒子的运动可以被描述为一个圆锥曲线。在1734年,Daniel Bernoulli因为他关于分析处理两体问题的研究获得了法国科学院奖。在1744年,这个问题被Euler完全的解决了。同时对多维问题的研究也已经在进行中。在需要关于月球运动知识的驱动下,研究人员研究了太阳,地球和月亮构成的三体系统,并且月球理论很快就成为了早期研究的问题。
在经典力学,量子力学和天文学中,三体问题是一个出名的,还没有解决的问题,它被Whittaker描述为在所有动力学问题中最出名的问题,Hilbert认为它是一个完美数学问题的标准。天体物理中的三体问题可以简单的被描述为:三个天体在他们之间的相互之间的万有引力作用下,给出各个天体的初始条件,包括三个天体的质量、初始位置和初始速度,确定它们的后续运动,包括位置和速度随时间的变化。
像许多数学问题一样,简单的问题声明后面往往覆盖了问题解决方法的复杂性。虽然一体和两体的问题能够以封闭的形式通过初等函数方式来解决,但是三体问题是一个复杂的线性问题,没有相似的解决方法存在。探究三体问题的方式大抵能够分为三类:第一类是分析方法,其基本原理是把天体的坐标和速度展开为时间或其它小参数的级数形式的近似解析表达式,讨论天体的坐标和轨道要素随时间的变化规律;第二类是定性方法,选用微分方程的定性理论来研究很长一段时间内三体运动的宏观运动规律和全局性质;第三类是数值方法,这是直接依据微分方程的计算方式得出天体在特定时刻的详细位置和速度。这三类方法各有利弊。
因为求解三体问题的困难在于它的不确定性和不可预测性,可以考虑计算机在迭代计算中的优势,选择第三类方法,基于受力分析和经典力学,求其数值解。1.2 论文相关的国内外动态及研究价值
从三体问题被提出的300年间,人们只发现3族周期性特解。在十八和十九世纪,几乎所有著名的数学家们都曾试图解决这个问题,但是问题的进展不大。截止到目前为止,三体问题特解的族数被扩充到了16族。与此同时,在失败的尝试中,微分方程的理论不断地发展成为数学的一门更成熟的分支。
作为一个能被简单描述的问题,除了其内在的吸引力,三体问题与太阳系统稳定性有着密切的联系,这使得对三体系统的研究成为潜在的解决太阳系统稳定性问题的解决方案。多年来,人们对这个问题进行了大量的研究,从1750年到20世纪初,关于这个问题有800多篇援引了许多杰出的数学家和天文学家成果的论文发表。因此,除了解决一个重要的难题,更重要的是在解决问题的过程当中产生了好几种崭新的数学思想。这些数学理论的进步已经深入到不同的领域,包括近代动力学问题的理论。三体问题的研究加深了人们对天体运动的认识,激励了天体力学和数学物理的进一步成长,尤其是对人们研究太空火箭轨道和双星演变很有帮助。1.3 本文的研究内容
本文决定通过计算机的数值运算,利用经典力学中的牛顿三大定律和万有引力定律迭代求解天体运动中的三体问题。
同时,本文利用MATLAB的GUI功能,设计出简洁友好的界面,并且通过动画的方法将天体的位置和速度在空间直角坐标系上实时的表示出来,作出了天体物理实验用计算机模拟来进行的尝试。1.4 本文的创新之处
首先:通过理论与实践相结合的方式生动的展示了原本静态的文字概念。其次:通过MATLAB的GUI界面,可以让用户在不必了解程序内部实现的情况下,给出三个天体的初始条件,包括三个天体的质量、初始位置和初始速度,就可以知道随着时间的推移其宏观的位置和速度以及运动的宏观规律和全局性质。同时,还可以在不同的观察角度了解它们的运动过程。模型假设
1)忽略相对论效应的影响;
2)不考虑其它天体对系统的作用,所处宇宙空间是各向同性的; 3)忽略宇宙空间粒子、潮汐力的影响; 4)假设运动过程中没有能量损失;
5)将天体视为质点,不考虑它们在运动的过程中彼此之间的相互碰撞; 模型建立
3.1 具体时刻的状态
因为三个天体的位置和速度是随时间变化的,现在取很短的时间间隔t,假定这段时间间隔内系统参数没有变化,则可以考虑从系统每一时刻的状态计算后下一时刻的状态。在每一时刻,每一个天体都有各自的位置与速度,三个天体总共有六个未知量,每两个天体之间应用万有引力定律和牛顿第二定律可以列出两个方程,总共六个方程,这六个方程组成的方程组足可以求解这六个未知量。如果分割的时间间隔无限小,则可以求出精确解,但是在现实中这是没法完成的。因此,我们可以将时间分成许多小部分,用计算机迭代求解,得到随时间变化的系统的各个参量和系统的末状态。3.2 受力分析
如图3-1所示,每个天体都受到其他两个天体的万有引力作用。为方便计算,将天体1对天体2的作用,天体2对天体3的作用,天体3对天体1的作用分别按直角坐标系分解为f12x,f12y,f12z,f23x,f23y,f23z,f31x,f31y,f31z。由于f12=f21,f23=f32,f31=f13,可以用式子右边等效表示左边。
在万有引力f12、f23、f31作用下,天体
1、天体
2、天体3的加速度分别为。
图3-1 三体问题受力分析
3.3 运动规律及迭代方程
一、万有引力定律
二、牛顿第二定律
三、速度迭代
四、位置迭代
求解时还须将加速度a,速度迭代方程,位置迭代方程按直角坐标系分解如附录1。
用计算机编程求解,即可得任意时刻三个天体的位置和速度。模型求解与系统仿真
4.1 编码与运行
(1)系统所需的软、硬件
系统所用的硬件是普通的PC机。本程序的编码和界面设计部分用MATLAB进行开发。
(2)三体问题的编码
1o三个天体各个参数的初始化部分。
函数ThreeBodyProblem_OpeningFcn(hObject, eventdata, handles, varargin)是该程序的启动函数。初始化各个天体参数的部分已在程序代码中标注: function ThreeBodyProblem_OpeningFcn(hObject, eventdata, handles, varargin)ThreeBodyProblem的创建函数,此函数没有返回值,详情请参见OutputFcn hObject
图形句柄
eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息 varargin
ThreeBodyProblem 的启动参数(详情请参见 VARARGIN)
初始化第一个天体的质量,位置和速度
handles.FirstBodyMData = 0;handles.FirstBodyXData = 0;handles.FirstBodyYData = 0;handles.FirstBodyZData = 0;handles.FirstBodyUData = 0;handles.FirstBodyVData = 0;handles.FirstBodyWData = 0;
初始化第二个天体的质量,位置和速度
handles.SecondBodyMData = 0;handles.SecondBodyXData = 0;handles.SecondBodyYData = 0;handles.SecondBodyZData = 0;handles.SecondBodyUData = 0;handles.SecondBodyVData = 0;handles.SecondBodyWData = 0;
初始化第三个天体的质量,位置和速度
handles.ThirdBodyMData = 0;handles.ThirdBodyXData = 0;handles.ThirdBodyYData = 0;handles.ThirdBodyZData = 0;handles.ThirdBodyUData = 0;handles.ThirdBodyVData = 0;handles.ThirdBodyWData = 0;
handles.output = hObject;
此前指令更改了handles,必须靠guidata指令才能把更新了的handles加以保存,以供后续使用
guidata(hObject, handles);
默认值按钮的回调函数,用于设置三个天体的默认参数值,并且将设置的默认参数值显示到图形界面上:
function default_Callback(hObject, eventdata, handles)hObject
default控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
在图形界面的第一个天体的文本输入框内显示默认的输入值,此输入值为太阳的参数。
set(handles.FirstBodyM,'String',19.89);set(handles.FirstBodyX,'String',0);set(handles.FirstBodyY,'String',0);set(handles.FirstBodyZ,'String',0);set(handles.FirstBodyU,'String',0);set(handles.FirstBodyV,'String',0);set(handles.FirstBodyW,'String',0);将太阳的参数保存为“GUI数据”形式,以便共享 handles.FirstBodyMData = 19.89*10^29;handles.FirstBodyXData = 0;handles.FirstBodyYData = 0;handles.FirstBodyZData = 0;handles.FirstBodyUData = 0;handles.FirstBodyVData = 0;handles.FirstBodyWData = 0;在图形界面的第二个天体的文本输入框内显示默认的输入值,此输入值为地球的参数。
set(handles.SecondBodyM,'String',59.742);set(handles.SecondBodyX,'String',14.960);set(handles.SecondBodyY,'String',0);set(handles.SecondBodyZ,'String',0);set(handles.SecondBodyU,'String',0);set(handles.SecondBodyV,'String',29.78);set(handles.SecondBodyW,'String',0);将地球的参数保存为“GUI数据”形式,以便共享 handles.SecondBodyMData = 59.742*10^23;handles.SecondBodyXData = 14.960*10^10;handles.SecondBodyYData = 0;handles.SecondBodyZData = 0;handles.SecondBodyUData = 0;handles.SecondBodyVData = 29.78*10^3;handles.SecondBodyWData = 0;在图形界面的第三个天体的文本输入框内显示默认的输入值,此输入值为月球的参数。
set(handles.ThirdBodyM,'String',0.7349);set(handles.ThirdBodyX,'String',14.9984);set(handles.ThirdBodyY,'String',0);set(handles.ThirdBodyZ,'String',0);set(handles.ThirdBodyU,'String',0);set(handles.ThirdBodyV,'String',33.7953);set(handles.ThirdBodyW,'String',0);
将月球的参数保存为“GUI数据”形式,以便共享 handles.ThirdBodyMData = 0.7349*10^23;handles.ThirdBodyXData = 14.9984*10^10;handles.ThirdBodyYData = 0;handles.ThirdBodyZData = 0;handles.ThirdBodyUData = 0;handles.ThirdBodyVData = 33.7953*10^3;handles.ThirdBodyWData = 0;此前指令更改了handles,必须靠guidata指令才能把更新了的handles加以保存,以供后续使用
guidata(hObject,handles);
2o从文本输入框中按顺序输入三个天体的各个参数。
第一个天体的各个文本输入框的回调函数,用于获得文本输入框内输入的值,代码的具体解释已在程序中给出:
function FirstBodyX_Callback(hObject, eventdata, handles)hObject
FirstBodyX 控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
获得当前输入框的输入字符 tempData=get(hObject,'String');将字符转换为双精度数
handles.FirstBodyXData=str2double(tempData)*10^10;此前指令更改了handles,必须靠guidata指令才能把更新了的handles加以保存,以供后续使用
guidata(hObject,handles);
设置完所有属性后,在对象的创建过程中执行以下代码 function FirstBodyX_CreateFcn(hObject, eventdata, handles)hObject
FirstBodyX 控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 可编辑文本框控件通常在窗口上有一个白色的背景,更多详情请参见ISPC 和COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');end
function FirstBodyY_Callback(hObject, eventdata, handles)hObject
FirstBodyY控件的句柄(详情请参见 GCBO)
eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
获得当前输入框的输入字符 tempData=get(hObject,'String');将字符转换为双精度数
handles.FirstBodyYData=str2double(tempData)*10^10;此前指令更改了handles,必须靠guidata指令才能把更新了的handles加以保存,以供后续使用
guidata(hObject,handles);
设置完所有属性后,在对象的创建过程中执行以下代码 function FirstBodyY_CreateFcn(hObject, eventdata, handles)hObject
FirstBodyY 控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 可编辑文本框控件通常在窗口上有一个白色的背景,更多详情请参见ISPC和COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');end
function FirstBodyZ_Callback(hObject, eventdata, handles)hObject
FirstBodyZ控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
获得当前输入框的输入字符 tempData=get(hObject,'String');将字符转换为双精度数
handles.FirstBodyZData=str2double(tempData)*10^10;此前指令更改了handles,必须靠guidata指令才能把更新了的handles加以保存,以供后续使用
guidata(hObject,handles);
设置完所有属性后,在对象的创建过程中执行以下代码 function FirstBodyZ_CreateFcn(hObject, eventdata, handles)hObject
FirstBodyZ 控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 可编辑文本框控件通常在窗口上有一个白色的背景,更多详情请参见ISPC 和COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');end
function FirstBodyU_Callback(hObject, eventdata, handles)hObject
控件的句柄(详情请参见 GCBO)FirstBodyU eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
获得当前输入框的输入字符 tempData=get(hObject,'String');将字符转换为双精度数
handles.FirstBodyUData=str2double(tempData)*10^3;此前指令更改了handles,必须靠guidata指令才能把更新了的handles加以保存,以供后续使用
guidata(hObject,handles);
设置完所有属性后,在对象的创建过程中执行以下代码 function FirstBodyU_CreateFcn(hObject, eventdata, handles)设置完所有属性后,在对象的创建过程中执行以下代码 function FirstBodyX_CreateFcn(hObject, eventdata, handles)hObject
FirstBodyU 控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 可编辑文本框控件通常在窗口上有一个白色的背景,更多详情请参见ISPC 和COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');end
function FirstBodyV_Callback(hObject, eventdata, handles)hObject
FirstBodyV控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
获得当前输入框的输入字符 tempData=get(hObject,'String');将字符转换为双精度数
handles.FirstBodyVData=str2double(tempData)*10^3;此前指令更改了handles,必须靠guidata指令才能把更新了的handles加以保存,以供后续使用
guidata(hObject,handles);
设置完所有属性后,在对象的创建过程中执行以下代码 function FirstBodyV_CreateFcn(hObject, eventdata, handles)hObject
FirstBodyV 控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 可编辑文本框控件通常在窗口上有一个白色的背景,更多详情请参见ISPC 和COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');end
function FirstBodyW_Callback(hObject, eventdata, handles)hObject
FirstBodyW控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
获得当前输入框的输入字符 tempData=get(hObject,'String');将字符转换为双精度数
handles.FirstBodyWData=str2double(tempData)*10^3;此前指令更改了handles,必须靠guidata指令才能把更新了的handles加以保存,以供后续使用
guidata(hObject,handles);
设置完所有属性后,在对象的创建过程中执行以下代码 function FirstBodyW_CreateFcn(hObject, eventdata, handles)hObject
FirstBodyW 控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 可编辑文本框控件通常在窗口上有一个白色的背景,更多详情请参见ISPC 和COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');end
function FirstBodyM_Callback(hObject, eventdata, handles)hObject
FirstBodyM控件的句柄(详情请参见 GCBO)
eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
获得当前输入框的输入字符 tempData=get(hObject,'String');将字符转换为双精度数
handles.FirstBodyMData=str2double(tempData)*10^29;此前指令更改了handles,必须靠guidata指令才能把更新了的handles加以保存,以供后续使用
guidata(hObject,handles);
设置完所有属性后,在对象的创建过程中执行以下代码 function FirstBodyM_CreateFcn(hObject, eventdata, handles)hObject
FirstBodyM 控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 可编辑文本框控件通常在窗口上有一个白色的背景,更多详情请参见ISPC和 COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');end
第二个天体文本输入框的回调函数,用于获得文本输入框内输入的值,代码的具体解释已在程序中给出:
function SecondBodyX_Callback(hObject, eventdata, handles)hObject
SecondBodyX控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
获得当前输入框的输入字符 tempData=get(hObject,'String');将字符转换为双精度数
handles.SecondBodyXData=str2double(tempData)*10^10;此前指令更改了handles,必须靠guidata指令才能把更新了的handles加以保存,以供后续使用
guidata(hObject,handles);
设置完所有属性后,在对象的创建过程中执行以下代码 function SecondBodyX_CreateFcn(hObject, eventdata, handles)hObject
SecondBodyX控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 可编辑文本框控件通常在窗口上有一个白色的背景,更多详情请参见ISPC和COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');end
function SecondBodyY_Callback(hObject, eventdata, handles)hObject
SecondBodyY控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
获得当前输入框的输入字符 tempData=get(hObject,'String');将字符转换为双精度数
handles.SecondBodyYData=str2double(tempData)*10^10;此前指令更改了handles,必须靠guidata指令才能把更新了的handles加以保存,以供后续使用
guidata(hObject,handles);
设置完所有属性后,在对象的创建过程中执行以下代码 function SecondBodyY_CreateFcn(hObject, eventdata, handles)hObject
SecondBodyY控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 可编辑文本框控件通常在窗口上有一个白色的背景,更多详情请参见ISPC 和 COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');end
function SecondBodyU_Callback(hObject, eventdata, handles)hObject
SecondBodyU控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)获得当前输入框的输入字符 tempData=get(hObject,'String');将字符转换为双精度数
handles.SecondBodyUData=str2double(tempData)*10^3;此前指令更改了handles,必须靠guidata指令才能把更新了的handles加以保存,以供后续使用
guidata(hObject,handles);
设置完所有属性后,在对象的创建过程中执行以下代码 function SecondBodyU_CreateFcn(hObject, eventdata, handles)hObject
SecondBodyU控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 可编辑文本框控件通常在窗口上有一个白色的背景,更多详情请参见ISPC 和 COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');end
function SecondBodyV_Callback(hObject, eventdata, handles)hObject
SecondBodyV控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
获得当前输入框的输入字符 tempData=get(hObject,'String');将字符转换为双精度数
handles.SecondBodyVData=str2double(tempData)*10^3;此前指令更改了handles,必须靠guidata指令才能把更新了的handles加以保存,以供后续使用
guidata(hObject,handles);
设置完所有属性后,在对象的创建过程中执行以下代码 function SecondBodyV_CreateFcn(hObject, eventdata, handles)hObject
SecondBodyV控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 可编辑文本框控件通常在窗口上有一个白色的背景,更多详情请参见ISPC 和 COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');end
function SecondBodyZ_Callback(hObject, eventdata, handles)hObject
SecondBodyZ 控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
获得当前输入框的输入字符 tempData=get(hObject,'String');将字符转换为双精度数
handles.SecondBodyZData=str2double(tempData)*10^10;此前指令更改了handles,必须靠guidata指令才能把更新了的handles加以保存,以供后续使用
guidata(hObject,handles);
设置完所有属性后,在对象的创建过程中执行以下代码 function SecondBodyZ_CreateFcn(hObject, eventdata, handles)hObject
SecondBodyZ控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建 提示: 可编辑文本框控件通常在窗口上有一个白色的背景,更多详情请参见ISPC 和 COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');end
function SecondBodyW_Callback(hObject, eventdata, handles)hObject
SecondBodyW控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
获得当前输入框的输入字符 tempData=get(hObject,'String');将字符转换为双精度数
handles.SecondBodyWData=str2double(tempData)*10^3;此前指令更改了handles,必须靠guidata指令才能把更新了的handles加以保存,以供后续使用
guidata(hObject,handles);
设置完所有属性后,在对象的创建过程中执行以下代码 function SecondBodyW_CreateFcn(hObject, eventdata, handles)hObject
SecondBodyW控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 可编辑文本框控件通常在窗口上有一个白色的背景,更多详情请参见ISPC 和 COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');end
function SecondBodyM_Callback(hObject, eventdata, handles)hObject
SecondBodyM控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
获得当前输入框的输入字符 tempData=get(hObject,'String');将字符转换为双精度数
handles.SecondBodyMData=str2double(tempData)*10^23;此前指令更改了handles,必须靠guidata指令才能把更新了的handles加以保存,以供后续使用
guidata(hObject,handles);
设置完所有属性后,在对象的创建过程中执行以下代码 function SecondBodyM_CreateFcn(hObject, eventdata, handles)hObject
SecondBodyM控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 可编辑文本框控件通常在窗口上有一个白色的背景,更多详情请参见ISPC 和 COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');end
第三个天体文本输入框的回调函数,用于获得文本输入框内输入的值,代码的具体解释已在程序中给出:
function ThirdBodyX_Callback(hObject, eventdata, handles)hObject
ThirdBodyX控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
获得当前输入框的输入字符 tempData=get(hObject,'String');将字符转换为双精度数
handles.ThirdBodyXData=str2double(tempData)*10^10;此前指令更改了handles,必须靠guidata指令才能把更新了的handles加以保存,以供后续使用
guidata(hObject,handles);
设置完所有属性后,在对象的创建过程中执行以下代码 function ThirdBodyX_CreateFcn(hObject, eventdata, handles)hObject
ThirdBodyX控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 可编辑文本框控件通常在窗口上有一个白色的背景,更多详情请参见ISPC 和 COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');end
function ThirdBodyY_Callback(hObject, eventdata, handles)hObject
ThirdBodyY控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
获得当前输入框的输入字符 tempData=get(hObject,'String');将字符转换为双精度数
handles.ThirdBodyYData=str2double(tempData)*10^10;此前指令更改了handles,必须靠guidata指令才能把更新了的handles加以保存,以供后续使用
guidata(hObject,handles);
设置完所有属性后,在对象的创建过程中执行以下代码 function ThirdBodyY_CreateFcn(hObject, eventdata, handles)hObject
ThirdBodyY控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 可编辑文本框控件通常在窗口上有一个白色的背景,更多详情请参见ISPC 和 COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');end
function ThirdBodyZ_Callback(hObject, eventdata, handles)hObject
ThirdBodyZ控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
获得当前输入框的输入字符 tempData=get(hObject,'String');将字符转换为双精度数
handles.ThirdBodyZData=str2double(tempData)*10^10;此前指令更改了handles,必须靠guidata指令才能把更新了的handles加以保存,以供后续使用
guidata(hObject,handles);
设置完所有属性后,在对象的创建过程中执行以下代码 function ThirdBodyZ_CreateFcn(hObject, eventdata, handles)hObject
ThirdBodyZ控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 可编辑文本框控件通常在窗口上有一个白色的背景,更多详情请参见ISPC 和 COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');end
function ThirdBodyU_Callback(hObject, eventdata, handles)hObject
ThirdBodyU控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
获得当前输入框的输入字符 tempData=get(hObject,'String');将字符转换为双精度数
handles.ThirdBodyUData=str2double(tempData)*10^3;此前指令更改了handles,必须靠guidata指令才能把更新了的handles加以保存,以供后续使用
guidata(hObject,handles);
设置完所有属性后,在对象的创建过程中执行以下代码 function ThirdBodyU_CreateFcn(hObject, eventdata, handles)hObject
ThirdBodyU控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 可编辑文本框控件通常在窗口上有一个白色的背景,更多详情请参见ISPC 和 COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');end
function ThirdBodyV_Callback(hObject, eventdata, handles)hObject
ThirdBodyV控件的句柄(详情请参见 GCBO)
eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
获得当前输入框的输入字符 tempData=get(hObject,'String');将字符转换为双精度数
handles.ThirdBodyVData=str2double(tempData)*10^3;此前指令更改了handles,必须靠guidata指令才能把更新了的handles加以保存,以供后续使用
guidata(hObject,handles);
设置完所有属性后,在对象的创建过程中执行以下代码 function ThirdBodyV_CreateFcn(hObject, eventdata, handles)hObject
ThirdBodyV控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 可编辑文本框控件通常在窗口上有一个白色的背景,更多详情请参见ISPC 和 COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');end
function ThirdBodyW_Callback(hObject, eventdata, handles)hObject
ThirdBodyW控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)获得当前输入框的输入字符 tempData=get(hObject,'String');将字符转换为双精度数
handles.ThirdBodyWData=str2double(tempData)*10^3;此前指令更改了handles,必须靠guidata指令才能把更新了的handles加以保存,以供后续使用
guidata(hObject,handles);
设置完所有属性后,在对象的创建过程中执行以下代码 function ThirdBodyW_CreateFcn(hObject, eventdata, handles)hObject
ThirdBodyW控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 可编辑文本框控件通常在窗口上有一个白色的背景,更多详情请参见ISPC 和 COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');end
function ThirdBodyM_Callback(hObject, eventdata, handles)hObject
ThirdBodyM控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
获得当前输入框的输入字符 tempData=get(hObject,'String');将字符转换为双精度数
handles.ThirdBodyMData=str2double(tempData)*10^23;此前指令更改了handles,必须靠guidata指令才能把更新了的handles加以保存,以供后续使用
guidata(hObject,handles);
设置完所有属性后,在对象的创建过程中执行以下代码 function ThirdBodyM_CreateFcn(hObject, eventdata, handles)hObject
ThirdBodyM控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 可编辑文本框控件通常在窗口上有一个白色的背景,更多详情请参见ISPC 和 COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');end
3o开始计算三个天体的实时位置和速度
使用三个天体的各个参数进行迭代运算,同时画出三个天体的运行动画。这里由于坐标值的数量级是1010,x,y,z坐标轴的范围为-100~100,所以在画图的时候,计算出来的各个坐标值都要除以1010。如果其中一个天体的质量为0,那么程序将做两体问题的运算:
function OK_Callback(hObject, eventdata, handles)hObject
OK控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
清除坐标系原有的内容 cla 获得程序使用者输入的小球质量、刚开始小球的位置与速度,设置万有引力常量默认值以及程序的运动时间 g = 6.63*10^-11;获得输入框中第一个天体的各个参数
m1 = handles.FirstBodyMData;x1 = handles.FirstBodyXData;y1 = handles.FirstBodyYData;z1 = handles.FirstBodyZData;u1 = handles.FirstBodyUData;v1 = handles.FirstBodyVData;w1 = handles.FirstBodyWData;获得输入框中第二个天体的各个参数
m2 = handles.SecondBodyMData;x2 = handles.SecondBodyXData;y2 = handles.SecondBodyYData;z2 = handles.SecondBodyZData;u2 = handles.SecondBodyUData;v2 = handles.SecondBodyVData;w2 = handles.SecondBodyWData;获得输入框中第三个天体的各个参数
m3 = handles.ThirdBodyMData;x3 = handles.ThirdBodyXData;y3 = handles.ThirdBodyYData;z3 = handles.ThirdBodyZData;u3 = handles.ThirdBodyUData;v3 = handles.ThirdBodyVData;w3 = handles.ThirdBodyWData;
控制迭代时间 time = 100000;
加网格线 grid on
坐标轴显示的空间范围
axis([-100 100-100 100-100 100])
当m1,m2,m3其中有一个为0时,程序做两体运动。否则,程序做三体运动 if m3 == 0 && m1 ~= 0 && m2 ~=0 设置天体颜色、点型、大小等参数,每次循环都重新设置整个画面 h=line('Color',[1 0 0],'Marker','.','MarkerSize',50,'erasemode','normal');i=line('Color',[0 0 1],'Marker','.','MarkerSize',40,'erasemode','normal');
以0.1的时间步长迭代,用k来控制迭代进行的次数 for k=0:0.1:time 设置步长 t=100000;万有引力定律
f12=g*m1*m2/(sqrt((x1-x2)^2+(y1-y2)^2+(z1-z2)^2))^3*[x1-x2,y1-y2,z1-z2];
以下为对x轴方向的计算 牛顿第二定律 ax1=-f12(1)/m1;ax2=f12(1)/m2;坐标值迭代
x1=x1+u1*t+1/2*ax1*t^2;x2=x2+u2*t+1/2*ax2*t^2;速度值迭代 u1=u1+ax1*t;u2=u2+ax2*t;
以下为对y轴方向的计算 ay1=-f12(2)/m1;ay2=f12(2)/m2;
y1=y1+v1*t+1/2*ay1*t^2;y2=y2+v2*t+1/2*ay2*t^2;
v1=v1+ay1*t;v2=v2+ay2*t;
以下为对z轴方向的计算 az1=-f12(3)/m1;az2=f12(3)/m2;
z1=z1+w1*t+1/2*az1*t^2;z2=z2+w2*t+1/2*az2*t^2;
w1=w1+az1*t;w2=w2+az2*t;
重置两个小球的位置
set(h,'xdata',x1/10^10,'ydata',y1/10^10,'zdata',z1/10^10);set(i,'xdata',x2/10^10,'ydata',y2/10^10,'zdata',z2/10^10);
刷新画面 drawnow
控制速度 pause(0.01)end elseif m1 == 0 && m3 ~= 0 && m2 ~=0 设置天体颜色、点型、大小等参数,每次循环都重新设置整个画面 i=line('Color',[0 0 1],'Marker','.','MarkerSize',40,'erasemode','normal');l=line('Color',[0 1 0],'Marker','.','MarkerSize',40,'erasemode','normal');
以0.1的时间步长迭代,用k来控制迭代进行的次数 for k=0:0.1:time 设置步长 t=100000;万有引力定律
f23=g*m2*m3/(sqrt((x2-x3)^2+(y2-y3)^2+(z2-z3)^2))^3*[x2-x3,y2-y3,z2-z3];
以下为对x轴方向的计算 牛顿第二定律 ax2=-f23(1)/m2;ax3=f23(1)/m3;坐标值迭代
x2=x2+u2*t+1/2*ax2*t^2;x3=x3+u3*t+1/2*ax3*t^2;速度值迭代 u2=u2+ax2*t;u3=u3+ax3*t;
以下为对y轴方向的计算 ay2=-f23(2)/m2;ay3=f23(2)/m3;
y2=y2+v2*t+1/2*ay2*t^2;y3=y3+v3*t+1/2*ay3*t^2;
v2=v2+ay2*t;v3=v3+ay3*t;
以下为对z轴方向的计算 az2=-f23(3)/m2;az3=f23(3)/m3;
z2=z2+w2*t+1/2*az2*t^2;z3=z3+w3*t+1/2*az3*t^2;
w2=w2+az2*t;w3=w3+az3*t;
重置三个小球的位置
set(i,'xdata',x2/10^10,'ydata',y2/10^10,'zdata',z2/10^10);set(l,'xdata',x3/10^10,'ydata',y3/10^10,'zdata',z3/10^10);
刷新画面 drawnow
控制速度 pause(0.01)end elseif m2 == 0 && m3 ~= 0 && m1 ~=0 设置天体颜色、点型、大小等参数,每次循环都重新设置整个画面 h=line('Color',[1 0 0],'Marker','.','MarkerSize',50,'erasemode','normal');l=line('Color',[0 1 0],'Marker','.','MarkerSize',40,'erasemode','normal');
以0.1的时间步长迭代,用k来控制迭代进行的次数 for k=0:0.1:time 设置步长 t=100000;万有引力定律
f31=g*m3*m1/(sqrt((x3-x1)^2+(y3-y1)^2+(z3-z1)^2))^3*[x3-x1,y3-y1,z3-z1];
以下为对x轴方向的计算 牛顿第二定律 ax1=+f31(1)/m1;ax3=-f31(1)/m3;坐标值迭代
x1=x1+u1*t+1/2*ax1*t^2;x3=x3+u3*t+1/2*ax3*t^2;速度值迭代 u1=u1+ax1*t;u3=u3+ax3*t;
以下为对y轴方向的计算 ay1=+f31(2)/m1;ay3=-f31(2)/m3;
y1=y1+v1*t+1/2*ay1*t^2;y3=y3+v3*t+1/2*ay3*t^2;
v1=v1+ay1*t;v3=v3+ay3*t;
以下为对z轴方向的计算 az1=+f31(3)/m1;az3=-f31(3)/m3;
z1=z1+w1*t+1/2*az1*t^2;z3=z3+w3*t+1/2*az3*t^2;
w1=w1+az1*t;w3=w3+az3*t;
重置三个小球的位置
set(h,'xdata',x1/10^10,'ydata',y1/10^10,'zdata',z1/10^10);set(l,'xdata',x3/10^10,'ydata',y3/10^10,'zdata',z3/10^10);
刷新画面 drawnow
控制速度 pause(0.01)end else
设置天体颜色、点型、大小等参数,每次循环都重新设置整个画面 h=line('Color',[1 0 0],'Marker','.','MarkerSize',50,'erasemode','normal');i=line('Color',[0 0 1],'Marker','.','MarkerSize',40,'erasemode','normal');l=line('Color',[0 1 0],'Marker','.','MarkerSize',40,'erasemode','normal');
以0.1的时间步长迭代,用k来控制迭代进行的次数 for k=0:0.1:time 设置步长 t=100000;万有引力定律
f12=g*m1*m2/(sqrt((x1-x2)^2+(y1-y2)^2+(z1-z2)^2))^3*[x1-x2,y1-y2,z1-z2];
f23=g*m2*m3/(sqrt((x2-x3)^2+(y2-y3)^2+(z2-z3)^2))^3*[x2-x3,y2-y3,z2-z3];
f31=g*m3*m1/(sqrt((x3-x1)^2+(y3-y1)^2+(z3-z1)^2))^3*[x3-x1,y3-y1,z3-z1];
以下为对x轴方向的计算 牛顿第二定律
ax1=(-f12(1)+f31(1))/m1;ax2=(f12(1)-f23(1))/m2;ax3=(f23(1)-f31(1))/m3;坐标值迭代
x1=x1+u1*t+1/2*ax1*t^2;x2=x2+u2*t+1/2*ax2*t^2;x3=x3+u3*t+1/2*ax3*t^2;速度值迭代 u1=u1+ax1*t;u2=u2+ax2*t;u3=u3+ax3*t;
以下为对y轴方向的计算 ay1=(-f12(2)+f31(2))/m1;ay2=(f12(2)-f23(2))/m2;ay3=(f23(2)-f31(2))/m3;
y1=y1+v1*t+1/2*ay1*t^2;y2=y2+v2*t+1/2*ay2*t^2;y3=y3+v3*t+1/2*ay3*t^2;
v1=v1+ay1*t;v2=v2+ay2*t;v3=v3+ay3*t;
以下为对z轴方向的计算 az1=(-f12(3)+f31(3))/m1;az2=(f12(3)-f23(3))/m2;az3=(f23(3)-f31(3))/m3;
z1=z1+w1*t+1/2*az1*t^2;z2=z2+w2*t+1/2*az2*t^2;z3=z3+w3*t+1/2*az3*t^2;
w1=w1+az1*t;w2=w2+az2*t;w3=w3+az3*t;
重置三个小球的位置
set(h,'xdata',x1/10^10,'ydata',y1/10^10,'zdata',z1/10^10);set(i,'xdata',x2/10^10,'ydata',y2/10^10,'zdata',z2/10^10);set(l,'xdata',x3/10^10,'ydata',y3/10^10,'zdata',z3/10^10);
刷新画面 drawnow
控制速度 pause(0.01)end end
4o关闭按钮的回调函数,用来结束程序,关闭图形界面
function Close_Callback(hObject, eventdata, handles)hObject
Close控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
清除清空当前画图窗口,以方便画新的图形 clf;关闭界面 close;
5o改变观察者的视角,可以从各个角度观察三体的运行状态
用于控制方向角的滑键的回调函数,用于同步方位角文本输入框中显示的数值,同时改变观察者的观察方位角:
function azSlider_Callback(hObject, eventdata, handles)hObject
azSlider控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
获得当前滑键的值 az=get(hObject,'Value');将字符转换为双精度数
el=str2double(get(handles.elEditText,'String'));改变方位角输入文本框的显示数值,此数值为当前滑键所代表的值 set(handles.azEditText,'String',num2str(az));改变观察视角 view([az,el]);
设置完所有属性后,在对象的创建过程中执行以下代码 function azSlider_CreateFcn(hObject, eventdata, handles)hObject
azSlider控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 滑块控件通常有一个浅灰色的背景
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9.9.9]);end
用于控制方位角的文本输入框的回调函数,用于同步方位角滑键的值,同时改变观察者的方位角:
function azEditText_Callback(hObject, eventdata, handles)hObject
azEditText控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
获得当前输入框的输入字符。同时,将字符转换为双精度数 az=str2double(get(hObject,'String'));改变方位角滑键的值 set(handles.azSlider,'Value',az);获得当前的仰角
el=str2double(get(handles.elEditText,'String'));改变观察视角 view([az,el]);
设置完所有属性后,在对象的创建过程中执行以下代码 function azEditText_CreateFcn(hObject, eventdata, handles)hObject
azEditText控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 可编辑文本框控件通常在窗口上有一个白色的背景,更多详情请参见ISPC 和 COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');end
用于控制仰角的滑键的回调函数,用于同步仰角文本输入框中显示的数值,同时改变观察者的仰角:
function elSlider_Callback(hObject, eventdata, handles)hObject
elSlider控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
获得当前滑键的值 el=get(hObject,'Value');将字符转换为双精度数
az=str2double(get(handles.azEditText,'String'));改变仰角输入文本框的显示数值,此数值为当前滑键所代表的值 set(handles.elEditText,'String',num2str(el));改变观察视角 view([az,el]);
设置完所有属性后,在对象的创建过程中执行以下代码
function elSlider_CreateFcn(hObject, eventdata, handles)hObject
elSlider控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 滑块控件通常有一个浅灰色的背景
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9.9.9]);end
用于控制仰角的文本输入框的回调函数,用于同步仰角滑键的值,同时改变观察者仰角:
function elEditText_Callback(hObject, eventdata, handles)hObject
elEditText控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
获得当前输入框的输入字符。同时,将字符转换为双精度数 el=str2double(get(hObject,'String'));改变仰角滑键的值
set(handles.elSlider,'Value',el);获得当前的方位角
az=str2double(get(handles.azEditText,'String'));改变观察视角 view([az,el]);
设置完所有属性后,在对象的创建过程中执行以下代码 function elEditText_CreateFcn(hObject, eventdata, handles)hObject
elEditText控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,它会在调用完所有的CreateFcn函数后创建
提示: 可编辑文本框控件通常在窗口上有一个白色的背景,更多详情请参见ISPC 和 COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');end
用于恢复默认方位角和仰角的默认值按钮的回调函数,用于将方位角恢复为默认值-37.50,仰角恢复为默认值300,同时更新方位角滑键的值,方位角文本输入框显示的值,仰角滑键的值,仰角文本输入框显示的值: function ViewDefault_Callback(hObject, eventdata, handles)hObject
ViewDefault控件的句柄(详情请参见 GCBO)eventdata
保留在MATLAB里面的参数,它的作用是方便后面的程序使用 handles
GUI界面的句柄,可以通过它获取整个界面的信息(详情请参见GUIDATA)
设置方位角滑键的数值为方位角的默认值 set(handles.azSlider,'Value',-37.5);设置方位角文本框中显示的数值为方位角的默认值 set(handles.azEditText,'String',-37.5);设置仰角滑键的数值为仰角的默认值 set(handles.elSlider,'Value',30);设置仰角文本框中显示的数值为仰角的默认值 set(handles.elEditText,'String',30);改变观察视角 view([-37.5,30]);4.2 基于MATLAB的三体问题的运行成果
程序的初始图形界面如图4-1,在图形界面右端文本输入框可以依次输入程序运行所需的各个参数值,包括三个天体的质量,初始位置和初始速度。默认的参数值为:m1为太阳的质量,m2为地球的质量,m3为月球质量,x2的值为日地的平均距离,v2为地球绕太阳公转的平均线速度值,x3的值为日月的平均距离,v3为月球相对于太阳的平均线速度值。同时,文本输入框内标注了所输入数值的数量级。比如:当你在m1文本输入框内输入19.89,那么程序中实际使用到的数值是19.89 1029。
图4-1 输入参数
点击“使用默认值”按钮,如图4-2,界面三个天体文本输入框内显示三个天体各个参数的默认值。
图4-2 输入默认值
单击“开始”按钮,程序开始读取文本输入框中程序使用者输入的各个参数(如果不作变动的话,程序使用默认的参数值),按照万有引力和牛顿第二定律公式进行迭代计算,确定每经过一个时间步长t时,三个天体的实时位置和速度,并且在坐标系中即时显示,。如图4-3,我们就可以看到三个天体运动的动画(在某些情况下,天体会运动到坐标轴外边去)。
图4-3 显示动画
当程序的使用者改变三个天体的初始位置和速度是,便可以得到各种不同的运行结果。
如图4-4,在控制视角仪表板中点击方位角和仰角滑键可以改变观察者的观测点。同时,在滑键右边的文本输入框内,可以实时显示当前的方位角与仰角。在方位角和仰角的文本输入框内输入方位角和仰角也可以改变观察者的观察位置,并且在文本框内输入的数值可以实时的同步到滑键上,改变滑键的位置。
图4-4 改变观察视角
结 论
本论文先从研究三体问题的理论知识和背景入手,通过查阅文献和在互联网上搜索关于三体问题的相关资料,了解到了三体问题相关国内外的最新动态。
在论文中,详细介绍了什么是三体问题,三体问题的背景以及解决三体问题所面临的难题。论文除了对三体问题的基本概念的研究,还设计了MATLAB程序,用三体问题的数值解法,作出了三体问题的模拟动画。通过MATLAB设计的GUI界面,可以使使用者在不必考虑程序内部实现的情况下,给出三个天体的初始条件,包括三个天体的初始位置和初始速度,模拟三个天体的运动情况。
在书写论文和编译程序的过程中,我学到了很多东西,培养了我分析研究事情严谨的态度和创新精神,增加了我的对程序开发的动手能力,也减少了对于新知识新领域的学习的恐惧感,非常有利于我现在的学习和工作。
参考文献
[1] A treatise on the analytical dynamics of particles and rigid bodies, 4th edition, E.T Whittaker, Cambridge University Pre(1937).[2]李银山.三体问题综述[D].辽阳职业技术学院.111000;
[3] 李明涛,郑建华,于锡峥等.受摄三体问题研究[J].中国空间科学技术:2008,6:14108;
[5] 杨远玲,聂清香,吴晓梅等.N体问题的几种数值算法比较[J].计算物理:2005,23(5):599-602;
[6] Mauri Valtonen,Hannu Karttunen.The Three-Body Problem[M].America:Cambridge University Pre.2006;
[7] 李立康, 於崇华, 朱政华.微分方程数值解法[M].上海: 复旦大学出版社, 1999; [8] 彭芳麟, 管靖, 胡静, 卢圣治.MATLAB 编程应用, 理论力学计算机模拟[M].北京: 清华大学出版社, 2002;
[9] 易照华.天体力学基础[J].南京: 南京大学出版社, 1993 , 39–44;
[10] 黄元义.平面圆型限制性三体问题的运动方程[D].宜宾师专学报(自然科学版), 2(1995);
[11] 易照华, 李广宇, Gerhard HEINZEL,等.共轨限制性三体问题及其应用[J].中国科学: 物理学 力学 天文学, 2010, 40: 121 – 127;