2017-01-04 3 views
0

ファスナー合計:11のボリューム、45モードは、各ボリュームである実ファイルでIファイル持っているネストされたループを使用し、

# Volume (V) FREQ mode 
18.1   400.9 1  #| 
18.1   401.3 2  #| 1st Volume: 18.1 
18.1   404.2 3  #| 
18.1   505.2 4  #| 
19.2   202.4 1   #| 
19.2   203.6 2   #| 2nd Volume: 19.2 
19.2   205.4 3   #| 
19.2   199.5 4   #| 

volume_FREQ.datを。 parameters.dat

それから私は、このファイル持っているこれらの11個のボリュームのそれぞれについて、

# c   d   f  mode 
-1.14  -24.70  1297.20  1 
-1.24  -22.60  1295.20  2 
-1.54  -21.08  1296.20  3 
-1.72  -22.4  1298.40  4   

を、Pの値があります。以下の式では、これはP(V)で表される

enter image description here

:各VolumePのこの値は、それに応じてcdf、及びFREQの値を用いて、modesにわたって合計することによって計算されます図1

変数Tこのリストである:

T = [10.0, 30.1, 50.2] 

実際のリストは、各Tについて100

の長さを有し、各VPの値があります。

最終的な解決策は data.datようなファイルで終わることであろう

# Volume (V) FREQ mode T  P 
18.1   400.9 1 10.0  x   #| 
18.1   401.3 2 10.0  x   #| 1st Volume: 18.1 
18.1   404.2 3 10.0  x   #| 
18.1   505.2 4 10.0  x   #| 
19.2   202.4 1 10.0  x    #| 
19.2   203.6 2 10.0  x    #| 2nd Volume: 19.2 
19.2   205.4 3 10.0  x    #| 
19.2   199.5 4 10.0  x    #| 
18.1   400.9 1 30.1  x   #| 
18.1   401.3 2 30.1  x   #| 1st Volume: 18.1 
18.1   404.2 3 30.1  x   #| 
18.1   505.2 4 30.1  x   #| 
19.2   202.4 1 30.1  x    #| 
19.2   203.6 2 30.1  x    #| 2nd Volume: 19.2 
19.2   205.4 3 30.1  x    #| 
19.2   199.5 4 30.1  x    #| 
18.1   300.1 1 50.2  x   #| 
18.1   305.2 2 50.2  x   #| 1st Volume: 18.1 
18.1   303.6 3 50.2  x   #| 
18.1   303.9 4 50.2  x   #| 
19.2   304.5 1 50.2  x    #| 
19.2   305.9 2 50.2  x    #| 2nd Volume: 19.2 
19.2   306.5 3 50.2  x    #| 
19.2   307.1 4 50.2  x    #| 

変数を簡単にnumpyすることにより抽出することができる入力の各:

import numpy as np 
c, d, f, mode = np.loadtxt('parameters.dat', skiprows = 1).T 
V, FREQ, mode = np.loadtxt('Volume_FREQ.dat', skiprows = 1).T 

しかし、困難が来たときに数式を適用してループしますmodes

VOLUMEリストを作成できます:

VOLUME = [19.2, 18.1] 

そして、ネストされたループ+ zip

sum_for_each_volume = [] 
for i_VOLUME in VOLUME: 

    P_CORRECT = [] 

    for j_c1, j_d, j_FREQ, i_T in zip(c1, d, FREQ, T): 

     P = j_FREQ * i_T * (i_VOLUME * j_c1 + j_d) 

     P_CORRECT.append(P) 

    summation = sum(P_CORRECT) 

    sum_for_each_volume.append(summation) 

しかし、この解決策は、正しく各ボリュームでFREQSをつかんされていない、ともすべてT要素が各volumeによって読み込まれていません。

お手伝いができれば幸いです。

@ user7138814の回答に基づいて:このスクリプトを実行

import numpy as np 
n_volume = 2 
n_mode = 4 
n_T = 3 

c, d, f, mode = np.loadtxt('parameters.dat', skiprows = 1).T 
V, FREQ, mode = np.loadtxt('Volume_FREQ.dat', skiprows = 1).T 
T = [10.0, 30.1, 50.2] 

V = V.reshape(n_volume, n_mode) 
FREQ = FREQ.reshape(n_volume, n_mode) 


P_for_each_volume_and_each_T = [] 

for i in range(n_volume): 
    for j in range(n_T): 
    P = 0 
    for k in range(n_mode) 
     P += FREQ[i,k] * T[j] * (V[i,k]*c[k] + d[k]) 
    P_for_each_volume_and_each_T.append(P) 


print 'P = ', P_for_each_volume_and_each_T 

出力は以下の通りです:

P_for_each_volume_and_each_T[i] = P_for_each_volume_and_each_T[i] + P_for_each_volume_and_each_T[i-1]を使用して、しかし

P = [-830821.31000000006, -2500772.1431000005, -4170722.9762000004, -403382.67200000002, -1214181.8427200001, -2024981.0134400004]

戦略 ERE(次のスクリプトを実行します):

import numpy as np 

n_volume = 2 
n_mode = 4 

n_T = 3 

c, d, f, mode = np.loadtxt('parameters.dat', skiprows = 1).T 
V, FREQ, mode = np.loadtxt('Volume_FREQ.dat', skiprows = 1).T 
T = [10.0, 30.1, 50.2] 

V = V.reshape(n_volume, n_mode) 
FREQ = FREQ.reshape(n_volume, n_mode) 


P_for_each_volume_and_each_T = [] 

for i in range(n_volume): 

    for j in range(n_T): 
    P = 0 
    for k in range(n_mode): 
     P = FREQ[i,k] * T[j] * (V[i,k]*c[k] + d[k]) 
     print 'FREQ[i,k] = ', FREQ[i,k] 
     print 'V[i,k] = ', V[i,k] 
     print 'c[k] = ', c[k] 
     print 'd[k] = ', d[k] 
     print 'P = ', P 
    P_for_each_volume_and_each_T.append(P) 
print 'P = ', P_for_each_volume_and_each_T 


for i in xrange(1,len(P_for_each_volume_and_each_T)): 
    P_for_each_volume_and_each_T[i] = P_for_each_volume_and_each_T[i] + P_for_each_volume_and_each_T[i-1] 


print 'P after summing= ', P_for_each_volume_and_each_T 

あなたはこの出力を得る:

P = [-270443.66399999999, -814035.42863999994, -1357627.19328, -110570.88, -332818.34880000004, -555065.81760000007]

合計したときに、これは総理にかなって:

P after summing= [-270443.66399999999, -1084479.0926399999, -2442106.2859199997, -2552677.1659199996, -2885495.5147199994, -3440561.3323199996]

をしたがって、P after summingリストはありません一致しない@ user7138814Pリスト。

したがって、この問題を解決するための戦略は正しいですか(図1を参照)。

どちらか+=戦略または[i] + [i-1]戦略

+0

'P(V)'の式ではモードを合計しているので、出力ファイル 'data.dat'に" mode "の列があるのはなぜですか?あなたは 'P'を手で計算し、それをexampe出力ファイル(' data.dat')に入れることができますか? – user7138814

答えて

1

3つの異なる長さの配列(パラメータ空間が3次元)を持っているので、for-loopをもう1つ必要とします。実際にvolume_FREQ.datからロードするVFREQは、実際には2次元データです。だから、整形し、別のループであなたが何かを得るのと同じよう:

import numpy as np 

n_volume = 11 
n_mode = 45 
n_T = 3 

c, d, f, mode = np.loadtxt('parameters.dat', skiprows = 1).T 
V, FREQ, mode = np.loadtxt('Volume_FREQ.dat', skiprows = 1).T 
T = [10.0, 30.1, 50.2] 

V = V.reshape(n_volume, n_mode) 
FREQ = FREQ.reshape(n_volume, n_mode) 

P_for_each_volume_and_each_T = [] 
for i in range(n_volume): 
    for j in range(n_T): 
     P = 0 
     for k in range(n_mode) 
      P += FREQ[i,k] * T[j] * (V[i,k]*c[k] + d[k]) 
     P_for_each_volume_and_each_T.append(P) 

よりnumpythonicには、以下の配列操作のようになります。

V = V.reshape(n_volume, n_mode) 
FREQ = FREQ.reshape(n_volume, n_mode) 
T = np.array(T).reshape(-1, 1, 1) 
P_for_each_volume_and_each_T = (FREQ * T * (V*c + d)).sum(axis=0) 

これは(n_volume, n_T) 2D配列を与えるだろう。 for-loopsと同じ結果を得るには、ravelを使用してください。

+0

@ user7138814ご回答ありがとうございます。しかし、 'P [i] = P [i] + P [i-1]'戦略(投稿された質問を参照)とは異なる結果が得られます。 –

+0

私はこの問題を解決したいと思います... どうもありがとうございました –

関連する問題