#!/usr/bin/python
# -*- coding: utf8 -*-
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
from math import *
code_website = 'http://commons.wikimedia.org/wiki/User:Geek3/mplwp'
try:
import mplwp
except ImportError, er:
print 'ImportError:', er
print 'You need to download mplwp.py from', code_website
exit(1)
name = 'mplwp_Voigt05_pseudo.svg'
fig = mplwp.fig_standard(mpl)
xlim = -3.5, 3.5; fig.gca().set_xlim(xlim)
ylim = 0, 0.5; fig.gca().set_ylim(ylim)
mplwp.move_axes(fig, 12, 0)
mplwp.mark_axeszero(fig.gca())
from scipy.special import wofz
def voigt(sigma, gamma, x):
if sigma == 0.:
return gamma / (pi * (x**2 + gamma**2))
else:
return wofz((x + 1j * gamma) / (sqrt(2)*sigma)).real / (sqrt(2*pi)*sigma)
def pseudo_voigt(sigma, gamma, x):
# use TCH formula: Voigt-approximation by sum of gauss and Lorentz
s, g = sigma, gamma
w = (s**5 + 2.69269*s**4*g + 2.42843*s**3*g**2 + 4.47163*s**2*g**3 + 0.07842*s*g**4 + g**5)**0.2
eta = g / w
eta = 1.36603 * eta - 0.47719 * eta**2 + 0.11116 * eta**3
L = w / (pi * (x**2 + w**2))
G = np.exp(-x**2 / (2*w**2)) / (sqrt(2*pi) * w)
Vp = eta * L + (1 - eta) * G
return Vp
x = np.linspace(xlim[0], xlim[1], 5001)
y1 = voigt(0.5, 0.5, x)
plt.plot(x, y1, label=r'$V(\sigma=0.5,\,\gamma=0.5)$', zorder=-1)
y2 = pseudo_voigt(0.5, 0.5, x)
plt.plot(x, y2, label=r'$V_p(\sigma=0.5,\,\gamma=0.5)$', zorder=-2)
mpl.rc('legend', borderaxespad=0.6)
plt.legend(loc='upper center', ncol=2, columnspacing=1.5,
handletextpad=0.6).get_frame().set_alpha(0.9)
plt.savefig(name)
mplwp.postprocess(name)