我正试图找到一种方法,从轨道参数(周期,离心率,半长轴…)中检测共振行星。
我知道如果两个行星之间的比例是可公的,这意味着它们处于共振状态,但假设我想知道它们处于哪种共振状态,我该怎么做呢?
例如,我有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
从一个系统的行星改变到另一个系统的诀窍是用相同的数字重新命名一个系统的所有行星,用另一个系统的行星重新命名,这样我就可以改变一个系统到另一个系统的共振条件。
程序很简单:
- 读取文件并保存列数和行数,
- 创建并保存一个矩阵的col*row对象,
- 将行星的"名称"one_answers"周期"保存为矢量,
- 启动循环:
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
问题:
- 我不明白如何消除共振的倍数(2:4,3:6等);
- 在第二个for循环中(行星),行星的数量每次都必须改变,但我不明白如何改变这个
首先,每个实数都可以表示为具有任何有限精度的整数之比。特别是当我们用越来越多的十进制数字来表示数字时。所以你不仅要检查轨道周期是否在整数与整数之间,还要检查两个整数是否相对较小。这是一个武断的决定,这是'小'。
其次,请记住,如果一个不是另一个的副本,则两个浮点值通常是不同的。例如,3*(1/3)
可能不等于1。这是有限精度的结果:1/3用二进制表示时是无限重复的,所以它在存储在内存中的某个地方会被截断。所以你不应该检查周期比率是否等于与某个比率,而应该检查它是否足够接近某个比率。说什么是"足够接近"是武断的。
所以最快的方法是建立一个一些相对较小的整数的比率数组,然后对它排序并删除重复项(3:3 = 2:2,并且你不需要在你的数组中有多个)。(请记住,重复项不是彼此相等,而是彼此足够接近。)然后,为每两个行星计算轨道周期比和二进制搜索你的表最接近的值。如果距离足够近,就会发现共振