Part1:Matlab源码:
clc;clear all;close all;
X(1)=0;
N=1e7;
p=@(x) 5*normpdf(x,1)+4*normpdf(x,5)+5*normpdf(x,10);%目标函数,三个正态函数
% p=@(x) 5*normpdf(x,1)+5*normpdf(x,4);%目标函数,二个正态函数 sig=1; %方差为1
dx=0.1; %横坐标量度
t=-5:dx:20;
for i=1:N
u=rand;%u是从(0,1)的均匀分布中采出的一个值
x=X(i);
y=normrnd(x,sig); %y是从从均值x,方差1的正态分布中采集的一个样值
Q1=normpdf(x,y,sig); %Q1=Q(x|y),自变量为x,均值为y,方差为1的正态分布
Q2=normpdf(y,x,sig); %Q2=Q(y|x),自变量为y,均值为x,方差为1的正态分布
alpha=min(1,p(y)*Q1/(p(x)*Q2));
if u<alpha
X(i+1)=y;
else
X(i+1)=x;
end
end
N0=1;
figure(1);
nb=histc(X(N0+1:N),t); %nb中存的是横坐标范围为t,值是X
bar(t+dx/2,nb/(N-N0)/dx); %画条形图,横坐标为t+dx/2,纵坐标为nb/(N-N0)/dx
A=sum(p(t))*dx;
hold on;
plot(t,p(t)/A,'r');
title('需要产生和实际产生的概率分布数据图');
legend('采样','目标分布');
xlabel('函数自变量');
ylabel('函数幅值');
Part2:结果:
图1.基于Metropolis-Hasting算法逼近三正态函数叠加
图2.基于Metropolis-Hasting算法逼近二正态函数叠加
Part3:结果分析
采用matlab软件编写并实现了Metropolis-hasting算法,实验结果分别通过两正态分布函数叠加和三正态分布函数叠加验证了算法的正确性。从实验结果上看用函数逼近2正态函数和3正态函数的效果都非常好,不存在尖峰和凹陷。但是值得注意的是,算法的逼近效果依赖于迭代的次数,迭代次数过小,实验结果会不理想。