Hva er greia: I praksis er det ikke mulig å polymerisere molekyl med identisk polymeriseringsgrad og molekylvekt. Derfor eksisterer polymer-materialer som en blanding av molekyl med ulike lengder og molekylvekt. Det finnes ulike måter å beskrive både molekylvektfordelingen og gjennomsnittlig molekylvekt:
Følgende datasett inneholder molekylvekt [g/mol] av 100 stk. molekyl:
mkv = [ 63355., 40328., 48828., 67058., 29102., 100052., 81804., 59475., 63620., 55302.,
54341., 86780., 59534., 33306., 86542., 26672., 49102., 57732., 92414., 56298.,
45783., 21314., 23162., 67275., 65588., 26618., 53235., 95882., 74636., 75721.,
106348., 36734., 77132., 23920., 60769., 60023., 93391., 25928., 66020., 15780.,
43198., 64391., 58864., 64639., 71086., 51664., 58454., 75283., 12025., 54526.,
78882., 27896., 80206., 35774., 57460., 55160., 33801., 43827., 56183., 36610.,
57606., 53738., 93903., 64225., 28569., 79116., 84936., 75802., 20697., 78020.,
73773., 56255., 32123., 72635., 44518., 80678., 43942., 76467., 66774., 70766.,
63650., 95865., 59809., 105433., 50248., 46205., 39808., 33670., 76279., 39505.,
60851., 68970., 41902., 25449., 37793., 58785., 60775., 60681., 64342., 101387. ]
Litt statestikk på greiene:
import numpy as np
print('Maks = ', np.max(mkv))
print('Min = ', np.min(mkv))
print('Mean = ', np.mean(mkv))
Merk at mean er identisk med
np.sum(mkv)/len(mkv)
Sorterer molekyl i 10 bins med identiske intervall på molekylvekt:
np.histogram(mkv,10)
Her har vi altså 4 molekyl med molekylvekt mellom 12025.0 og 21457.3, osv. Merk at siste array som angir intervall har lengde lik 11.
Dersom du er skrudd sammen som en gjennomsnittlig teknolog, så hjelper det veldig med grafikk av det samme:
%matplotlib inline
import matplotlib.pyplot as plt
fig,ax = plt.subplots(figsize=(6,4))
plt.hist(mkv, 10, density=False,facecolor='teal', alpha=0.4 )
ax.set_ylabel('$X_i$ (antall)', size=12)
ax.set_xlabel('$M_i$ [g/mol]', size=12)
ax.set_title('Molekylvektfordeling')
ax.set_xlim(0,)
ax.grid(True)
plt.show()
Forenkler eksempelet og kjører med bare 5 bins:
fig,ax = plt.subplots(figsize=(6,4))
plt.hist(mkv, 5, density=False,facecolor='teal', alpha=0.4 )
ax.set_ylabel('$X_i$ (antall)', size=12)
ax.set_xlabel('$M_i$ [g/mol]', size=12)
ax.set_title('Molekylvektfordeling')
ax.set_xlim(0,)
ax.grid(True)
plt.show()
Xi, Mbins = np.histogram(mkv,5)
print(Xi)
print(Mbins)
Regner ut
\begin{equation} x_i = \frac{X_i}{\sum X_i} \end{equation}xi = Xi/np.sum(Xi)
print(xi)
Deretter
\begin{equation} \overline{M}_n = \sum x_i M_i \end{equation}Her må vi først regne ut $M_i$:
ant = len(xi)
Mi = np.zeros((ant))
for i in range(0,ant):
Mi[i] = ( (Mbins[i+1]+Mbins[i])/2 )
print(Mi)
Dette er altså gjennomsnittlig molekylvekt i hver bins.
Dermed finner vi $\overline{M}_n$ ved prikkproduktet:
Mn = np.dot(Mi,xi)
print(Mn)
som altså er omtrent det samme som
np.sum(mkv)/len(mkv)
Vekt av molekyl i hver bins er ganske enkelt molekylvekt multiplisert med antall. Enhet her er ikke viktig, siden vi uansett kommer til å normalisere slik at summen er lik 1.
Wi = Mi*Xi
print(Wi)
Normaliserer slik at listen utrykker andeler (av 1 totalt)
wi = Wi/np.sum(Wi)
print(wi)
Til slutt, regner ut
\begin{equation} \overline{M}_w = \sum w_i M_i \end{equation}Mw = np.dot(Mi,wi)
print(Mw)
...og litt grafikk
fig,ax = plt.subplots(figsize=(6,4))
plt.hist(mkv, 5, density=False,facecolor='teal', alpha=0.4 )
ax.plot((Mn,Mn),(0,max(Xi)), '--', color='black')
ax.plot((Mw,Mw),(0,max(Xi)), '--', color='black')
ax.text(Mn,max(Xi),'$\overline{M}_n$',size=14)
ax.text(Mw,max(Xi),'$\overline{M}_w$',size=14)
ax.set_ylabel('$X_i$ (antall)', size=12)
ax.set_xlabel('$M_i$ [g/mol]', size=12)
ax.set_title('Molekylvektfordeling')
ax.set_xlim(0,)
ax.set_ylim(0,40)
ax.grid(True)
plt.show()
Forrige eksempel er urealistisk med hensyn på eksperimentelle metoder i praksis. Heller enn å veie, eller på annen måte finne vekten av hvert enkelt molekyl, blir ulike fraksjoner av moleylvekter separert.
Følgende data inneholder vekt av 20 ulike fraksjoner ($W_i$) i milligram [mg] med tilhørende intervaller (bins):
Wi = [ 0., 2261., 6045., 8330., 9825., 10482., 10407., 9842., 9156., 8144.,
6921., 5752., 4386., 3272., 2300., 1552., 865., 458., 175., 31. ]
bins = [ 0., 5000., 10000., 15000., 20000., 25000., 30000., 35000., 40000., 45000.,
50000., 55000., 60000., 65000., 70000., 75000., 80000., 85000., 90000., 95000.,
100000. ]
Her må vi først regne ut $M_i$:
Mi = np.zeros((len(bins)-1))
for i in range(0,len(bins)-1):
Mi[i] = (bins[i]+bins[i+1])/2
print('Mi=',Mi)
Som ser sånn ut:
fig, ax = plt.subplots(figsize=(10,5))
ax.plot(Mi, Wi, 'o-', color = 'blue', linewidth=0.5 )
ax.set_ylabel('$W_i$ [mg]', size=12)
ax.set_xlabel('$M_i$ [g/mol]', size=12)
ax.set_title('Molekylvektfordeling')
ax.set_xlim(0,)
ax.set_ylim(0,)
ax.grid(True)
plt.show()
Gjennomsnittlig molekylvekt basert på vekt:
\begin{equation} \overline{M}_w = \sum w_i M_i \quad \text{hvor} \quad w_i = \frac{W_i}{\sum W_i} \end{equation}wi = Wi/np.sum(Wi)
Mw = np.dot(wi,Mi)
print('Mw=',Mw)
Relativt antall molekyl i hver fraksjon er nå:
xi = (Wi/Mi)
xi = xi/np.sum(xi)
Dermed,
\begin{equation} \overline{M}_n = \sum x_i M_i \end{equation}Mn = np.dot(xi,Mi)
print('Mn=',Mn)
Oppsummering:
fig, ax = plt.subplots(figsize=(10,5))
ax.plot(Mi, Wi, 'o-', color = 'blue', linewidth=0.5 )
ax.plot((Mn,Mn),(0,max(Wi)), '--', color='black')
ax.plot((Mw,Mw),(0,max(Wi)), '--', color='black')
ax.text(Mn,np.mean(Wi),'$\overline{M}_n$',size=14)
ax.text(Mw,np.mean(Wi),'$\overline{M}_w$',size=14)
ax.set_ylabel('$W_i$ [mg]', size=12)
ax.set_xlabel('$M_i$ [g/mol]', size=12)
ax.set_title('Molekylvektfordeling')
ax.set_xlim(0,)
ax.set_ylim(0,)
ax.grid(True)
plt.show()