-5

スペクトル線の等価幅を計算するためのこのFortranプログラムがあります。同じアルゴリズムを実行するためのPythonコードを作成するためのヘルプを見つけたいと思っています(入力ファイルには2列の波長とフラックスが含まれています)

     PARAMETER (N=195)              ! N is the number of data
     IMPLICIT DOUBLE PRECISION (A-H,O-Z)
     DIMENSION X(N),Y(N)
     OPEN(1,FILE='halpha.dat')
     DO 10 I=1,N
     READ(1,*)X(I),Y(I)
     WRITE(*,*)X(I),Y(I)
10   CONTINUE
     CALL WIDTH(X,Y,N,SUM)     
     WRITE(*,*)SUM
     END
 c-----------------------------------------
    SUBROUTINE WIDTH(X,Y,N,SUM)
    PARAMETER (NBOD=20000)
    IMPLICIT DOUBLE PRECISION (A-H,O-Z)
    DIMENSION X(NBOD),Y(NBOD) 
    SUM=0.D0
    DO I=2,N
    SUM=SUM+(X(I-1)-X(I))*((1.-Y(I-1))+(1.-Y(I)))
C   WRITE(*,*)SUM
    END DO 
    SUM=0.5*dabs(SUM)
    RETURN
    END
4

2 に答える 2

2

これはかなり直訳です:

def main():
    N = 195  # number of data pairs
    x, y = [0 for i in xrange(N)], [0 for i in xrange(N)]

    with open('halpha.dat') as f:
        for i in xrange(N):
            x[i], y[i] = map(float, f.readline().split())
            print x[i], y[i]

    sum = width(x, y, N)
    print sum

def width(x, y, N):
    sum = 0.0
    for i in xrange(1, N):
        sum = sum + (x[i-1] - x[i]) * ((1. - y[i-1]) + (1. - y[i]))
    sum = 0.5*abs(sum)
    return sum

main()

ただし、これはより慣用的な翻訳になります。

from math import fsum  # more accurate floating point sum of a series of terms

def main():
    with open('halpha.dat') as f:  # Read file into a list of tuples.
        pairs = [tuple(float(word) for word in line.split()) for line in f]

    for pair in pairs:
        print('{}, {}'.format(*pair))

    print('{}'.format(width(pairs)))

def width(pairs):
    def term(prev, curr):
        return (prev[0] - curr[0]) * ((1. - prev[1]) + (1. - curr[1]))

    return 0.5 * abs(fsum(term(*pairs[i-1:i+1]) for i in range(1, len(pairs))))

main()
于 2015-12-03T21:00:03.090 に答える
0

Python でこれを行うより自然な方法は、スペクトル自体のプロパティに注目し、astropy の specutils でパラメーターを使用することです。

特に equal_width の詳細はこちらです。specutils、specutils.analysis およびそのパッケージに関する一般的な情報については、次のリンクをたどってください。

specutils 最上位 および specutils.analysis

このパッケージを使用するには、Spectrum1D オブジェクトを作成する必要があります。その最初のコンポーネントは波長軸になり、2 番目のコンポーネントはフラックスになります。Spectrum1D オブジェクトの作成方法の詳細については、分析ページのリンク (最初の段落の 3 行目の末尾) を参照してください。

これは非常に強力なアプローチであり、天文学者によって天文学者のために開発されました。

于 2020-09-21T17:20:34.953 に答える