Вычисление параметров для молекулярной механики

Данная работа заключалась в определении констант ковалентных взаимодействий для молекулярной механики на основе квантово-химических расчётов. Это производилось на примере молекулы этана с использованием ORCA.

Имеем оптимизированную структура этана в виде z-matrix (bond_length,bond angle, torsion angle):

inp = '''!HF RHF 6-31G \* int 0 1 C 0 0 0 0 0 0 C 1 0 0 1.52986 0 0 H 1 2 0 1.08439 111.200 0 H 1 2 3 1.08439 111.200 120 H 1 2 3 1.08439 111.200 -120 H 2 1 3 1.08439 111.200 180 H 2 1 6 1.08439 111.200 120 H 2 1 6 1.08439 111.200 -120 *

Далее с помощью ORCA были расчитаны энергии при разных значениях длины связи (C-C). Были подставлены 20 разных длинн связи (C-C) с шагом 0.02 ангстрема от оптимального значения.

In [2]:
import subprocess, os
def run_orca(inp):
    with open('orca.inp', 'w') as outfile:
        outfile.write(inp)
    my_env = os.environ.copy()
    p = subprocess.Popen("/srv/databases/orca/orca orca.inp", 
                          shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=my_env)
    p.wait()
    out=p.communicate()[0]
    lines=out.splitlines()
    for line in lines:
        if "FINAL SINGLE POINT ENERGY" in line:
            line=line.split()[4]
            return float(line)
In [37]:
ccbond=1.52986
bonds=[]
b_energies=[]
for n in range(-10,10):
    newbond=ccbond+n*0.02
    bonds.append(newbond)
    inp = '''!HF RHF 6-31G
* int 0 1
C 0 0 0 0 0 0 
C 1 0 0 %6.5f 0 0 
H 1 2 0 1.08439 111.200 0
H 1 2 3 1.08439 111.200 120
H 1 2 3 1.08439 111.200 -120
H 2 1 3 1.08439 111.200 180
H 2 1 6 1.08439 111.200 120
H 2 1 6 1.08439 111.200 -120
*
'''
    b_energy=run_orca(inp %newbond)
    b_energies.append(b_energy)
print "bond length:"
print bonds
print "bond energy:"
print b_energies
bond length:
[1.32986, 1.34986, 1.36986, 1.38986, 1.4098600000000001, 1.42986, 1.44986, 1.46986, 1.48986, 1.50986, 1.52986, 1.54986, 1.56986, 1.58986, 1.60986, 1.62986, 1.6498599999999999, 1.66986, 1.68986, 1.70986]
bond energy:
[-79.045965590119, -79.053603047451, -79.060094932942, -79.06554485476, -79.070047523843, -79.073689505281, -79.076549916355, -79.078701061159, -79.080208995167, -79.081134076599, -79.081531431378, -79.081451404936, -79.080939963093, -79.080039062387, -79.078786990807, -79.077218675992, -79.075365973146, -79.073257919932, -79.070920984592, -79.068379281351]

С помощью matplotlib построена зависимость энергии молекулы от длинны С-С связи в молекуле этана.

In [5]:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize
In [67]:
x_o=bonds
y_o=b_energies 

#function is  f(x)=k(b-x)^2 + a
fitfunc = lambda p, x: p[0]*pow(p[1]-x,2) + p[2] # Target function
errfunc = lambda p, x, y: fitfunc(p, x) - y # Error function

p0 = [1,1, -79] # Initial guess for the parameters
p1, success = optimize.leastsq(errfunc, p0[:], args=(x_o, y_o))
print "Optimized parameters:", p1

#Plot it
plt.plot(x_o, y_o, "ro", x_o,fitfunc(p1,x_o),"r-",c='blue',alpha=0.5)
plt.ylabel('Energy, eV')
plt.xlabel('C-C bond length, angstrem')
plt.xlim(1.3,1.75)
plt.show()
Optimized parameters: [  0.66824714   1.55389269 -79.08233323]

График зависимости в приближении имеет вид параболы. Минимуму энергии соответствует длина С-С связи равная 1.52986 Å, именно такое значение эта связи имеет в оптимизированной структуре этана. Также можно заметить, что более маленькие значения длины связи имеют большее влияние на энергию, чем симмитричные значения связей в большую сторону от значения 1.52986 Å.

Аналогичные операции были проведены для валентного угла HCС, его значения изменятся от 109.2° до 113.2°.

In [47]:
hccangle=111.200
angles=[]
a_energies=[]
for n in range(-10,10):
    newangle=hccangle+n*0.2
    angles.append(newangle)
    inp = '''!HF RHF 6-31G
* int 0 1
C 0 0 0 0 0 0 
C 1 0 0 1.52986 0 0 
H 1 2 0 1.08439 %6.3f 0
H 1 2 3 1.08439 111.200 120
H 1 2 3 1.08439 111.200 -120
H 2 1 3 1.08439 111.200 180
H 2 1 6 1.08439 111.200 120
H 2 1 6 1.08439 111.200 -120
*
'''
    a_energy=run_orca(inp %newangle)
    a_energies.append(a_energy)
print "hcc angle:" 
print angles
print "angle energy:"
print a_energies
hcc angle:
[109.2, 109.4, 109.60000000000001, 109.8, 110.0, 110.2, 110.4, 110.60000000000001, 110.8, 111.0, 111.2, 111.4, 111.60000000000001, 111.8, 112.0, 112.2, 112.4, 112.60000000000001, 112.8, 113.0]
angle energy:
[-79.081417679807, -79.08144388275, -79.081466815365, -79.081486450247, -79.081502772484, -79.081515782907, -79.08152548538, -79.081531884288, -79.081534984087, -79.081534789216, -79.081531304089, -79.081524533069, -79.081514480488, -79.081501150634, -79.081484547759, -79.081464676074, -79.081441539752, -79.081415142944, -79.081385489745, -79.081352584204]
In [68]:
x_o=angles
y_o=a_energies 
fitfunc = lambda p, x: p[0]*pow(p[1]-x,2) + p[2]
errfunc = lambda p, x, y: fitfunc(p, x) - y
p0 = [1,1, -79]
p1, success = optimize.leastsq(errfunc, p0[:], args=(x_o, y_o))
print "Optimized parameters:", p1
plt.plot(x_o, y_o, "ro", x_o,fitfunc(p1,x_o),"r-",c='blue',alpha=0.5)
plt.ylabel('Energy, eV')
plt.xlabel('Angle, degree')
plt.xlim(109,113.4)
plt.show()
Optimized parameters: [  4.10919203e-05   1.10890457e+02  -7.90815353e+01]

График зависимости энергии молекулы этана от значения HCC угла аналогично с предыдущим случаем приближается параболой. Минимум энергии соответствует значению HCC угла 111.2°, именно такое значение этот угол имеет в оптимизированной структуре этана.

Аналогичные операции были проделаны для торсионного угла CC, его значения изменятся от -180° до 180° c шагом 12.

In [3]:
tors_angle=180
tors_angles=[]
t_energies=[]
for n in range(-30,1):
    newtors=tors_angle+n*12
    tors_angles.append(newtors)
    inp = '''!HF RHF 6-31G
* int 0 1
C 0 0 0 0 0 0 
C 1 0 0 1.52986 0 0 
H 1 2 0 1.08439 111.200 0
H 1 2 3 1.08439 111.200 120
H 1 2 3 1.08439 111.200 -120
H 2 1 3 1.08439 111.200 %f
H 2 1 6 1.08439 111.200 120
H 2 1 6 1.08439 111.200 -120
*
'''    
    t_energy=run_orca(inp %newtors)
    t_energies.append(t_energy)
print "torsion angle:" 
print tors_angles
print "torsion angle energy:"
print t_energies
torsion angle:
[-180, -168, -156, -144, -132, -120, -108, -96, -84, -72, -60, -48, -36, -24, -12, 0, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 168, 180]
torsion angle energy:
[-79.197572404412, -79.197137699078, -79.195996511441, -79.194579710958, -79.193428553474, -79.192987702649, -79.193428552912, -79.194579709509, -79.195996509904, -79.197137698941, -79.197572392766, -79.197137699058, -79.195996511441, -79.194579710958, -79.193428553474, -79.192987702649, -79.193428552912, -79.194579709509, -79.195996509904, -79.197137698941, -79.197572392766, -79.197137699058, -79.195996511441, -79.194579710958, -79.193428553474, -79.192987702649, -79.193428552912, -79.194579709509, -79.195996509904, -79.197137698941, -79.197572392766]
In [80]:
x_o=tors_angles
y_o=t_energies 
plt.plot(x_o, y_o, "ro", c='blue',alpha=0.5)
plt.ylabel('Energy, eV')
plt.xlabel('Torsion angle, degree')
plt.xlim(-180,180)
plt.show()
plt.savefig("energy_torsangle")
<matplotlib.figure.Figure at 0x7f7cda9bfc10>

Этот график зависимости энергии от значений торсионного угла в молекуле этана имеет синусоидальную форму. Он имеет 4 минимума: при значениях -180, -60, 60 и 180. Это соответствует торсионным углам H-C-C-H с различными парами водородов в оптимизированной молекуле этана.