2016-06-28 69 views
0

在該代碼中的變量pressureenthalpy,即來自一個[float(n) for n in line.split()]命令,不讀入的函數:已在一個line.split()命令被分配的變量,不讀入一個函數

import numpy as np 

pressure_gibbs = open('pressure_gibbs_all_points.dat', 'w') 

pressure_gibbs.write('#pressure gibbs\n') 

## FUNCTIONS: 

def G(H,S): 
# G = H - TS 
# Then: 
    gibbs = H - 298.15 * S/4.0 
    return gibbs 



with open('entropies_parsed.dat') as entropies_parsed, open('pressure_enthalpy_all_points.dat') as enthalpy_pressure: # open the file 
    entropies_parsed.next() # skip the first line 
    enthalpy_pressure.next() 

    entropy = [float(line) for line in entropies_parsed] 
    #print entropy 
    for line in enthalpy_pressure: 
     #print entropy 
     pressure, enthalpy = [float(n) for n in line.split()] 
     #print pressure 
     #print enthalpy 
     for i in entropy: 
      #print i 
      gibbs = G(enthalpy, i) 
      #print gibbs 
      pressure_gibbs.write('{}\t{}\n'.format (pressure, gibbs)) 

pressure_gibbs.close() 

此文件夾中只有兩個文件是需要運行該代碼:

pressure_enthalpy_all_points.dat

# pressure enthalpy 
2   3 
5   4 
3.5  2 

entropies_parsed.dat

# entropies 
0.5   
0.2   
0.47  

這是我能做到的最好,和壓痕位置是正確的,從我的知識。

然而, 這個代碼給出了一個文件pressure_gibbs_all_points.dat

#pressure gibbs 
2.0  -34.26875 
2.0  -11.9075 
2.0  -32.032625 
5.0  -33.26875 
5.0  -10.9075 
5.0  -31.032625 
3.5  -35.26875 
3.5  -12.9075 
3.5  -33.032625 

這是不對的。

如果你能幫助我,我將不勝感激。

+2

爲什麼它錯了?順便說一下,它看起來像是在吉布斯函數之前將熵除以4,並且還在吉布斯函數之內。你有意這麼做嗎? –

+0

@Vince West'pressure_gibbs_all_points.dat'是錯誤的,因爲壓力的值不是文件'pressure_enthalpy_all_points.dat'中的值更正了'i/4'到'i' –

+0

看到下面的答案,並且讓我知道如果我正確理解你的問題 –

回答

2

你的輸出文件似乎顯示了與你的代碼中的數學相匹配的值,所以我唯一能看到的就是你有9個計算,你期望3個。這是因爲你有一個嵌套循環,所以你是首先在壓力上循環,然後在熵上循環。所以你在p = 2.0時計算Gibbs的3個熵值,然後再計算p = 5.0,最後計算p = 3.5,所以你有9個計算。如果你只是在尋找3個計算:

for i, line in zip(entropy, enthalpy_pressure): 
    #print entropy 
    pressure, enthalpy = [float(n) for n in line.split()] 
    #print pressure 
    #print enthalpy 
     #print i 
    gibbs = G(enthalpy, i) 
    #print gibbs 
    pressure_gibbs.write('{}\t{}\n'.format (pressure, gibbs)) 
+0

謝謝,這工作。嵌套循環和'zip'有什麼區別? –

+1

Zip允許您使用方便的語法一次循環多個列表或元組。你也可以在範圍內完成(len(entropy)),然後使用entropy [i],並且enthalpy_pressure [i] –

+0

謝謝,'entropy'已經通過'[float(line)for line in entropies_parsed] '但是,'line_split()]'中的''float'已經產生了'[float(n)''。如果我要求'print type(entropy)',它會返回''。但是,'print type(pressure)'會返回'我怎樣才能讓'entropy'變成''?如果我設法這樣做,就不需要運行'for i,in entropy' –

1

我認爲它的時間,你挖了一點到numpy的,爲什麼numpy的和Python的組合是真棒。這段代碼可以做你正在尋找的東西。這裏有很多,所以你只需花時間消化它。我創建了一個新的答案,因爲原始答案有關於你的第一個問題的細節,但下面的代碼實際上是你應該這樣做的。如果您遇到錯誤,請確保您爲分隔符等輸入了正確的值。

import numpy as np 

# read in the data, and tranpose the columns into rows for easy unpacking 
entropy = np.loadtxt('entropies_parsed.dat', skiprows=1).T 
enthalpy, pressure = np.loadtxt('pressure_enthalpy_all_points.dat', skiprows=1).T 

gibbs = enthalpy - 298.15 * entropy/4.0 

# stack the data together into a new, 2-row array, and then transpose back into column format for file writing 
output_array = np.vstack((pressure, gibbs)).T 
np.savetxt('pressure_gibbs_all_points.dat', output_array, header="pressure\tgibbs", fmt="%0.06g") 
相關問題