如何找到共振的行星

时间:2014-03-28 23:19:38

标签: algorithm idl orbital-mechanics

我试图找到一种方法来检测共振的轨道参数(周期,偏心,半长轴......)行星。

我知道如果两个行星之间的比例是可以相称的,这意味着它们是共振的,但是我想知道它们是什么共振,我该怎么办?

例如,我有我的N行星和周期矩阵。如何创建一个循环来检查行星是否以及在哪个共振?

类似的东西:

for i=1, N
  P(i)/P(i-1)=m
   if m (check the resonance condition) then
      write (planets parameters)
   end if
end for

非常感谢。

我制作这个程序,我有一个2xN矩阵,其中列是行星的ID及其周期,行是行星的数量,例如:

1 0.44
1 0.8
1 0.9
2 0.9
2 1.2
3 2.0
3 3.0

从一个行星系统转换到另一个系统的技巧是用相同的数字重命名系统的所有行星,并用另一个数字重命名其他系统的行星,这样,我就能够从一个系统改变共振条件系统到另一个。

程序很简单:

  1. 读取文件并保存列数和行号,
  2. 创建并保存col * row对象矩阵,
  3. 将行星的“名称”和“句号”保存为向量,
  4. 开始循环:
  5. for r=1,row  <--- THIS MUST READ all the file   
        if (difference in name = 0.) then start the resonance find criterion
            for l = 0,4 (number of planet in each system: THIS MUST BE MODIFIED !!) 
            for i = 1,5
            for j = 1,5
                if (i*period(l)-j*period(l+1) eq 0) <- RESONANCE CONDITION !!!  
                    then write on file
            end for
            end for
            end for
        else write a separation between the first set and second set of planets !
    end for
    

    这是我写的IDL代码:

    pro resfind
    
    file = "data.dat"
    rows =File_Lines(file) ; per le righe
    openr,lun,file,/Get_lun ; per le colonne
    line=""
    readf,lun,line
    cols = n_elements(StrSplit(line, /RegEx, /extract))
    
    openr,1,"data.dat" 
     data = dblarr(cols,rows)
     readf,1,data
    close,1
    
    
    name = data(0,*)
    period = data(1,*)
    
    openw,2,"find.dat"
     for r = 0, rows-2 DO BEGIN ;
            if (name(r)-name(r+1) EQ 0) then begin 
                    for l = 0,rows-2 do begin 
                             for j = 1,4 do begin
                                     for i = 1,4 do begin
    
                                               if (abs(i*period(l)-j*period(l+1)) EQ 0.) then begin 
                                               printf,2, 'i resonance:', i , ' j resonance:',j,' planet ID:',l,' planet ID:',l+1
                                               endif
                                     endfor 
                             endfor
                    endfor
            endif else begin
            printf,2, '                                                    ' 
    endfor
    
    
    close,2
    
    end
    

    问题:

    1. 我无法理解如何消除共振的倍增(2:4,3:6等);
    2. 在第二个for循环(行星之一)中,行星的数量必须每次都改变,但我不明白如何改变它。

1 个答案:

答案 0 :(得分:1)

首先,每个实数可以表示为具有任何有限精度的整数比。当我们用十进制系统中越来越多的数字表示数字时,我们就会这样做。因此,您不仅需要检查轨道周期是否具有某种整数与整数比,还需要检查两个整数是否相对较小。而这是任意决定,这是“小”。

其次,请记住,如果一个不是另一个的副本,则两个浮点值通常是不同的。例如3*(1/3)可能不等于1.这是有限精度的结果:1/3在以二进制表示时无限重复,因此在存储在内存中时会被截断。因此,您不应该检查周期比率等于到某个比率,而是它是否足够接近某个比率。并且任意说什么是“足够接近”。

所以最快的方法是构建一些相对较小整数的比率数组,然后对它进行排序并删除重复项(3:3 = 2:2,你的阵列中不需要多个)。 (请记住,重复不是那些与每个相等的那些,而是那些彼此足够接近的重复。)然后,对于每两个行星计算轨道周期比率并二进制搜索你的表格中最接近的值。如果它足够接近,你会发现共振。