use*_*676 10 matlab gaussian octave curve-fitting
我有一组带有峰值的频率数据,我需要拟合一条高斯曲线,然后从中得到半峰全宽.我可以做的FWHM部分,我已经有了一个代码,但我在编写代码以适应高斯时遇到了麻烦.
有没有人知道任何能为我做这件事的功能,或者能指出我正确的方向?(我可以对线和多项式进行最小二乘拟合,但我不能让它适用于高斯人)
如果它与Octave和Matlab兼容,那将是有帮助的,因为我现在有Octave但是直到下周才能访问Matlab.
任何帮助将不胜感激!
Rod*_*uis 20
直接拟合单个1D高斯是一个非线性拟合问题.你会发现现成的实现在这里,或这里,或这里2D,或者在这里(如果你有统计工具箱)(你有没有听说过谷歌的?:)
无论如何,可能有一个更简单的解决方案.如果你确定你的数据y
将被高斯描述得很好,并且在整个范围内分布得相当均匀x
,你可以将问题线性化(这些是方程,而不是语句):
y = 1/(?·?(2?)) · exp( -½ ( (x-?)/? )² )
ln y = ln( 1/(?·?(2?)) ) - ½ ( (x-?)/? )²
= Px² + Qx + R
Run Code Online (Sandbox Code Playgroud)
换人的地方
P = -1/(2?²)
Q = +2?/(2?²)
R = ln( 1/(?·?(2?)) ) - ½(?/?)²
Run Code Online (Sandbox Code Playgroud)
已经成了.现在,解决线性系统Ax=b
(这些是Matlab语句):
% design matrix for least squares fit
xdata = xdata(:);
A = [xdata.^2, xdata, ones(size(xdata))];
% log of your data
b = log(y(:));
% least-squares solution for x
x = A\b;
Run Code Online (Sandbox Code Playgroud)
x
你用这种方式找到的矢量将是相同的
x == [P Q R]
Run Code Online (Sandbox Code Playgroud)
然后你必须进行逆向工程以找到平均μ和标准偏差σ:
mu = -x(2)/x(1)/2;
sigma = sqrt( -1/2/x(1) );
Run Code Online (Sandbox Code Playgroud)
您可以与之交叉核对x(3) == R
(应该只有很小的差异).