Vectors must be the same length 错误在Matlab中的曲线拟合

Vectors must be the same length error in Curve Fitting in Matlab

我在为函数拟合随机数据时遇到问题

这是我的代码

N = 100;
mu = 5; stdev = 2;
x = mu+stdev*randn(N,1);
bin=mu-6*stdev:0.5:mu+6*stdev;
f=hist(x,bin);
plot(bin,f,'bo'); hold on;

x_ = x(1):0.1:x(end); 
y_ = (1./sqrt(8.*pi)).*exp(-((x_-mu).^2)./8); 
plot(x_,y_,'b-'); hold on;

似乎我遇到了矢量大小问题,因为它给我错误

Error using plot
    Vectors must be the same length.

请注意,我简化了 y_,因为 mu 和标准偏差是已知的。

剧情:

那么首先对你的问题做一些调整:

  • 您不是要对通过从同一分布(参数为 (mu,sigma) 的正态分布)中随机取点而获得的直方图执行 curve fitting. What you are trying to do (in my opinion) is to overlay a probability density function。这两条曲线确实应该重叠,因为它们代表的是同一件事,只有一条是解析的,另一条是数值得出的。

  • 如图所示 hist documentation, hist is not recommended and you should use histogram instead

第一步:生成随机数据

知道分布是正态分布,我们可以使用MATLAB's random function来做到这一点:

N = 150;
rng('default') % For reproducibility
mu = 5;
sigma = 2;
r = random('Normal',mu,sigma,N,1);

第二步:绘制直方图

因为我们不只是想要每个 bin 中元素的计数,而是想了解概率密度函数,我们可以使用 'Normalization' 'pdf' 参数

Nbins = 25;
f=histogram(r,Nbins,'Normalization','pdf');
hold on

在这里,我宁愿指定 bin 的数量,也不愿指定 bin 本身,因为你永远不会提前知道你的数据离均值有多远。

最后一步:在直方图上叠加概率密度函数

直方图已经与概率密度函数一致,只需叠加密度函数即可:

x_ = linspace(min(r),max(r),100);
y_ = (1./sqrt(2*sigma^2*pi)).*exp(-((x_-mu).^2)./(2*sigma^2)); 
plot(x_,y_,'b-');

N = 150

N = 1500

N = 150.000Nbins = 50

如果出于某些不明确的原因您想使用旧的 hist() 函数

旧的 hist() 函数无法处理归一化,因此您必须手动完成,通过归一化密度函数以适合直方图:

N = 1500;
% rng('default') % For reproducibility
mu = 5;
sigma = 2;
r = random('Normal',mu,sigma,1,N);
Nbins = 50;
[~,centers]=hist(r,Nbins);
hist(r,Nbins); hold on

% Width of bins
Widths = diff(centers);

x_ = linspace(min(r),max(r),100);
y_ = N*mean(Widths)*(1./sqrt(2*sigma^2*pi)).*exp(-((x_-mu).^2)./(2*sigma^2)); 
plot(x_,y_,'r-');