# -*- coding: utf-8 -*-
"""
Dieses Modul enthält Literaturwerte bzw. Herstellerangaben, die bei der Auswertung im
Grundpraktikum Physik nützlich, aber nicht einfach anders zugänglich sind.
"""
from importlib.resources import files
import numpy as np
from scipy.constants import convert_temperature
[Doku]def saettigungsdampfdruck_wasser(t):
'''
Näherungsformel nach Magnus für den Sättigungsdampfdruck über einer Wasseroberfläche
:param t: Temperatur in °C
:type t: float
Quelle: https://de.wikipedia.org/wiki/S%C3%A4ttigungsdampfdruck (abgerufen am 4.7.2019)
:rtype: Sättigungsdampfdruck in mbar (bzw. hPa)
'''
# in mbar=hPa
return 6.112 * np.exp(17.62*t / (243.12 + t))
[Doku]def molare_masse_luft(phi, p, t):
'''
Berechung der molaren Masse von (feuchter) Luft
:param phi: relative Luftfeuchtigkeit
:type phi: float
:param p: Luftdruck in mbar
:type p: float
:param t: Temperatur in °C
:type t: float
:rtype: Molare Masse der feuchten Luft in g/mol.
'''
if phi < 0. or phi > 1.:
raise ValueError('Luftfeuchtigkeit muss im Intervall [0,1] liegen!')
ML = 28.949 # molare Masse von Luft (g/mol)
MW = 18. # molare Masse von Wasser (g/mol)
pS = saettigungsdampfdruck_wasser(t)
M = phi*(pS/p)*MW + (1.-phi*pS/p)*ML
return M
[Doku]def dichte_luft(phi, p, t):
'''
Berechung der Dichte von (feuchter) Luft
:param phi: relative Luftfeuchtigkeit
:type phi: float
:param p: Luftdruck in mbar
:type p: float
:param t: Temperatur in °C
:type t: float
:rtype: Dichte der feuchten Luft in :math:`kg/m^3`.
'''
if phi < 0. or phi > 1.:
raise ValueError('Luftfeuchtigkeit muss im Intervall [0,1] liegen!')
T = t + 273.15
RL = 287.058 # J/(kg K)
RW = 461.523
pS = saettigungsdampfdruck_wasser(t)
Rf = RL / (1. - phi*(pS/p) * (1. - RL/RW))
rho = p / (Rf*T) * 1.e2 # mbar -> SI-standard
return rho
[Doku]def brechungsindex_luft(lambd, t=20.0, p=1013.25, e=13.33):
'''
Berechnung des Brechungsindex von Luft
:param lambd: Vakuumwellenlänge der Lichtquelle in :math:`\mu{}m`
:param t: Temperatur in °C
:param p: Luftdruck in mbar
:param e: Wasserdampfpartialdruck (Feuchtigkeit) in mbar
Quelle: Kohlrausch, Praktische Physik, 23. Auflage, Band 1, S. 461
Die Formel gilt in guter Näherung im Temperaturbereich von 15 bis 30 °C und im
Druckbereich von 933 bis 1067 mbar, außerdem für ein CO2-Volumengehalt von 0,03%.
Mit der Formel lassen sich nicht die im Kohlrausch angegebenen beispielhaften Werte
für einzelne Wellenlängen reproduzieren. Gleichwohl stimmen die Werte für trockene
Luft mit denen überein, die sich nach dem CRC Handbook (78. Auflage, S. 10-259)
berechnen lassen (das CRC Handbook gibt keine Formel für feuchte Luft an).
:rtype: Brechungsindex der Luft
'''
cA = 8.34213e-5
cB = 2.40603e-2 # um^-2
cC = 130. # um^-2
cD = 1.5997e-4 # um^-2
cE = 38.9 # um^-2
sigma2 = 1.0/(lambd**2)
nLNm1 = cA + cB/(cC - sigma2) + cD/(cE - sigma2)
cAlpha = 3.671e-3 # degC^-1
cBeta = 4.292e-8 # mbar^-1
cGamma = 3.43e-8 # um^2 mbar^-1
t0 = 15.0 # degC
p0 = 1013.25 # mbar
nLm1 = nLNm1 * (1.0 + cAlpha*t0) / (1.0 + cAlpha*t) * (p/p0) - (cBeta - cGamma*sigma2) * e
return 1.0 + nLm1
def n_dryair(lambd, t=20.0, p=1013.25):
# CRC Handbook (78th ed, p. 10-259)
sigma2 = 1.0/(lambd**2)
nm1 = 1.e-8 * (8342.13 + 2406030./(130-sigma2) + 15997./(38.9-sigma2))
pPascal = 100.*p
corr = pPascal * (1. + pPascal*(61.3-t)*1.e-10) / (96095.4 * (1.0 + 0.003661*t))
return 1.0 + nm1*corr
[Doku]def n_schott_f2(lambd):
'''
Formel für den Brechungsindex des Schott-Glases F2 (Flintglas)
Quelle: https://www.schott.com/d/advanced_optics/47d79895-2965-472d-83ed-af9e48ac72c0/1.1/schott-optisches-glas-datenblatt-sammlung-german-17012017.pdf
:param lambd: Vakuumwellenlänge der Lichtquelle in :math:`\mu{}m`
:rtype: Brechungsindex bei der gegebenen Wellenlänge.
'''
B1 = 1.34533359
B2 = 0.209073176
B3 = 0.937357162
C1 = 0.00997743871
C2 = 0.0470450767
C3 = 111.8867640
l2 = lambd**2
nsqrm1 = B1*l2/(l2-C1) + B2*l2/(l2-C2) + B3*l2/(l2-C3)
return np.sqrt(1.0 + nsqrm1)
[Doku]def n_schott_nsf10(lambd):
'''
Formel für den Brechungsindex des Schott-Glases N-SF10 (Schwerflintglas)
Quelle: https://www.schott.com/d/advanced_optics/47d79895-2965-472d-83ed-af9e48ac72c0/1.1/schott-optisches-glas-datenblatt-sammlung-german-17012017.pdf
:param lambd: Vakuumwellenlänge der Lichtquelle in :math:`\mu{}m`
:rtype: Brechungsindex bei der gegebenen Wellenlänge.
'''
B1 = 1.62153902
B2 = 0.256287842
B3 = 1.644475520
C1 = 0.01222414570
C2 = 0.0595736775
C3 = 147.4687930
l2 = lambd**2
nsqrm1 = B1*l2/(l2-C1) + B2*l2/(l2-C2) + B3*l2/(l2-C3)
return np.sqrt(1.0 + nsqrm1)
[Doku]def schallgeschwindigkeit_luft(t):
'''
Näherungsformel für die Schallgeschwindigkeit in Luft.
Quelle: Wikipedia, https://de.wikipedia.org/wiki/Schallgeschwindigkeit
:param t: Temperatur in °C
:type t: float
:rtype: Schallgeschwindigkeit in m/s.
'''
T = convert_temperature(t, 'Celsius', 'Kelvin')
return np.sqrt(1.402 * 8.3145 * T / 0.02896)
[Doku]def dichte_wasser(t):
'''
Dichte von Wasser bei der gegebenen Temperatur und Normaldruck von 1013,25 hPa laut NIST-Datenbank.
:param t: Temperatur in °C
:type t: float
:rtype: Dichte in g/ml.
'''
nistfile = files('praktikum.data').joinpath('Wasser_Dichte.csv')
data = np.genfromtxt(nistfile, dtype=float, encoding='utf-8', skip_header=2)
thetav = data[:,0] # deg C
density = data[:,2] #g/ml
if t < thetav[0]:
raise ValueError(f'Temperatur {t}°C ist zu klein! Minimalwert: {thetav[0]}°C.')
if t > thetav[-1]:
raise ValueError(f'Temperatur {t}°C ist zu groß! Maximalwert: {thetav[-1]}°C.')
return np.interp(t, thetav, density)
[Doku]def dampfdruckkurve_wasser():
'''
Dampfdruckkurve für Wasser laut NIST-Datenbank.
:rtype: Array der Temperaturwerte (in °C), Array der zugehörigen Werte für den Dampfdruck (in hPa)
'''
nistfile = files('praktikum.data').joinpath('Wasser_NIST.csv')
data = np.genfromtxt(nistfile, dtype=float, encoding='utf-8', skip_header=3)
theta = data[:,0] # deg C
ddruck = data[:,1] * 1.e4 # MPa -> hPa
return theta, ddruck
[Doku]def verdampfungsenthalpiekurve_wasser():
'''
Daten der molaren Verdampfungsenthalpie von Wasser in Abhängigkeit der Temperatur laut NIST-Datenbank.
:rtype: Array der Temperaturwerte (in °C), Array der zugehörigen Werte für die molare Verdampfungsenthalpie (in kJ/mol)
'''
nistfile = files('praktikum.data').joinpath('Wasser_NIST.csv')
data = np.genfromtxt(nistfile, dtype=float, encoding='utf-8', skip_header=3)
theta = data[:,0] # deg C
# Enthalpiedifferenz zwischen gasförmig unf flüssig
verd_enthalpie = data[:,17] - data[:,5] # kJ/mol
return theta, verd_enthalpie
[Doku]def verdampfungsenthalpie_wasser(t):
'''
Molare Verdampfungsenthalpie von Wasser für gegebene Temperatur, laut NIST-Datenbank.
:param t: Temperatur in °C
:type t: float
:rtype: Molare Verdampfungsenthalpie (in kJ/mol)
'''
thetav, verd_enthalpie = verdampfungsenthalpiekurve_wasser()
if t < thetav[0]:
raise ValueError(f'Temperatur {t}°C ist zu klein! Minimalwert: {thetav[0]}°C.')
if t > thetav[-1]:
raise ValueError(f'Temperatur {t}°C ist zu groß! Maximalwert: {thetav[-1]}°C.')
return np.interp(t, thetav, verd_enthalpie)
if __name__ == '__main__':
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = 'Arial'
plt.rcParams['font.weight'] = 'bold'
plt.rcParams['figure.titleweight'] = 'bold'
plt.rcParams['axes.labelsize'] = 'large'
plt.rcParams['axes.labelweight'] = 'bold'
plt.rcParams['axes.formatter.useoffset'] = 'False'
pnorm = 1013.25
tnorm = 22.0
hnorm = 0.5
enorm = hnorm * saettigungsdampfdruck_wasser(tnorm)
lambdnorm = 0.632
nnorm = brechungsindex_luft(lambd=lambdnorm, t=tnorm, p=pnorm, e=enorm)
nmin = nnorm - 0.000011
nmax = nnorm + 0.00001
#print('H20 Partialdruck = %.3f mbar' % enorm)
ylabel = '$n_\mathrm{Luft}$'
fig, ax = plt.subplots(2, 2, figsize=(20,10))
lambdas = np.arange(400., 800., 5.)
ax[0][0].plot(lambdas, brechungsindex_luft(lambdas/1000., t=tnorm, p=pnorm, e=enorm), 'b-')
ax[0][0].set_title(u'Abhängigkeit von der Wellenlänge', fontweight='bold')
ax[0][0].set_xlabel('$\lambda$ (nm)')
ax[0][0].set_ylabel(ylabel)
ax[0][0].set_ylim(nmin, nmax)
ts = np.arange(19., 25., 0.1)
ax[0][1].plot(ts, brechungsindex_luft(lambdnorm, t=ts, p=pnorm, e=enorm), 'b-')
ax[0][1].set_title(u'Temperaturabhängigkeit', fontweight='bold')
ax[0][1].set_xlabel(u'$t$ (°C)')
ax[0][1].set_ylabel(ylabel)
ax[0][1].set_ylim(nmin, nmax)
ps = np.arange(980., 1040., 1.)
ax[1][0].plot(ps, brechungsindex_luft(lambdnorm, t=tnorm, p=ps, e=enorm), 'b-')
ax[1][0].set_title(u'Druckabhängigkeit', fontweight='bold')
ax[1][0].set_xlabel('$P$ (mbar)')
ax[1][0].set_ylabel(ylabel)
ax[1][0].set_ylim(nmin, nmax)
hs = np.arange(0., 100.1, 2.)
es = saettigungsdampfdruck_wasser(tnorm) * hs/100.
ax[1][1].plot(hs, brechungsindex_luft(lambdnorm, t=tnorm, p=pnorm, e=es), 'b-')
ax[1][1].set_title(u'Abhängigkeit von der Luftfeuchtigkeit', fontweight='bold')
ax[1][1].set_xlabel('rel. Luftfeuchte (%)')
ax[1][1].set_ylabel(ylabel)
ax[1][1].set_xlim(0., 100.)
ax[1][1].set_ylim(nmin, nmax)
plt.tight_layout()
plt.show()