导航:首页 > 编程语言 > python太阳系代码

python太阳系代码

发布时间:2022-09-18 09:33:40

‘壹’ 求python三体建模代码

三体模型

1. 代码

现在为了把之前的代码延伸到三体系统,需要给常数增加一些东西——增加第三体的质量、位置和速率向量。把第三恒星的质量视作和太阳的质量等同。

#Mass of the Third Starm3=1.0 #Third Star#Position of the Third Starr3=[0,1,0] #mr3=sci.array(r3,dtype='float64')#Velocity of the Third Starv3=[0,-0.01,0]v3=sci.array(v3,dtype='float64')

需要更新代码中质心和质心速率的公式。#Update COM formular_com=(m1*r1+m2*r2+m3*r3)/(m1+m2+m3)#Update velocity of COM formulav_com=(m1*v1+m2*v2+m3*v3)/(m1+m2+m3)

对一个三体系统来说,需要修改运动方程使之包括另一物体施加的额外引力。因此,需要在RHS上,对问题中每一对物体施加力的其他物体增加一个力项。在三体系统的情况下,一个物体会受到其余两个物体施加的力的影响并因此在RHS上出现两个力项。数学上可表示为:

为在代码中反映这些变化,需要为odeint求解器创建一个新函数。

def ThreeBodyEquations(w,t,G,m1,m2,m3): r1=w[:3] r2=w[3:6] r3=w[6:9] v1=w[9:12] v2=w[12:15] v3=w[15:18] r12=sci.linalg.norm(r2-r1) r13=sci.linalg.norm(r3-r1) r23=sci.linalg.norm(r3-r2) dv1bydt=K1*m2*(r2-r1)/r12**3+K1*m3*(r3-r1)/r13**3 dv2bydt=K1*m1*(r1-r2)/r12**3+K1*m3*(r3-r2)/r23**3 dv3bydt=K1*m1*(r1-r3)/r13**3+K1*m2*(r2-r3)/r23**3 dr1bydt=K2*v1 dr2bydt=K2*v2 dr3bydt=K2*v3 r12_derivs=sci.concatenate((dr1bydt,dr2bydt)) r_derivs=sci.concatenate((r12_derivs,dr3bydt)) v12_derivs=sci.concatenate((dv1bydt,dv2bydt)) v_derivs=sci.concatenate((v12_derivs,dv3bydt)) derivs=sci.concatenate((r_derivs,v_derivs)) return derivs

最后,调用odeint函数并向其提供上述函数连同初始条件。#Package initial parametersinit_params=sci.array([r1,r2,r3,v1,v2,v3]) #Initial parametersinit_params=init_params.flatten() #Flatten to make 1D arraytime_span=sci.linspace(0,20,500) #20 orbital periods and 500 points#Run the ODE solverimport scipy.integratethree_body_sol=sci.integrate.odeint(ThreeBodyEquations,init_params,time_span,args=(G,m1,m2,m3))

‘贰’ 用python做一个地球围绕太阳转的图形

平台: python2.7.10 + wxpython 3.0.2

#!/usr/bin/env python
#-*- coding: utf-8 -*-

from __future__ import unicode_literals
import wx

__version__ = '0.1'
app_title = 'Temperature Translator - {}'.format(__version__)

class TempTranslator(wx.Frame):
def __init__(self, parent=None, size=(620, 200), title=app_title):
super(TempTranslator, self).__init__(parent, size=size, title=title)
self.SetMinSize(self.GetSize())
self.panel = wx.Panel(self)

self.init_layout()
self.panel.Layout()
self.Centre(wx.BOTH)
self.Show()

def init_layout(self):
font = self.GetFont()
font.SetWeight(wx.BOLD)
font.SetPointSize(15)
self.panel.SetFont(font)

vbox = wx.BoxSizer(wx.VERTICAL)
self.add_label(vbox, f2c=True)
self.f_tc1, self.c_tc1 = self.add_input(vbox, f2c=True)
self.f_tc1.Bind(wx.EVT_TEXT, self.on_f_text)

line = wx.StaticLine(self.panel, -1, style=wx.LI_HORIZONTAL)
style = wx.GROW | wx.ALIGN_CENTER_VERTICAL | wx.RIGHT | wx.TOP
vbox.Add(line, 0, style, 5)

self.add_label(vbox, f2c=False)
self.c_tc2, self.f_tc2 = self.add_input(vbox, f2c=False)
self.c_tc2.Bind(wx.EVT_TEXT, self.on_c_text)

self.panel.SetSizer(vbox)

def add_label(self, vbox, f2c=True):
if f2c:
text1 = 'Fahrenheit'
text2 = 'Celsius'
else:
text1 = 'Celsius'
text2 = 'Fahrenheit'

hbox = wx.BoxSizer(wx.HORIZONTAL)
label = wx.StaticText(self.panel, -1, text1, size=(-1, 30),
style=wx.ALIGN_CENTER)
hbox.Add(label, 1, wx.EXPAND, 10)

label = wx.StaticText(self.panel, -1, text2, size=(-1, 30),
style=wx.ALIGN_CENTER)
hbox.Add(label, 1, wx.EXPAND, 10)
vbox.Add(hbox, 0, wx.EXPAND, 10)

def add_input(self, vbox, f2c=True):
hbox = wx.BoxSizer(wx.HORIZONTAL)
tc1 = wx.TextCtrl(self.panel, -1, size=(260, 40), style=wx.TE_CENTER)
tc1.Bind(wx.EVT_TEXT, self.on_f_text)

label = wx.StaticText(self.panel, -1, ' = ')

tc2 = wx.TextCtrl(self.panel, -1, size=(260, 40), style=wx.TE_CENTER)

hbox.Add(tc1, 1, wx.EXPAND, 10)
hbox.Add(label, 0, wx.ALL | wx.EXPAND, 10)
hbox.Add(tc2, 1, wx.EXPAND, 10)
vbox.Add(hbox, 1, wx.EXPAND, 10)
return tc1, tc2

def on_f_text(self, evt):
f = self.f_tc1.GetValue()
self.c_tc1.SetValue('{}'.format(self.f2c(f)))

def on_c_text(self, evt):
c = self.c_tc2.GetValue()
self.f_tc2.SetValue('{}'.format(self.c2f(c)))

def f2c(self, f):
return (float(f) - 32) / 1.8 if f else ''

def c2f(self, c):
return float(c) * 1.8 + 32 if c else ''

if __name__ == '__main__':
app = wx.App()
TempTranslator()
app.MainLoop()

‘叁’ 现代计算机是如何计算圆周率的

可以用编程语言计算。以下是python语言

pi = 0.0

N = 100

for i in range(N):

pi += (1/pow(16,i) * ( 4/(8*i +1) -2/(8*i+4)-1/(8*i+5) -1/(8*i +6) ) )

print('圆周率为{:.10f}'.format(pi))

请把以上代码拷进python语言开发环境里运行,结果如下(下图是使用python开发环境Spyder运行上述代码的结果):圆周率为3.1415926536.

(3)python太阳系代码扩展阅读

电子计算机的出现使π值计算有了突飞猛进的发展。1949年,美国制造的世上首部电脑-ENIAC(Electronic Numerical Integrator And Computer)在阿伯丁试验场启用了。

次年,里特韦斯纳、冯纽曼和梅卓普利斯利用这部电脑,计算出π的2037个小数位。这部电脑只用了70小时就完成了这项工作,扣除插入打孔卡所花的时间,等于平均两分钟算出一位数。

五年后,IBM NORC(海军兵器研究计算机)只用了13分钟,就算出π的3089个小数位。科技不断进步,电脑的运算速度也越来越快,在60年代至70年代,随着美、英、法的电脑科学家不断地进行电脑上的竞争,π的值也越来越精确。

在1973年,Jean Guilloud和Martin Bouyer以电脑CDC 7600发现了π的第一百万个小数位。

在1976年,新的突破出现了。萨拉明(Eugene Salamin)发表了一条新的公式,那是一条二次收敛算则,也就是说每经过一次计算,有效数字就会倍增。

高斯以前也发现了一条类似的公式,但十分复杂,在那没有电脑的时代是不可行的。这算法被称为布伦特-萨拉明(或萨拉明-布伦特)算法,亦称高斯-勒让德算法。

1989年美国哥伦比亚大学研究人员用克雷-2型(Cray-2)和IBM-3090/VF型巨型电子计算机计算出π值小数点后4.8亿位数,后又继续算到小数点后10.1亿位数。

2010年1月7日——法国工程师法布里斯·贝拉将圆周率算到小数点后27000亿位。2010年8月30日——日本计算机奇才近藤茂利用家用计算机和云计算相结合,计算出圆周率到小数点后5万亿位。

2011年10月16日,日本长野县饭田市公司职员近藤茂利用家中电脑将圆周率计算到小数点后10万亿位,刷新了2010年8月由他自己创下的5万亿位吉尼斯世界纪录。56岁的近藤茂使用的是自己组装的计算机,从10月起开始计算,花费约一年时间刷新了纪录。

‘肆’ python 类的成员是列表的话设置_init_时候命名该如何命名

你想描述什么?
def getPlanet(self,xxx):?
还是fun2获取不到self.

‘伍’ python太阳花怎么做

‘陆’ 用python,turtle绘制数字,如绘制260这三个数字,同时要求每个数字填不同的颜色

1、双击打开pycharm开发工具,在已新建的项目中新建python文件,输入文件名称。

‘柒’ arcgis9.3中python如何编程太阳入射角余弦

可以使用math模块,导入math后,使用math函数中相关函数就可以了。

‘捌’ 怎样用python画图

思路:

1. 确定好需要画的图。

2. 创建一个画布,用来画你需要的图。

(1)画布大小,可以使用默认大小,也可以自定义画布大小。

(2)画布背景色bgcolor()。

(3)确定起点位置。

3. 画笔的设置。

(1)画笔的大小,颜色。

(2)画笔运行属性。

二、定义画布参数

importturtleast
t.screensize(width=None,heigh=None,bg=None)#以像素为单位,参数分别为画布的宽,高,背景色
t.screensize()#返回默认大小(400,300)
t.Screen()#也是表示默认画布大小,注意S大写
t.setup(w=0.5,h=0.75,startx=None,starty=None)#w,h为整数是表示像素,为小数时表示占据电脑屏幕的比例
#startx,starty坐标表示矩形窗口左上角顶点的位置,默认为屏幕中心位置

三、定义画笔

1、画笔的状态

在画布上默认有一个坐标原点为画布中心的坐标轴,坐标原点上有一只面朝x轴正方向小乌龟。这里我们描述小乌龟时使用了两个词语:坐标原点(位置),面朝x轴正方向(方向),turtle绘图中,就是使用位置方向描述小乌龟(画笔)的状态。

2、画笔的属性

画笔(画笔的属性,颜色、画线的宽度)

(1)turtle.pensize():设置画笔的宽度;

(2)turtle.pencolor():没有参数传入,返回当前画笔颜色,传入参数设置画笔颜色,可以是字符串如"green","red",也可以是RGB 3元组;

>>>pencolor('brown')
>>>tup=(0.2,0.8,0.55)
>>>pencolor(tup)
>>>pencolor()
'#33cc8c'

(3)turtle.speed(speed):设置画笔移动速度,画笔绘制的速度范围[0,10]整数,数字越大越快。

相关推荐:《Python入门教程》

3、绘图命令

操纵海龟绘图有着许多的命令,这些命令可以划分为3种:一种为运动命令,一种为画笔控制命令,还有一种是全局控制命令。

(1)画笔运动命令:

(3)全局控制命令:

四、命令详解

turtle.circle(radius,extent=None,steps=None)

描述:以给定半径画圆

参数:

radius(半径);半径为正(负),表示圆心在画笔的左边(右边)画圆;

extent(弧度) (optional);

steps (optional) (做半径为radius的圆的内切正多边形,多边形边数为steps);

举例:

circle(50)#整圆;
circle(50,steps=3)#三角形;
circle(120,180)#半圆

五、绘图举例

(1)菱形太阳花

importturtleast#turtle库是python的内部库,直接import使用即可
defdraw_diamond(turt):
foriinrange(1,3):
turt.forward(100)#向前走100步

希望我的回答对你有帮助

‘玖’ 如何用python绘制☀类似这样的太阳

使用turtle库绘制,也可以花20让我给你绘制

‘拾’ 使用Matplotlib模拟Python中的三维太阳系

编程的一个用途是通过模拟来帮助我们理解真实世界。这一技术被应用于科学、金融和许多其他定量领域。只要控制现实世界属性的“规则”是已知的,你就可以编写一个计算机程序来 探索 你遵循这些规则所得到的结果。在本文中,您将 用Python模拟三维太阳系 使用流行的可视化库Matplotlib

在这篇文章,你将能够用Python创建你自己的3D太阳系,你可以用你想要的多少太阳和行星。下面是一个简单的太阳系的一个例子,它有一个太阳和两个行星:

你还可以打开动画地板上的二维投影,更好地展示太阳系的三维本质。下面是同样的太阳系模拟,包括2D投影:

下面是这篇文章的概要,以便您知道接下来会发生什么:

在本文中,您将使用面向对象的编程和Matplotlib。如果您希望阅读更多关于任何一个主题的内容,您可以阅读:

让我们从使用Matplotlib在Python中模拟一个3D太阳系开始。

太阳系中的太阳、行星和其他天体都是运动中的天体,它们相互吸引。引力在任何两个物体之间施加。

如果这两个对象有大量M_1和M_2是距离r然后,你可以用以下公式计算它们之间的引力:

常数G是一个引力常数。您将看到如何在模拟的版本中忽略这个常量,在本文中,您将使用任意单位的质量和距离,而不是kg和m。

一旦你知道了两个物体之间的引力,你就可以计算出加速度。a每个物体都是由于这种引力而经历的,使用以下公式:

使用这个加速度,你可以调整运动物体的速度。当速度发生变化时,速度和方向都会发生变化。

当用Python模拟一个三维太阳系时,你需要用三维空间来表示太阳系。因此,这个3D空间中的每个点都可以用三个数字来表示, x -, y -和 z -坐标。例如,如果你想把太阳放在太阳系的中心,你可以将太阳的位置表示为 (0, 0, 0) .

您还需要在3D空间中表示向量。矢量具有大小和方向。你需要像速度、加速度和力这样的量的矢量,因为这些量都有一个方向和一个震级。

在本文中,我将不详细讨论向量代数。相反,我将陈述您需要的任何结果。你可以读到更多关于向量与向量代数如果你愿意的话。

为了在代码中更容易地处理向量,您可以创建一个类来处理它们。编写这个类将作为对类和面向对象编程的快速刷新。你可以读到用Python进行面向对象的编程如果你觉得你需要一个更彻底的解释。虽然您也可以创建一个类来处理3D空间中的点,但这并不是必要的,在本文中我也不会创建一个类。

如果您熟悉向量和面向对象编程,可以跳过本节,只需在定义 Vector 班级。

创建一个名为 vectors.py 中,您将定义 Vector 班级。您将使用此脚本定义类并对其进行测试。然后,可以删除最后的测试代码,只需在这个脚本中保留类定义:

这个 __init__() 方法的 Vector 类有三个参数,表示每个轴上的值。每个参数的默认值为 0 表示该轴的原点。虽然我们不喜欢在Python中使用单个字母名称, x , y ,和 z 是恰当的,因为它们代表了数学中常用的笛卡尔坐标系的术语。

您还定义了两个Dunder方法来将对象表示为一个字符串:

在代码段的末尾,您可以更多地了解这两种类型的字符串表示之间的差异。Python编码书第9章 .

测试代码块的输出如下:

在Python项目中的这个3D太阳系中,如果 Vector 类是可索引的,以便您可以使用 [] 带有索引以提取其中一个值的符号。使用当前形式的类,如果添加 print(test[0]) 在您的脚本中,您将得到一个 TypeError 说 Vector 对象不可订阅。您可以通过向类定义中添加另一个Dud方法来修复这个问题:

通过定义 __getitem__() ,你做了 Vector 可索引的类。向量中的第一项是 x 的价值。 y 的价值。 z 。任何其他索引都会引发错误。测试代码块的输出如下:

test[0] 返回向量中的第一个项, x .

可以定义类的对象的加法和减法。 __add__() 和 __sub__() DunderMethod.这些方法将使您能够使用 + 和 - 执行这些操作的符号。如果没有这些Dud方法,则使用 + 和 - 提出 TypeError .

若要添加或减去两个向量,可以分别添加或减去向量的每个元素:

双管齐下 __add__() 和 __sub__() 返回另一个 Vector 对象,每个元素等于两个原始向量中相应元素的加减。输出如下:

对于乘法和除法,您也可以这样做,尽管在处理向量时,这些操作需要更多的注意。

在处理向量时,不能仅仅引用“乘法”,因为有不同类型的“乘法”。在这个项目中,你只需要标量乘法。标量乘法是指向量与标量相乘(标量有一个数量级,但没有方向)。但是,在本小节中,您还将定义点积两个向量。你想用 * 运算符,既适用于标量乘法,也适用于点积。因此,可以定义 __mul__() DunderMethod:

使用 * 运算符将取决于第二个操作数,即 * 符号,是标量或向量。如果由参数表示的第二个操作数 other ,是类型的 Vector ,计算了点积。但是,如果 other 是类型的 int 或 float ,返回的结果是一个新的 Vector ,按比例调整。

以上代码的输出如下:

如果您想要标量乘法,则需要标量乘法。 后 这个 * 象征。如果您试图运行该语句 3*Vector(3, 5, 9) 相反, TypeError 将被提高,因为 Vector 类不是用于使用的有效操作数。 * 带有类型的对象 int .

两个向量是分不开的。但是,可以将向量除以标量。您可以使用 / 运算符 Vector 如果定义 __truep__() DunderMethod:

产出如下:

如果你有一个向量(x,y,z),您可以找到它的震级使用表达式(x^2+y^2+z^2)。你也可以规范化向量。归一化给出一个方向相同但大小为 1 。您可以通过将向量的每个元素除以矢量的大小来计算归一化向量。

可以定义两个新方法来完成 Vector 班级:

测试代码提供了以下输出:

第三个输出给出了归一化向量的大小,表明它的大小是 1 .

根据使用的IDE或其他工具,在分割时可能会收到警告 self.x , self.y ,和 self.z ,如在 __truep__() 和 normalize() 。您不需要担心这个问题,但是如果您想要修复它,可以通过更改 __init__() 签署下列任何一项:

这两个选项都让IDE知道参数应该是浮动的。在第二个选项中,您使用类型暗示来实现。

您现在可以删除此脚本末尾的测试代码,以便您在 vectors.py 是类的定义。

现在,你可以开始研究Python中的3D太阳系了。您将创建两个主要类:

你将使用Matplotlib来创建和可视化太阳系。您可以在终端中使用以下内容来安装Matplotlib:

这个 Axes3D Matplotlib中的物体将“托管”太阳系。如果您使用过Matplotlib,并且主要使用了2D绘图,那么您将使用(有意或不知情的) Axes 对象。 Axes3D 的3D等效 Axes ,顾名思义!

现在是开始编写和测试这些类的时候了。您可以创建两个新文件:

接下来,您将开始处理 SolarSystem 班级。

您将在整个项目中使用任意单元。这意味着,与其用米作为距离,而用公斤作为质量,你将使用没有单位的数量。参数 size 用于定义包含太阳系的立方体的大小:

定义 SolarSystem 类的 __init__() 方法,其中包含参数。 size 。您还定义了 bodies 属性。这个属性是一个空列表,当你稍后创建它们时,它将包含太阳系内的所有天体。这个 add_body() 方法可以用来将轨道天体添加到太阳系中。

下一步是介绍Matplotlib。属性创建图形和一组轴。 subplots() 在 matplotlib.pyplot :

你打电话 plt.subplots() ,它返回一个图形和一组轴。返回的值分配给属性。 fig 和 ax 。你打电话 plt.subplots() 有以下论点:

您还可以调用该方法。 tight_layout() 。这是 Figure 类在Matplotlib中。此方法减少了图形边缘的边距。

到目前为止,您可以在控制台/REPL中尝试代码:

这给出了一组空的三维轴的图形:

您将使用 size 参数设置此多维数据集的大小。你会回到 SolarSystem 稍后上课。目前,您可以将您的注意力转向定义 SolarSystemBody 班级。

您可以开始创建 SolarSystemBody 类及其 __init__() 方法。我正在截断 SolarSystem 下面代码中的类定义用于显示。在此代码块和以后的代码块中,包含 # ... 指出您之前编写的未显示的代码:

中的参数。 __init__() 方法是:

你也叫 add_body() 方法中定义的 SolarSystem 类将这个天体添加到太阳系中。稍后,您将向 __init__() 方法。

中定义另一个方法。 SolarSystemBody 用其当前的位置和速度移动物体:

这个 move() 方法重新定义 position 属性的 velocity 属性。我们已经讨论过你是如何用任意单位来计算距离和质量的。你也在使用任意的时间单位。每个‘时间单位’将是循环的一个迭代,您将使用它来运行模拟。因此, move() 将身体按一次迭代所需的数量移动,这是一个时间单位。

你们已经创建了Matplotlib结构,它将容纳太阳系及其所有天体。现在,您可以添加一个 draw() 方法 SolarSystemBody 若要在Matplotlib图上显示主体,请执行以下操作。您可以通过绘制一个标记来完成这一任务。

在这样做之前,您需要在 SolarSystemBody 若要控制将绘制的标记的颜色和大小以表示身体,请执行以下操作:

类属性 min_display_size 和 display_log_base 设置参数,以确定您将在3D图上显示的标记的大小。您设置了一个最小的大小,以便您显示的标记不太小,即使对于小的身体也是如此。您将使用对数标度将质量转换为标记大小,并将此对数的基值设置为另一个类属性。

这个 display_size 属性中的实例属性。 __init__() 方法在计算的标记大小和所设置的最小标记大小之间进行选择。为了在这个项目中确定身体的显示大小,你要使用它的质量。

您还可以添加 colour 属性 __init__() ,暂时默认为黑色。

要测试这些新添加的内容,可以在控制台/REPL中尝试以下内容:

第一次呼叫 body.draw() 在原点绘制物体,因为你使用的是太阳系天体的默认位置。打电话给 body.move() 用一个“时间单位”所需的数量移动身体。因为身体的速度是 (1, 1, 1) ,身体将沿着三个轴中的每一个移动一个单位。第二次呼叫 body.draw() 在第二个位置画太阳系天体。请注意,当您这样做时,轴将自动重新排列。您很快就会在主代码中处理这个问题。

您可以返回到 SolarSystem 通过给太阳系及其天体添加两种新的方法,将其分类和连接起来: update_all() 和 draw_all() :

这个 update_all() 方法穿过太阳系中的每一个物体,移动并画出每一个物体。这个 draw_all() 方法使用太阳系的大小设置三轴的限制,并通过 pause() 功能。此方法还清除轴,为下一个绘图做好准备。

您可以开始构建一个简单的太阳系,并通过创建一个名为 simple_solar_system.py :

运行此脚本时,您将看到一个黑体从情节的中心移动:

您可以更改三维图形的透视图,这样您就可以直接沿着其中一个轴查看3D轴。可以通过将视图的方位和仰角设置为 0 在……里面 SolarSystem.__init__() :

跑动 simple_solar_system.py 现在给出以下观点:

这个 x -轴现在垂直于你的屏幕。因为你在2D显示器上显示一个3D视图,所以你总是有一个方向与你用来显示图形的2D平面垂直。这一限制使得很难区分物体何时沿该轴运动。你可以通过改变身体的速度 simple_solar_system.py 到 (1, 0, 0) 并再次运行脚本。身体似乎是静止的,因为它只是沿着轴移动,从你的屏幕出来!

您可以通过根据它的不同更改标记的大小来改进三维可视化。 x -协调。靠近您的对象看起来更大,而更远的对象看起来更小。您可以对 draw() 方法中的 SolarSystemBody 班级:

self.position[0] 表示身体的位置。 x -轴,即垂直于屏幕的轴。因子 30 除以是一个任意因素,您可以使用它来控制您希望这种效果有多强。

在本教程的后面,您还将添加另一个功能,将有助于可视化的三维运动的恒星和行星。

你有一个太阳系,里面有可以移动的物体。到目前为止,如果您只有一个身体,那么代码可以正常工作。但那不是一个非常有趣的太阳系!如果你有两个或两个以上的物体,它们就会通过相互的引力相互作用。

在这篇文章的开头,我简要回顾了你需要处理两个物体之间的引力的物理。由于在这个项目中使用的是任意单位,所以可以忽略引力常数 G 简单地计算出由于两个物体之间的重力而产生的力,如:

一旦你知道了两个物体之间的力,因为F=ma,您可以计算出每个对象必须使用的加速度:

一旦你知道加速度,你就可以改变物体的速度。

您可以添加两个新方法,一个在 SolarSystemBody 另一个在 SolarSystem ,计算出任何两个物体之间的力和加速度,并穿过太阳系中的所有物体,并计算它们之间的相互作用。

第一种方法计算出两个物体之间的引力,计算每个物体的加速度,并改变两个物体的速度。如果您愿意,可以将这些任务分为三种方法,但在本例中,我将将这些任务放在 SolarSystemBody :

accelerate_e_to_gravity() 对类型的对象调用。 SolarSystemBody 需要另一个 SolarSystemBody 身体作为一种争论。参数 self 和 other 代表两个身体相互作用。此方法的步骤如下:

现在你可以计算出任何两个天体之间的相互作用,你可以计算出太阳系中所有天体之间的相互作用。你可以把你的注意力转移到 SolarSystem 类的类:

这个 calculate_all_body_interactions() 方法贯穿太阳系的所有天体。每个天体与太阳系中的其他天体相互作用:

现在,您已经准备好创建一个简单的太阳系,并测试您到目前为止编写的代码。

在这个项目中,您将关注创建两种类型的天体之一:太阳和行星。您可以为这些机构创建两个类。新类继承自 SolarSystemBody :

这个 Sun 类的默认质量为10,000个单位,并将颜色设置为黄色。使用字符串 'yellow' ,这是Matplotlib中的有效颜色。

在 Planet 类创建一个 itertools.cycle 对象有三种颜色。在这种情况下,这三种颜色是红色、绿色和蓝色。你可以使用你想要的任何RGB颜色,也可以使用任意数量的颜色。在这个类中,使用带有RGB值的元组来定义颜色,而不是使用颜色名称的字符串。这也是在Matplotlib中定义颜色的有效方法。使用 next() 每当你创建一个新的行星时。

您还将默认质量设置为10个单元。

现在,你可以创建一个太阳系,其中一个太阳和两个行星在 simple_solar_system.py :

在这个脚本中,您创建了一个太阳和两个行星。你把太阳和行星分配给变量 sun 和 planets ,但这并不是严格要求的,因为 Sun 和 Planet 对象被创建,它们被添加到 solar_system 你不需要直接引用它们。

你用一个 while 循环来运行模拟。循环在每次迭代中执行三个操作。运行此脚本时,将获得以下动画:

它起作用了,算是吧。你可以看到太阳锚定在这个太阳系的中心,行星受到太阳引力的影响。除了行星在包含你电脑屏幕的平面上的运动(这些是 y -和 z --轴),你也可以看到行星越来越大,因为它们也在 x -轴,垂直于屏幕。

然而,你可能已经注意到行星的一些奇怪的行为。当它们被安排在太阳后面时,行星仍然被展示在太阳的前面。这不是数学上的问题--如果你跟踪行星的位置,你会发现 x -坐标显示,它们实际上是在太阳后面,正如你所预料的那样。

这个问题来自Matplotlib在绘图中绘制对象的方式。Matplotlib按绘制对象的顺序将对象按层绘制。因为你在行星之前创造了太阳, Sun 对象放在第一位 solar_system.bodies 并作为底层绘制。您可以通过在行星之后创建太阳来验证这一事实,在这种情况下,您将看到行星总是出现在太阳后面。

你会希望Matplotlib按照正确的顺序绘制太阳系的天体,从最前的那些天体开始。要实现这一点,您可以对 SolarSystem.bodies 的值为基础的列表。 x -协调每次刷新3D图形的时间。下面是如何在 update_all() 方法 SolarSystem :

使用List方法 sort 带着 key 参数来定义要用于排序列表的规则。这个 lambda 函数设置此规则。在本例中,您使用的值是 position[0] 表示 x -协调。因此,每次你打电话 update_all() 在模拟中 while 循环中,根据其沿 x -轴心。

运行 simple_solar_system.py 现在的脚本如下:

现在,你可以想象行星的轨道,就像它们围绕太阳运行一样。不断变化的大小显示了它们的 x -位置,当行星在太阳后面时,它们被隐藏在视线之外!

最后,你也可以移除轴线和网格,这样你在模拟中看到的就是太阳和行星。可以通过添加对Matplotlib的调用来做到这一点。 axis() 方法 SolarSystem.draw_all() :

模拟现在看起来是这样的:

使用Matplotlib对Python中的一个三维太阳系进行的模拟现在已经完成。在下一节中,您将添加一个功能,允许您查看 XY -模拟底部的飞机。这有助于可视化太阳系中物体的三维动力学。

在Python的三维太阳系模拟中,为了帮助可视化身体的运动,您可以在动画的“地板”上添加一个2D投影。这个2D投影将显示物体在 XY -飞机。要实现这一点,您需要将另一个绘图添加到显示动画的相同轴上,并且只需在 x -和 y -坐标。你可以锚定 z -与图形底部协调,使2D投影显示在动画的地板上。

您可以首先将一个新参数添加到 __init__() 方法的 SolarSystem 班级:

新参数 projection_2d ,默认为 False ,将允许您在两个可视化选项之间切换。如果 projection_2d 是 False 动画将只显示身体在3D中移动,没有轴和网格,就像你最后看到的结果一样。

让我们开始做一些改变 projection_2d 是 True :

您所做的更改如下:

您还需要在 simple_solar_system.py 打开2D投影:

模拟现在看起来如下:

的二维投影 XY -平面使它更容易跟随轨道物体的路径。

我们将用Python完成另一个三维太阳系的模拟。您将使用已经定义的类来模拟双星系统。创建一个名为 binary_star_system.py 创造两个太阳和两个行星:

阅读全文

与python太阳系代码相关的资料

热点内容
压缩因子定义 浏览:966
cd命令进不了c盘怎么办 浏览:212
药业公司招程序员吗 浏览:972
毛选pdf 浏览:657
linuxexecl函数 浏览:725
程序员异地恋结果 浏览:372
剖切的命令 浏览:226
干什么可以赚钱开我的世界服务器 浏览:288
php备案号 浏览:989
php视频水印 浏览:167
怎么追程序员的女生 浏览:487
空调外压缩机电容 浏览:79
怎么将安卓变成win 浏览:459
手机文件管理在哪儿新建文件夹 浏览:724
加密ts视频怎么合并 浏览:775
php如何写app接口 浏览:804
宇宙的琴弦pdf 浏览:396
js项目提成计算器程序员 浏览:944
pdf光子 浏览:834
自拍软件文件夹名称大全 浏览:328