Ich habe ein Python-Skript erstellt, wo ich in einer Datei ein Array von V
(Volumes) in einer Spalte schreiben:Python [float (n) für n in line.split()] über eine Datei, die nur eine Spalte enthält
import numpy as np
volume_pressure_energy = open('datafile.dat', 'w') # Open the file, 'w' for writing
V = np.linspace(62, 72, 5)
with open('datafile.dat') as volume_pressure_energy:
np.savetxt('datafile.dat', V, '%10.9f', delimiter='\t', header=" volume\tpressure\tenergy")
volume_pressure_energy.close()
Dies erzeugt diese Datei datafile.dat
:
# volume pressure energy
62.000000000
64.500000000
67.000000000
69.500000000
72.000000000
die nächsten Zeilen des Skripts versuchen, die pressure
und die energy
unter Verwendung von Funktionen und Parameter zu berechnen:
# Parameters
E0 = -9
B0 = 7
V0 = 6
B0_prime = 4
# Function P(V):
def P(V): # To use a P(V) is inevitable as the function depends on V
f0=(3.0/2.0)*B0
f1=((V0/V)**(7.0/3.0))-((V0/V)**(5.0/3.0))
f2=((V0/V)**(2.0/3.0))-1
pressure= f0*f1*(1+(3.0/4.0)*(B0_prime-4)*f2)
return pressure
# Function E(V):
def E(V):
E = E0+ (2.293710449E+17)*(1E-21)*((9.0/16.0)*(V0*B0) * ( (((V0/V)** (2.0/3.0)-1)**3)*B0_prime + ((V0/V)**(2.0/3.0)-1)**2 * (6.0-4.0*(V0/V)**(2.0/3.0)) ))
return E
Jetzt möchte ich datafile.dat
lesen und behandeln die erste Spalte als volume
Daten. Diese volume
Daten werden die Funktion P(V)
eingeben, und gibt mir pressure
. In ähnlicher Weise werden diese volume
Daten die Funktion E(V)
eingeben und geben mir energy
:
with open('datafile.dat') as volume_pressure_energy: # open the file
volume_pressure_energy.next() # skip the first line
for line in volume_pressure_energy:
volume = [float(n) for n in line.split()] # split the lines
# (removes linebreaks, tabs and spaces)
# convert all items to floats.
pressure = P(volume) # call my function
energy = E(volume) # call my function
volume_pressure_energy.write('{}\t{}\t{}\n'.format(volume, pressure, energy))
volume_pressure_energy.close()
Wenn alle dieses Skript ausgeführt wird (unter denen ich geschrieben habe das komplette Skript), heißt es, dass
Traceback (most recent call last):
File "BM-model-Enth-obtention_data_E_vs_P.py", line 76, in <module>
pressure = P(volume) # call your function
File "BM-model-Enth-obtention_data_E_vs_P.py", line 50, in P
f1=((V0/V)**(7.0/3.0))-((V0/V)**(5.0/3.0))
TypeError: unsupported operand type(s) for /: 'float' and 'list'
Anscheinend gibt es ein Problem mit den Funktionen. Ich habe sie getrennt laufen und gut funktionieren, so ist das Problem, dass Python nicht davon ausgeht, dass jede Zeile der ersten Spalte von datafile.dat
enthält die V
, die Volumes, die in den Funktionen eingefügt werden.
Warum passiert das? volume = [float(n) for n in line.split()]
teilt die Zeilen auf und konvertiert alle Elemente in Gleitkommazahlen. Warum sollte das also das Problem sein?
komplette Skript:
import numpy as np
volume_pressure_energy = open('datafile.dat', 'w') # Open the file, 'w' for writing
V = np.linspace(62, 72, 5)
with open('datafile.dat') as volume_pressure_energy:
np.savetxt('datafile.dat', V, '%10.9f', delimiter='\t', header=" volume\tpressure\tenergy")
volume_pressure_energy.close()
# Parameters
E0 = -9
B0 = 7
V0 = 6
B0_prime = 4
# Function P(V):
def P(V): # To use a P(V) is inevitable as the function depends on V
f0=(3.0/2.0)*B0
f1=((V0/V)**(7.0/3.0))-((V0/V)**(5.0/3.0))
f2=((V0/V)**(2.0/3.0))-1
pressure= f0*f1*(1+(3.0/4.0)*(B0_prime-4)*f2)
return pressure
# Function E(V):
def E(V):
E = E0+ (2.293710449E+17)*(1E-21)*((9.0/16.0)*(V0*B0) * ( (((V0/V)** (2.0/3.0)-1)**3)*B0_prime + ((V0/V)**(2.0/3.0)-1)**2 * (6.0-4.0*(V0/V)**(2.0/3.0)) ))
return E
with open('datafile.dat') as volume_pressure_energy: # open the file
volume_pressure_energy.next() # skip the first line
for line in volume_pressure_energy:
volume = [float(n) for n in line.split()] # split the lines
# (removes linebreaks, tabs and spaces)
# convert all items to floats.
pressure = P(volume) # call my function
energy = E(volume) # call my function
volume_pressure_energy.write('{}\t{}\t{}\n'.format(volume, pressure, energy))
volume_pressure_energy.close()
'volume = float (line.split() [0])'. 'str.split()' gibt eine Liste zurück, auch wenn es nur ein Element ist. Sie sollten also das erste (und einzige) Element erhalten, indem Sie auf den Index '[0]' zugreifen. – Mephy