import numpy as np import matplotlib.pyplot as plt from scipy.integrate import quad from scipy.optimize import newton from scipy.signal import argrelextrema palette = iter(['#9b59b6', '#4c72b0', '#55a868', '#c44e52', '#dbc256']) # Wartosci krytyczne temperatury, objetosci i cisnienia # Wartosci te odpowiadaja parametrom krytycznym CO2 dla rownania stanu van der Waalsa: # (p - a/V^2)(V-b) = RT. Jednostki: [p]=Pa, [V]=m^3/mol oraz [T]=K. pc = 7.404e6 Vc = 1.28e-4 Tc = 304 def vdw(Tr, Vr): """Rownanie stanu van der Waalsa. Zwroc zredukowane cisnienie w funkcji zredukowanej temperatury i objetosci molowej """ pr = 8*Tr/(3*Vr-1) - 3/Vr**2 return pr def vdw_maxwell(Tr, Vr): """Rownanie van der Waalsa z przeprowadzona konstrukcja Maxwella. Zwroc zredukowane cisnienie w funkcji zredukowanej temperatury i objetosci molowej, stosujac konstrukcje Maxwella dla obszaru niestabilnosci. """ pr = vdw(Tr, Vr) if Tr >= 1: # Obszar stabilnosci return pr # Poczatkowe zgdnieciegdzie znajduje sie linia wykorzystywana do konstrukcji Maxwella: # objetosc odpowiadajaca wartosci sredniej pomiedzy minimum i maksimum w zredukowanym cisnieniu, pr. iprmin = argrelextrema(pr, np.less) iprmax = argrelextrema(pr, np.greater) Vr0 = np.mean([Vr[iprmin], Vr[iprmax]]) def get_Vlims(pr0): """Rozwiaz rownanie na izoterme van der Waalsa wzgledem zredukowanej objetosci. Zwroc minimalna i maksymalna wartosc zredukowanej objetosci takie ze cisnienie zredukowane wynosi pr0. Wzywanie tej funkcji jest uzasadnione tylko gdy T= Vrmin) & (Vr <= Vrmax)] = pr0 return pr Vr = np.linspace(0.5, 3, 500) def plot_pV(T): Tr = T / Tc c = next(palette) ax.plot(Vr, vdw(Tr, Vr), lw=2, alpha=0.3, color=c) ax.plot(Vr, vdw_maxwell(Tr, Vr), lw=2, color=c, label='{:.2f}'.format(Tr)) fig, ax = plt.subplots() for T in range(270, 320, 10): plot_pV(T) ax.set_xlim(0.4, 3) ax.set_xlabel('Zredukowana objetosc, $\omega$') ax.set_ylim(0, 1.6) ax.set_ylabel('Zredukowane cisnienie, $\pi$') ax.legend(title='Zredukowana temperatura') plt.show()