找回密码
 注册
X系列官方授权正版
搜索
查看: 7329|回复: 19

[求助] 求水星近日点轨道进动模拟轨道代码,关键是用python编写的

  [复制链接]
发表于 2011-4-26 18:18:44 | 显示全部楼层 |阅读模式
本帖最后由 尼奇怪 于 2011-4-27 16:38 编辑

RT
这是咱本周计算物理的作业,本来上周的FFT(快速傅立叶变换)就够痛苦了……
以下是我用kepler轨道改编的,不过怎么画出来都觉得不像进动轨道……
  1. from pylab import *
  2. import matplotlib as mpl
  3. from math import sqrt, pi
  4. from mpl_toolkits.mplot3d import axes3d, Axes3D
  5. import numpy as np
  6. import matplotlib.pyplot as plt


  7. class Mecury():

  8.     def __init__(self, initx=0.47, inity=0, initvx=0, initvy=8.2, dt=0.001, powerlaw=2., alpha=0.008, outputfile=''):
  9.         self.dt=dt
  10.         self.beta=powerlaw
  11.         self.alpha=alpha
  12.         self.filename=outputfile
  13.         self.calculate(sqrt(initx*initx+inity*inity), initx, inity, initvx, initvy, 0.)
  14.         self.dth=0.

  15.     def stepOne(self, r, x, y, vx, vy, t):
  16.         r=sqrt(x*x+y*y)
  17.         vx=vx-(4*pi*pi*x*self.dt)/r**(self.beta+1)/(1+self.alpha/r**(self.beta))
  18.         vy=vy-(4*pi*pi*y*self.dt)/r**(self.beta+1)/(1+self.alpha/r**(self.beta))
  19.         x=x+vx*self.dt
  20.         y=y+vy*self.dt
  21.         t=t+self.dt
  22.         return r, x, y, vx, vy, t

  23.     def calculate(self, r, x ,y ,vx, vy, t):
  24.         self.data=[(r, x,y,vx,vy,t)]
  25.         while t<100:
  26.             r, x, y, vx, vy, t=self.stepOne(r, x ,y ,vx, vy, t)
  27.             self.data.append((r, x,y,vx,vy,t))
  28.         if self.filename!='':
  29.             self.store()



  30.     def store(self):
  31.         pass

  32.     def plotMecury(self, figType=1):
  33.         x=[]; y=[]; z=[0.]; vx=[]; vy=[]; t=[]; r=[]; xp=[]; yp=[]; k=[]
  34.         for i in range(5000):
  35.             (r1, x1, y1, vx1, vy1, t1)=self.data[i]
  36.             x.append(x1); y.append(y1); vx.append(vx1); vy.append(vy1)
  37.             t.append(t1); z.append(0.); r.append(r1)
  38.             if i>2:
  39.                 dr1=r[i-1]-r[i-2]
  40.                 dr2=r[i]-r[i-1]
  41.                 if dr1>0 and dr2<0:
  42.                     xp.append(x[i-1])
  43.                     yp.append(y[i-1])
  44.             m=len(self.data)
  45.         if figType==1:
  46.             plot(x,y)
  47.             plot(0,0,'r*')
  48.             for j in range(len(xp)):
  49.                 plot([0,xp[j]], [0,yp[j]],'k-')
  50.             xlim(-0.55,0.55)
  51.             ylim(-0.55,0.55)
  52.             show()
  53.         else:
  54.             fig=plt.figure()
  55.             ax=Axes3D(fig)
  56.             ax.plot(x[0:m], y[0:m], z[0:m], label='Kepler')
  57.             ax.legend()
  58.             plt.show()
  59.             
  60.     def plotPrecessionrate(self, figType=1):
  61.         x=[]; y=[]; z=[0.]; vx=[]; vy=[]; t=[]; r=[]; xp=[]; yp=[]; tp=[]; k=[];
  62.         theta=[]; th=0.; dth=0.#dth=[]
  63.         for i in range(3000):
  64.             (r1, x1, y1, vx1, vy1, t1)=self.data[i]
  65.             x.append(x1); y.append(y1); vx.append(vx1); vy.append(vy1)
  66.             t.append(t1); z.append(0.); r.append(r1)
  67.             if i>2:
  68.                 dr1=r[i-1]-r[i-2]
  69.                 dr2=r[i]-r[i-1]
  70.                 if dr1>0 and dr2<0:
  71.                     xp.append(x[i-1])
  72.                     yp.append(y[i-1])
  73.                     tp.append(t[i-1]-0.24500000000000019)
  74.             m=len(self.data)
  75.             n=len(xp)
  76.         if figType==1:
  77.             for j in range(n):
  78.                 k.append(yp[j]/xp[j])
  79.                 theta.append((180/pi)*(arctan((k[0]-k[j])/(1+k[0]*k[j]))))
  80.             for l in range(n-1):
  81.                 th=th+theta[l+1]/tp[l+1]
  82.             dth=th/n
  83.             print theta
  84.             print tp
  85.             print dth

  86.             
  87.                
  88.             #print th
  89.             #print theta[0]/tp[0]
  90.             plot(tp,theta)
  91.             #plot(0,0,'r*')
  92.             xlim(0,3)
  93.             ylim(0,20)
  94.             show()
  95.             
  96.         else:
  97.             fig=plt.figure()
  98.             ax=Axes3D(fig)
  99.             ax.plot(x[0:m], y[0:m], z[0:m], label='Kepler')
  100.             ax.legend()
  101.             plt.show()
  102.         #return dth
  103.    


  104.     def calculatedth(self, figType=1):
  105.         x=[]; y=[]; z=[0.]; vx=[]; vy=[]; t=[]; r=[]; xp=[]; yp=[]; tp=[]; k=[];
  106.         theta=[]; th=0.; dth=0.#dth=[]
  107.         for i in range(3000):
  108.             (r1, x1, y1, vx1, vy1, t1)=self.data[i]
  109.             x.append(x1); y.append(y1); vx.append(vx1); vy.append(vy1)
  110.             t.append(t1); z.append(0.); r.append(r1)
  111.             if i>2:
  112.                 dr1=r[i-1]-r[i-2]
  113.                 dr2=r[i]-r[i-1]
  114.                 if dr1>0 and dr2<0:
  115.                     xp.append(x[i-1])
  116.                     yp.append(y[i-1])
  117.                     tp.append(t[i-1]-0.24500000000000019)
  118.             m=len(self.data)
  119.             n=len(xp)
  120.         if figType==1:
  121.             for j in range(n):
  122.                 k.append(yp[j]/xp[j])
  123.                 theta.append((180/pi)*(arctan((k[0]-k[j])/(1+k[0]*k[j]))))
  124.             for l in range(n-1):
  125.                 th=th+theta[l+1]/tp[l+1]
  126.             self.dth=th/n

  127. def calculaterate():
  128.     listalpha=[]
  129.     listdth=[]
  130.     list1=[0,1,2,4,8,16]
  131.     rate=0.
  132.     for k in range(6):
  133.         list1[k]=0.0002*list1[k]
  134.         c=Mecury(alpha=list1[k])
  135.         c.calculatedth()
  136.         listalpha.append(c.alpha)
  137.         #print c.alpha
  138.         listdth.append(c.dth)
  139.         #print c.dth
  140.     print listalpha,listdth   
  141.     plot(listalpha, listdth, 'ro')
  142.     for m in range(5):
  143.         rate+=listdth[m+1]/listalpha[m+1]
  144.     drate=rate/6
  145.     print drate
  146.     show()

  147. a=Mecury(alpha=0.01)
  148. a.plotMecury()
  149. #b=Mecury(alpha=0.0008)
  150. #b.plotPrecessionrate()

  151. #calculaterate()

复制代码
最终成品:

图中黑线为太阳与远日点连线
看起来好圆,好假,而且运算出来的进动角速度和理论值差了25%……

评分

参与人数 1UCC +2 好评 +1 收起 理由
skulldownz + 2 + 1 让我开了眼界..

查看全部评分

发表于 2011-4-26 18:31:26 | 显示全部楼层
咱上周的作业是用Java Jsp MySQL......
写个选课系统~~~~
蛋疼~~~
我们才讲到JSP就要交作业~~其实课上什么也没讲~~
下次的是用Java写个多人聊天系统~~
现在天朝大学都是这么折腾人的吗~~

输代码要点开那个<>标志的之后输入就行了~
回复

使用道具 举报

发表于 2011-4-26 18:40:59 | 显示全部楼层
tx们都是学计算机的么?可惜我只看过c。
回复

使用道具 举报

发表于 2011-4-26 18:42:18 | 显示全部楼层
總覺得用netbean弄個視窗是比用visual studio的幸福
回复

使用道具 举报

 楼主| 发表于 2011-4-26 18:50:42 | 显示全部楼层
本帖最后由 尼奇怪 于 2011-4-26 21:06 编辑

回复 stargazer 的帖子

Python这东西比C可读性要强,但是格式变态

计算机对于理工科学生是技能要求,而不是知识要求,所以很多非计算机专业也要学习
虽然计算物理也许不是我的研究方向,不过作业总是得做的

其实我倒不觉得这是折腾人,只不过中国学生长期抄过来的,遇到一点要自己独创的东西就容易卡壳,我也一样
-----------------------------------------------------------------
以下是实验结果:

步数次数较少时

步数较多时

三个远日点

更多……这回终于是圆的了
找到远日点,如此一看,似乎还有点像进动轨道了
虽然悲剧的宽屏把正方形压扁了导致轨道看起来是椭圆……
回复

使用道具 举报

发表于 2011-4-26 18:58:28 | 显示全部楼层
回复 尼奇怪 的帖子

还真是抄习惯了~~~
不过抄有时也是很麻烦的~~~
你们学着是业余~~

Python很不错的~~用于计算~~格式更变态的JCL也学过~~~Python不限数字格式已经不错了~~

我们可就是直接指一行代码~~这啥意思~~
在就是~~某某功能的代码在那里~~

点评

对,之所以用Python就是看好它强大的计算模块 还有这个真不是业余……这也百分百物理问题 只不过使用计算机获得结果  发表于 2011-4-26 19:01
回复

使用道具 举报

发表于 2011-4-26 19:09:17 | 显示全部楼层
Python看得懂。。但这物理没学过= =

点评

同时也是天体力学中最简单的两体模型中的一个 比最简单的开普勒模型稍微复杂一点(因为加入了相对论参量)  发表于 2011-4-26 19:27
这个是理论物理中,验证爱因斯坦广义相对论的经典观测“水星进动”轨道  发表于 2011-4-26 19:27
回复

使用道具 举报

发表于 2011-4-26 19:24:27 | 显示全部楼层
本帖最后由 skulldownz 于 2011-4-26 19:28 编辑

不会看,学,话说 pass 是什么意思

进动轨道什么的也不知道....
不过找了下: 这个会不会有用...虽然只是理论而不是程序...不过我连理论都没听过撒..哈哈哈
http://tieba.baidu.com/f?kz=595300156

点评

好像是直接返回 这个程序里store模块应该是没有实际作用的,但可以改为保存模型数据使用  发表于 2011-4-26 19:28
回复

使用道具 举报

发表于 2011-4-26 19:42:53 | 显示全部楼层
本帖最后由 skulldownz 于 2011-4-26 19:52 编辑

喔..又学到一点东西了..哈哈

这么短时间理论是搞不灵的了,但实际的图是类似这样的吗? (网上的图片)


http://zh.wikipedia.org/wiki/广义相对论

恩..不知道网上这些图是否有夸张过...不过如果确实如这些图一般的话,只能看看有没有比例错的地方撒....

点评

不过计算物理本身求解的是数值解而非解析解,所以我觉得这个轨道还可以接受…… 让您费心了  发表于 2011-4-26 20:57
对,图像基本上应该是椭圆轨道绕其中一个焦点旋转 所以我觉得我的运动轨道看起来太圆…… 不过既然远日点找到了应该就没问题……  发表于 2011-4-26 20:56
回复

使用道具 举报

发表于 2011-4-26 21:06:16 | 显示全部楼层
曾经中学时代对物理尤其是天体物理很感兴趣,成绩也不错,可惜当时数学差,大学后和物理无缘,基本耽误在电脑上了。倒是现在偶尔抽空学习下计算机的东西。
这个轨道即使是和万有引力相关的方程?俺的物理退化到初中水平了

点评

可以这么说,主体部分还是开普勒定律和平方反比率变式  发表于 2011-4-26 21:09
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|DeepTimes.NET 太空游戏站