写一个matlab高斯函数拟合多个谱峰的代码
时间: 2023-09-12 20:12:33 浏览: 361
MATLAB代码,用于分峰拟合
以下是一个简单的Matlab代码,可以使用高斯函数拟合多个谱峰:
```matlab
% 生成数据
x = linspace(-5, 5, 1000);
y = 0.5*exp(-(x-1).^2/2/0.6^2) + 0.8*exp(-(x+1.5).^2/2/0.3^2) + 0.3*randn(size(x));
% 初始化拟合参数
num_peaks = 3;
p0 = [0.5, 1, 0.6, 0.8, -1.5, 0.3, 0, 0.1];
% 定义高斯函数模型
gaussian = @(p, x) p(1)*exp(-(x-p(2)).^2/2/p(3)^2);
% 定义目标函数
fun = @(p) sum((y - sum(gaussian([p(4*i-3), p(4*i-2), p(4*i-1)], x) for i=1:num_peaks)).^2);
% 进行拟合
options = optimoptions('fmincon', 'Display', 'off');
p = fmincon(fun, p0, [], [], [], [], [-Inf, -Inf, 0, -Inf, -Inf, 0], [Inf, Inf, Inf, Inf, Inf, Inf], [], options);
% 绘制拟合结果
figure;
plot(x, y, 'b', x, sum(gaussian([p(4*i-3), p(4*i-2), p(4*i-1)], x) for i=1:num_peaks), 'r');
legend('原始数据', '拟合结果');
```
这个代码使用了`fmincon`函数进行非线性优化,通过最小化目标函数的值来得到拟合参数。其中,`p0`是初始化参数,`fun`是目标函数,`gaussian`是高斯函数模型。在拟合过程中,我们限制了拟合参数的取值范围,避免出现不合理的参数。最后,我们绘制出拟合结果,以便对比原始数据。
阅读全文