Линии сплайнов в графике значений, но у - PullRequest
2 голосов
/ 29 января 2012

Я хотел бы сгенерировать график, подобный ссылке ниже

http://en.wikipedia.org/wiki/Reaction_coordinate

График, сгенерированный из расчета установленной библиотеки python.Я хотел бы, чтобы линия была гладкой с типом cspline gnuplot

Значения E_ads = 234.4211, E_dis = 0.730278 и E_reac = -0.8714

Может кто-нибудь помочь мне

from ase import *
from ase.calculators.jacapo import *
import Gnuplot as gp
# -- Read in all energies
datadict = {'H2O' :'water.nc',
            'Pt' :'out-Pt.nc',
            'H2OPt' :'H2O.Pt.nc',
            'OHPt' :'OHPt.nc',
            'HPt' :'HPt.nc',
}
E = {}

for label, file in datadict.items():
    print 'Reading energy for %5s from file %20s' % (label, file),
    atoms = Jacapo.read_atoms(file)
    E[label] = atoms.get_potential_energy()
    print '\tE = %14.6f eV'% E[label]
print     

# -- Calculate adsorption and disassociation energies
E_ads = (E['H2OPt'] - 2*E['H2O'] - E['Pt'])/2
print 'H2O adsorption energy on Pt:'
print 'E_ads =', E_ads, 'eV\n'

E_dis = E['HPt'] - E['Pt'] + E['OHPt'] - E['Pt'] - E['H2O']
print 'H2O -> OH + H disassociation energy on Pt:'
print 'E_dis =', E_dis, 'eV\n'

E_reac = E['H2OPt'] - E['HPt'] - E['OHPt'] + E['Pt']
print 'H2O@Pt -> OH@Pt +H@Pt reaction energy on Pt:'
print 'E_reac =', E_reac, 'eV\n'
# -- Collect reaction path
Epath = np.asarray([1.0, E_ads, E_dis, E_reac])
PathLabels= ['']
# -- Plot the reaction path
import pylab as p
import numpy as np
import matplotlib.path as mpath
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
from scipy.interpolate import spline
import matplotlib.pyplot as plt
from numpy import array, linspace
from scipy.interpolate import spline
fig = p.figure(1)
sp = p.subplot(1,1,1)
p.plot(Epath, color='black', linestyle=':', linewidth=2.0, alpha=0.8)
p.text(0.37, 10.05, 'Free H$_2$O',fontsize=12, color='black',ha='right', va='bottom', alpha=1.0)
p.text(1.1, 238, 'H$_2$O + Pt',fontsize=12, color='black',ha='right', va='bottom', alpha=1.0)
p.title('H$_2$O disassociation')
p.ylabel('Energy [eV]')
p.xlabel('Reaction path')
#p.xlim([-0.5, 2.5])
#p.ylim([-0.5, 1.5])
sp.get_xaxis().set_ticks([]) # Turn off ticks on xaxis
#p.savefig('Teste.png')
p.show()

1 Ответ

3 голосов
/ 29 января 2012

Вы можете построить обычную кубическую сплайн-версию ваших данных, просто выполнив что-то вроде этого:

plot(np.linspace(0,3),spline([0,1,2,3],Epath,np.linspace(0,3)))

, который даст что-то вроде:

enter image description here

Но я подозреваю, что это не то, что вы хотите. Возможно, вам придется прибегнуть к чему-то вроде монотонных сплайнов или сохраняющих форму сплайнов , чтобы получить форму, которая выглядит так же, как кривые, показанные в вашей ссылке в Википедии. Я не верю, что любой из этих методов интерполяции в настоящее время реализован в scipy.

Если у вас есть приблизительное представление о математической форме этих кривых, вы всегда можете подобрать собственную приблизительную функцию для непрерывного сечения и просто закрепить ее за пределами этого диапазона. Например:

plot(np.linspace(0,3),np.maximum(E_react,spline([0,1,2,3],Epath,np.linspace(0,3))))

даст:

enter image description here

, который, по крайней мере, "выглядит" как кривая, к которой вы привязаны, даже если она не подходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...