4

軌道パラメータ(周期、離心率、長半径など)から共鳴している惑星を検出する方法を見つけようとしています。

2 つの惑星の比率が一致している場合、これはそれらが共鳴していることを意味することを知っていますが、それらがどの共鳴状態にあるかを知りたいとしたら、どうすればそれを行うことができますか?

たとえば、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

どうもありがとう。

私はこのプログラムを作成します。列が惑星のIDとその周期である2xNマトリックスがあり、行は惑星の数です。たとえば、次のようなものです。

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

惑星のあるシステムから別のシステムに変更するトリックは、システムのすべての惑星を同じ番号に変更し、他のシステムの惑星を別の番号に変更することです。そのため、あるシステムから別のシステムに共鳴条件を変更することができます1。

プログラムは簡単です:

  1. ファイルを読み取り、列と行の番号を保存します。
  2. col*row オブジェクトのマトリックスを作成して保存します。
  3. 惑星の「名前」と「期間」をベクトルとして保存し、
  4. サイクルを開始します。
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. 2 番目の for ループ (惑星のループ) では、惑星の数を毎回変更する必要がありますが、これを変更する方法がわかりません。
4

1 に答える 1

1

まず、すべての実数は、任意の有限精度の整数比として表すことができます。これは特に、10 進法の桁数が増える数を表現するときに行うことです。したがって、軌道周期が整数対整数の比率にあるかどうかを確認するだけでなく、2 つの整数が比較的小さいかどうかも確認する必要があります。そして、それは「小さい」任意の決定です。

次に、2 つの浮動小数点値は、一方が他方のコピーでない場合、一般に異なることに注意してください。たとえば、3*(1/3)は 1 に等しくない場合があります。これは有限精度の結果です。1/3 はバイナリで表すと無限に繰り返されるため、メモリに格納するとどこかで切り捨てられます。したがって、期間比率がある比率に等しいかどうかを確認するのではなく、ある比率に十分近いかどうかを確認する必要があります。そして、「十分に近い」とは何かを言うのは恣意的です。

したがって、最も速い方法は、いくつかの比較的小さな整数の比率の配列を作成し、それを並べ替えて重複を削除することです (3:3 = 2:2、配列に複数のものは必要ありません)。(重複は互いに等しいものではなく、互いに十分に近いものであることを忘れないでください。)次に、2つの惑星ごとに軌道周期比を計算し、テーブルをバイナリ検索して最も近い値を探します。十分に近い場合は、共鳴が見つかりました。

于 2014-03-29T09:29:07.743 に答える