之前学过一点 Python 知识,主要是要做数值计算,但是限于能力有限,也没有出什么结果, @etzel 在写Python 教学,我便抄打了一遍(写得特别详细),算是作业,也是练习。
主要内容:利用数值方法模拟出星球的轨道
用到的物理公式和数值方法可看 @etzel 的文章Python 繪製星球軌道教學(1)。
Python 的应用
numpy 是一个科学计算的包,包括强大的多维数组功能和许多数学方法。
matplotlib 是一个绘图包,类似于Matlab,语法上也基本相同。
numpy.linalg.norm() 是一个求范数的函数,一般用法是 numpy.linalg.norm(x, ord = None)
,
其中,
ggplot 是一个图的类型,很不错。
结果及代码
这里只是二维的图和代码,三维可看 @eztel 的文章。
运行输入参数:
x = 0.5 y = 0 Vx = 0 Vy = 1.63
x = 0.5 y = 0 Vx = 0 Vy = 2
x = 0.5 y = 0 Vx = 0 Vy = 0.2
代码
import numpy as np
import matplotlib.pyplot as plt
from numpy.linalg import norm
from matplotlib import style
style.use('ggplot')
fig = plt.figure()
Ax = fig.gca()
epsilon = 0.0001
n = 100000
position = np.zeros((n,2))
velocity = np.zeros((2))
acceleration = np.zeros((2))
position[0,0] = float(input("输入x初始坐标值:"))
position[0,1] = float(input("输入y初始坐标值:"))
velocity[0] = float(input("输入x分量初始速度:"))
velocity[1] = float(input("输入y分量初始速度:"))
r = norm(position[0])
r3 = 1/(r**3)
acceleration = position[0] * -r3
velocity += acceleration * epsilon * 0.5
i = 1
while(i<n):
position[i] = position[i-1]+velocity*epsilon
r = norm(position[i])
r3 = 1/(r**3)
acceleration = position[i]*-r3
velocity += acceleration*epsilon
i += 1
plt.plot(position[:,0], position[:,1],'b-')
plt.plot(0,0,"ro")
plt.show()
哇⊙ω⊙
比较基础,我还是抄的,哈哈
你要不要嘗試挑戰回答我文末的兩個問題呢?回答成功我就給你 2SBD!大家也可以來挑戰!
解决了两个问题,看看我的方法。
import numpy as np import matplotlib.pyplot as plt from numpy.linalg import norm from matplotlib import style style.use('ggplot') fig = plt.figure() Ax = fig.gca() epsilon = 0.0001 n = 100000 position = np.zeros((n,2)) velocity = np.zeros((2)) acceleration = np.zeros((2)) position[0,0] = float(input("输入x初始坐标值:")) position[0,1] = float(input("输入y初始坐标值:")) velocity[0] = float(input("输入x分量初始速度:")) velocity[1] = float(input("输入y分量初始速度:")) r = norm(position[0]) r3 = 1/(r**3) acceleration = position[0] * -r3 velocity += acceleration * epsilon * 0.5 star = 1 if(norm(velocity) > np.sqrt(2/r)): star = 0 else: i = 1 t = 0 while(i<n): position[i] = position[i-1]+velocity*epsilon if(position[i-1,1]*position[i,1]< 0): t += 1 if(t==2): break r = norm(position[i]) r3 = 1/(r**3) acceleration = position[i]*-r3 velocity += acceleration*epsilon if(norm(velocity) > np.sqrt(2/r)): star = 0 break i += 1 if(star == 1): print('行星的公转周期为:%f' %(i*epsilon)) plt.plot(position[:i,0], position[:i,1],'b-') plt.plot(0,0,"ro") plt.show() else: print("start is gone")
好强大
tvb姐学起来
我也要学!!
学起来~
嗯,我书都买完了哈哈哈
博士,写写教程
什么?我写教程吗?
别闹,这里用python的高手这么多。
写写呗,自己写自己的就好
我尝试写一写科技的。。