Quellcode für praktikum.literaturwerte

# -*- 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()