Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 不对称x输入的错误Voigt输出/卷积_Python_Python 3.x_Math_Curve Fitting_Convolution - Fatal编程技术网

Python 不对称x输入的错误Voigt输出/卷积

Python 不对称x输入的错误Voigt输出/卷积,python,python-3.x,math,curve-fitting,convolution,Python,Python 3.x,Math,Curve Fitting,Convolution,目前,我正在用高斯或洛伦兹拟合数据,但两者都不太适合,我想切换到Voigt拟合,这是两者的卷积 我从中检索了Voigt函数,并将其写入python import numpy as np import matplotlib.pyplot as plt def lorentz_voigt(x, A, xc, wL): return (2*A / np.pi) * (wL / ((4*(x.astype(float) - xc)**2) + wL**2)) def gauss_voigt(

目前,我正在用高斯或洛伦兹拟合数据,但两者都不太适合,我想切换到Voigt拟合,这是两者的卷积

我从中检索了Voigt函数,并将其写入python

import numpy as np
import matplotlib.pyplot as plt

def lorentz_voigt(x, A, xc, wL):
    return (2*A / np.pi) * (wL / ((4*(x.astype(float) - xc)**2) + wL**2))

def gauss_voigt(x, wG):
    return np.sqrt((4*np.log(2)) / np.pi) * ((np.exp(-(((4*np.log(2)) / (wG**2))*(x.astype(float))**2))) / (wG))

def Voigt(x, xc, A, wG, wL):
    return np.convolve(lorentz_voigt(x, A, xc, wL), gauss_voigt(x, wG), 'same')

symx = np.linspace(-100, 100, 1001)
asymx = np.linspace(0, 100, 1001)
symy = Voigt(symx, 50, 1, 5, 5)
asymy = Voigt(asymx, 50, 1, 5, 5)
plt.clf()
plt.plot(symx, symy)
plt.plot(asymx, asymy)
如下图所示,具有不对称x轴输入的Voigt函数(橙色)无法再现正确的Voigt轮廓(如蓝色所示)。


我的数据是600-4000 cm-1的波数,我想知道我是否必须在-4000到600 cm-1的数据中添加零,因为这是卷积的纯数学限制,或者我的代码在/解决方案中有错误?

卷积对x轴一无所知。最好让它返回完整卷积,然后将其缩小到原始x范围,例如:

import numpy as np
import matplotlib.pyplot as plt

def lorentz_voigt(x, A, xc, wL):
    return (2*A / np.pi) * (wL / ((4*(x.astype(float) - xc)**2) + wL**2))

def gauss_voigt(x, xc, wG):
    return np.sqrt((4*np.log(2)) / np.pi) * ((np.exp(-(((4*np.log(2)) / (wG**2))*((x-xc).astype(float))**2))) / (wG))

def Voigt(x, xc, A, wG, wL):
    return np.convolve(lorentz_voigt(x, A, xc, wL), gauss_voigt(x, xc, wG), 'full')

symx = np.linspace(-100, 100, 1001)
asymx = np.linspace(0, 200, 1001)
symy = Voigt(symx, 50, 1, 5, 5)[::2]
asymy = Voigt(asymx, 50, 1, 5, 5)[::2]

plt.clf()
plt.plot(symx, symy,'r')
plt.plot(asymx, asymy,'b--')
还要注意的是,您对gauss_voigt的定义忽略了相应的中心
xc

正如我在上面的评论中所说,还有另一种计算voigt函数的方法,它不是基于卷积的。卷积在计算时间方面是昂贵的,当用作拟合模型时,它会变得烦人。下面的示例代码不需要卷积

import matplotlib.pyplot as plt
import numpy as np
from scipy.special import wofz

def voigt(x, amp, pos, fwhm, shape):
    tmp = 1/wofz(np.zeros((len(x))) +1j*np.sqrt(np.log(2.0))*shape).real
    return tmp*amp*wofz(2*np.sqrt(np.log(2.0))*(x-pos)/fwhm+1j*np.sqrt(np.log(2.0))*shape).real

x = np.linspace(0, 100, 1001)
y0 = voigt(x, 1, 50, 5, 0)
y1 = voigt(x, 1, 50, 5, 1)
plt.plot(x,y0,'k',label='shape = 0')
plt.plot(x,y1,'b',label='shape = 1')
plt.legend(loc=0)
plt.show()

请发布一个指向数据的链接好吗?@JamesPhillips在绘图中看到的数据是在上面的脚本中创建的。在故障排除的这个阶段,来自实验的实际数据是不相关的。Voigt函数传递给curve_fit,但是该函数没有重新创建正确的轮廓,因此拟合失败。还有另一种计算Voigt线型的方法,它不涉及卷积:
V(x,sig,gam)=Re(w(z))/(sig*sqrt(2*pi))
其中
z=(x+i*gam)/(sig*sqrt(2))
Re(w(z))
是Faddeeva功能的真实部分。后者在scipy中为
scipy.special.wofz
。默认情况下,curve_fit使用的默认初始参数均为1.0,并非在所有情况下都是最佳的。Scipy的optimize.differential_evolution遗传算法可用于确定初始参数估计值,我希望使用您的实验数据给出一个例子,因此我请求链接到相同的。@Terranes您似乎正在使用拉曼光谱,不想使用Origin。看一看。它是用python编写的,我的印象是“相同”模式也会这样做,但显然不是这样。我确实注意到,在上面给出的函数的高斯分量中缺少xc。我认为这是因为高斯被标准化为卷积,或者类似的东西。你有理由把xc加到gauss_voigt上吗?