用matlab写一个拟合正太分布算法
时间: 2024-03-25 12:38:56 浏览: 76
拟合正态分布可以使用MATLAB中的`normfit()`函数,它可以自动计算均值和标准差。如果需要自定义拟合函数,可以使用`lsqcurvefit()`函数或`fit()`函数来拟合数据。
下面是一个使用`lsqcurvefit()`函数进行正态分布拟合的示例代码:
```matlab
% 生成正态分布数据
x = linspace(-5, 5, 100); % 横坐标范围
y = normpdf(x, 0, 1); % 标准正态分布
% 加入噪声
noise = 0.1 * randn(size(x));
y_noisy = y + noise;
% 定义拟合函数
func = @(p, x) normpdf(x, p(1), p(2));
% 初始参数值
p0 = [0, 1];
% 拟合曲线
p_opt = lsqcurvefit(func, p0, x, y_noisy);
% 绘制拟合曲线和原始数据
figure
plot(x, y, 'k--', 'LineWidth', 2); hold on;
plot(x, y_noisy, 'b.', 'MarkerSize', 12);
plot(x, func(p_opt, x), 'r-', 'LineWidth', 2);
xlabel('x'); ylabel('pdf(x)');
legend('True pdf', 'Noisy data', 'Fit pdf');
```
在上述代码中,首先生成一个标准正态分布,然后加入一些噪声。接下来,定义拟合函数为正态分布的概率密度函数。使用`lsqcurvefit()`函数拟合数据并绘制结果。
如果需要自定义拟合函数,可以将自定义函数传递给`lsqcurvefit()`函数,例如:
```matlab
% 定义拟合函数为正态分布的累积分布函数
func = @(p, x) normcdf(x, p(1), p(2));
% 初始参数值
p0 = [0, 1];
% 拟合曲线
p_opt = lsqcurvefit(func, p0, x, y_noisy);
% 绘制拟合曲线和原始数据
figure
plot(x, y, 'k--', 'LineWidth', 2); hold on;
plot(x, y_noisy, 'b.', 'MarkerSize', 12);
plot(x, func(p_opt, x), 'r-', 'LineWidth', 2);
xlabel('x'); ylabel('cdf(x)');
legend('True cdf', 'Noisy data', 'Fit cdf');
```
在这个例子中,拟合函数被定义为正态分布的累积分布函数,并使用相同的方法进行拟合。
阅读全文