请问如何用matlab对一列数据画出对数正态分布曲线,并得到如下图所示的参数
1个回答
展开全部
close all;
clear all;
data = xlsread('工作簿数据.xlsx','sheet2','g2:g106556'); %读入数据
%测试数据 data = lognrnd(8,.7,10000,1);
[y x]=hist(data,200); %统计频次分布
h=bar(x,y,1); %画直方图
hold on;
%对数正态分布密度函数
fun=@(p,x) p(1)./x.*exp(-((log(x)-p(2))/p(3)).^2/2);
%A=p(1),mu=p(2),sigma=p(3)
[maxy ind]=max(y);
%做非线性数据拟合
p=nlinfit(x,y,fun,[maxy*x(ind),log(x(ind)),1]);
%画拟合曲线
x1 = min(x):0.01:max(x);
yfit=fun(p,x1);
plot(x1,yfit,'r','linewidth',1);
%极大似然处 x=exp(mu-sigma^2);
xmax=exp(p(2)-p(3)^2);
ymax=fun(p,xmax);
plot([xmax xmax],[0 ymax],'g','linewidth',2);
%期望值处 x=exp(mu+sigma^2/2)
xmean=exp(p(2)+p(3)^2/2);
ymean=fun(p,xmean);
plot([xmean xmean],[0 ymean],'c','linewidth',2);
xlim([min(x) max(x)]);
xlabel('BC浓度(ng/m^3)');
ylabel('频数');
legend('统计数据',['对数正态分布:\mu=' num2str(p(2)) ',\sigma=' num2str(p(3))],...
['极大概然分布位置:x=' num2str(xmax)],['期望值位置:x=' num2str(xmean)]);
text(xmean+10000,ymean+10,'$ y=\frac{A}{x}e^{-\frac{(lnx-\mu)^2}{2\sigma^2}} $',...
'interpreter','latex','FontSize',18);
更多追问追答
追问
大神好厉害啊,请问能用matlab对拟合效果进行检验吗
追答
logn_cdf=[data, cdf('logn',data,8,.7)];% 求累计概率
H0:符合指数分布
h= kstest(data,logn_cdf) %缺省alpha=0.05
h=0:不能拒绝H0,
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询