如何在MATLAB中使用Metropolis Sampling来计算积分?

时间:2015-01-23 19:18:44

标签: sampling matlab

我正在尝试使用Metropolis方法编写一个matlab函数来解决测试积分。我的功能如下所列。

积分从0到无穷大x * e(-x ^ 2)除以从0到无穷大的积分e(-x ^ 2)

这个函数收敛到~0.5(值得注意的是,这个问题确实有点波动)但是在分析上解决方案是~0.5642或1 / sqrt(pi)。

我用来运行该功能的代码也在下面。

我做错了什么?如何使用metropolis来正确解决此测试功能?

% Metropolis Method for Integration
% Written by John Furness - Computational Physics, KTH

function [I S1 S2] = metropolis(f,a,b,n,sig)
% This function calculates an integral using Metropolis Mathod
% Only takes input as a function, f, on an interval between a and b,
% where n is the number of points.

%Defining burnin
%burnin = n/20;
burnin = 0;

% Finding maximum point
x = linspace(a,b,1000);
f1 = f(x);
max1 = max(f1);

%Setting Up x-vector and mu
x(1) = rand(1);
mu=0;

% Generating Random Poins for x with Gaussian distribution.
% Proposal Distribution will be the normal distribution
strg = 'exp(-1*((x-mu)/sig).^2)';
norm = inline(strg,'x','mu','sig');

for i = 2:n
% This loop generates a new state from the proposal distribution.
  y = x(i-1) + sig*randn(1);
  % generate a uniform for comparison
  u = rand(1);
  % Alpha is the acceptance probability
  alpha = min([1, (f(y))/((f(x(i-1))))]);

    if u <= alpha
       x(i) = y;
    else
       x(i) = x(i-1);
    end

end


%Discarding Burnin
%x(1:burnin) = [];

%I = ((inside)/length(x))*max1*(b-a);
I = (1/length(f(x)))*((sum(f(x))))/sum(norm(x,mu,sig));

%My investigation variables to see what's happening
%S1 = sum(f(x));
%S2 = sum(norm1(x,mu,sig));
S1 = min(x);
S2 = max(x);

end

用于运行上述功能的代码:

% Code for Running Metropolis Method
% Written by John Furness - Computational Physics

% Clearing Workspace
clear all
close all
clc

% Equation 1
% Changing Parameters for Equation 1
a1 = 0;
b1 = 10;
n1 = 10000;
sig = 2;

N1 = @(x)(x.*exp(-x.^2));
D1 = @(x)(exp(-x.^2));

denom = metropolis(D1,a1,b1,n1,sig);
numer = metropolis(N1,a1,b1,n1,sig);

solI1 = numer/denom

0 个答案:

没有答案