Molekylvektfordeling

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:

Gjennomsnittlig molekylvekt basert på antall:

\begin{equation} \overline{M}_n = \sum x_i M_i \quad \text{hvor} \quad x_i = \frac{X_i}{\sum X_i} \end{equation}

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}

Eksempel-1

Følgende datasett inneholder molekylvekt [g/mol] av 100 stk. molekyl:

In [1]:
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:

In [2]:
import numpy as np

print('Maks = ', np.max(mkv))
print('Min  = ', np.min(mkv))
print('Mean = ', np.mean(mkv))
Maks =  106348.0
Min  =  12025.0
Mean =  58327.83

Merk at mean er identisk med

In [3]:
np.sum(mkv)/len(mkv)
Out[3]:
58327.83

Sorterer molekyl i 10 bins med identiske intervall på molekylvekt:

In [4]:
np.histogram(mkv,10)
Out[4]:
(array([ 4,  9, 10, 10, 17, 20, 13,  8,  5,  4], dtype=int64),
 array([ 12025. ,  21457.3,  30889.6,  40321.9,  49754.2,  59186.5,
         68618.8,  78051.1,  87483.4,  96915.7, 106348. ]))

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:

In [5]:
%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:

In [6]:
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()
In [7]:
Xi, Mbins = np.histogram(mkv,5)
print(Xi)
print(Mbins)
[13 20 37 21  9]
[ 12025.   30889.6  49754.2  68618.8  87483.4 106348. ]

Regner ut

\begin{equation} x_i = \frac{X_i}{\sum X_i} \end{equation}
In [8]:
xi = Xi/np.sum(Xi)
print(xi)
[0.13 0.2  0.37 0.21 0.09]

Deretter

\begin{equation} \overline{M}_n = \sum x_i M_i \end{equation}

Her må vi først regne ut $M_i$:

In [9]:
ant = len(xi) 
Mi = np.zeros((ant))
for i in range(0,ant):
    Mi[i] = (  (Mbins[i+1]+Mbins[i])/2   )
print(Mi)
[21457.3 40321.9 59186.5 78051.1 96915.7]

Dette er altså gjennomsnittlig molekylvekt i hver bins.

Dermed finner vi $\overline{M}_n$ ved prikkproduktet:

In [10]:
Mn = np.dot(Mi,xi)
print(Mn)
57865.977999999996

som altså er omtrent det samme som

In [11]:
np.sum(mkv)/len(mkv)
Out[11]:
58327.83

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.

In [12]:
Wi = Mi*Xi
print(Wi)
[ 278944.9  806438.  2189900.5 1639073.1  872241.3]

Normaliserer slik at listen utrykker andeler (av 1 totalt)

In [13]:
wi = Wi/np.sum(Wi)
print(wi)
[0.04820534 0.13936306 0.37844353 0.28325333 0.15073474]

Til slutt, regner ut

\begin{equation} \overline{M}_w = \sum w_i M_i \end{equation}
In [14]:
Mw = np.dot(Mi,wi)
print(Mw)
65769.28455819757

...og litt grafikk

In [15]:
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):

In [16]:
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$:

In [17]:
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)
Mi= [ 2500.  7500. 12500. 17500. 22500. 27500. 32500. 37500. 42500. 47500.
 52500. 57500. 62500. 67500. 72500. 77500. 82500. 87500. 92500. 97500.]

Som ser sånn ut:

In [18]:
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}
In [19]:
wi = Wi/np.sum(Wi)
Mw = np.dot(wi,Mi)
print('Mw=',Mw)
Mw= 38298.271526086784

Relativt antall molekyl i hver fraksjon er nå:

In [20]:
xi = (Wi/Mi)
xi = xi/np.sum(xi)

Dermed,

\begin{equation} \overline{M}_n = \sum x_i M_i \end{equation}
In [21]:
Mn = np.dot(xi,Mi)
print('Mn=',Mn)
Mn= 28888.506102064053

Oppsummering:

In [22]:
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()

Disclaimer:This site is designed for educational purposes only. There are most likely errors, mistakes, typos, and poorly crafted statements that are not detected yet... www.ntnu.edu/employees/nils.p.vedvik

Copyright 2023, All rights reserved