Polymer betyr: molekyl med mange repeterende enheter.
I denne delen ser vi hovedsaklig på molekylære aspekt ved polymerer, mens materialer av polymerer blir gjennomgått i temaet polymerer senere i emnet.
For å forstå egenskaper til polymere materialer, må vi ha en forståelse for rollen til sentrale kjemiske grupper, molekylets sammensetning og oppbygning, interaksjoner (bindinger) mellom molekyler, betydningen av molekylvekt, molekylvektsfordeling, polymeriseringsgrad og krystallinitetsgrad.
Polyetylen (PE) som er illustrert i figuren over, har typisk en polymeriseringsgrad på $n$ = 100 000 eller mer.
Konturlengden til et slikt molekyl ca. 30 um (se utregning under), og lengden av molekylet når det er strukket ut i et sikksakk-mønster i et plan er ca. 25 um.
n = 1E5
L_kontur = n*2*0.154
print('Konturlengde = {:.2f} mikrometer for n = {:.0f}'.format(L_kontur*1E-3, n))
import numpy as np
L_zigzag = n*2*0.154*np.cos(np.radians(90-109.5/2))
print('Lengde av plan zigzag = {:.2f} mikrometer for n = {:.0f}'.format(L_zigzag*1E-3, n))
Dette er et tanke-eksperiment der vi skal bruke ideen random walk, eller tilfeldig rusletur uten mål og mening på norsk.
Noen begrensninger: Det er egentlig full frihet for rotasjon rundt en binding, men vi skal begrense utfordringen til at molekylet kun kan konfigure seg i ett plan. Det betyr at rotasjon om en binding kan kun være null eller 180 grader. Altså: det er kun to mulige (men tilfeldig) utfall for hver binding.
Koden under (selvsagt ikke pensum å forstå denne) gjør jobben:
import numpy as np
import matplotlib.pyplot as plt
bondangle = 109.5 # grader, se figur
bondlength = 0.154 # nm, se figur
def roterVektor(a,v):
# roterer en 2D vektor a grader:
T = np.array([[np.cos(a) , -np.sin(a)],
[np.sin(a) , np.cos(a)]])
return np.dot(T,v)
def PE_randomWalk_2D(n):
a = 2*np.pi*np.random.random() # tilfeldig startvinkel
v = roterVektor(a,[0,bondlength])
x, y =[ 0, v[0] ], [ 0, v[1] ] # lister som skal fylles
adir = np.random.randint(0,2,n-1) # 0: positiv, 1: negativ
for a in adir:
if a == 0:
da = np.radians(180 - bondangle)
if a == 1:
da = -np.radians(180 - bondangle)
v=[x[-1]-x[-2], y[-1]-y[-2]] # forrige vektor (binding)
vr = roterVektor(da ,v) # ny vektor = forrige rotert
x.append(x[-1]+vr[0])
y.append(y[-1]+vr[1])
return x, y
# Eksempel: n = 100
x1,y1 = PE_randomWalk_2D(n=100)
plt.axes().set_aspect('equal')
plt.plot(x1,y1, color = 'blue')
plt.show()
# Eksempel: n = 1000
x1,y1 = PE_randomWalk_2D(n=1000)
plt.axes().set_aspect('equal')
plt.plot(x1,y1, color = 'blue')
plt.show()
# Eksempel: n = 10000
x1,y1 = PE_randomWalk_2D(n=10000)
plt.axes().set_aspect('equal')
plt.plot(x1,y1, color = 'blue')
plt.show()
# Eksempel: n = 10000, 3 ulike molekyl
x1,y1 = PE_randomWalk_2D(n=10000)
x2,y2 = PE_randomWalk_2D(n=10000)
x3,y3 = PE_randomWalk_2D(n=10000)
plt.axes().set_aspect('equal')
plt.plot(x1,y1, color = 'blue')
plt.plot(x2,y2, color = 'green')
plt.plot(x3,y3, color = 'red')
plt.show()