user3242545
user3242545

Reputation: 21

simulating a random walk in matlab

i have variable x that undergoes a random walk according to the following rules:

x(t+1)=x(t)-1; probability p=0.3
x(t+1)=x(t)-2; probability q=0.2
x(t+1)=x(t)+1; probability p=0.5

a) i have to create this variable initialized at zero and write a for loop for 100 steps and that runs 10000 times storing each final value in xfinal b) i have to plot a probability distribution of xfinal (a histogram) choosing a bin size and normalization!!* i have to report the mean and variance of xfinal c) i have to recreate the distribution by application of the central limit theorem and plot the probability distribution on the same plot!

help would be appreciated in telling me how to choose the bin size and normalize the histogram and how to attempt part c) your help is much appreciated!!

p=0.3;
q=0.2;
s=0.5;
numberOfSteps = 100;
maxCount = 10000;
for count=1:maxCount
    x=0;
    for i = 1:numberOfSteps
        random = rand(1, 1);
        if random <=p
            x=x-1;
        elseif random<=(p+q)
            x=x-2; 
        else
            x=x+1;
        end
    end
    xfinal(count) = x;
end
[f,x]=hist(xfinal,30);
figure(1)
bar(x,f/sum(f));
xlabel('xfinal')
ylabel('frequency')
mean = mean(xfinal)
variance = var(xfinal)

Upvotes: 2

Views: 8387

Answers (2)

John Bofarull Guix
John Bofarull Guix

Reputation: 820

  1. Mathworks is deprecating hist that is being replaced with histogram. more details in this link

  2. You are not applying the PDF function as expected, the expression Y doesn't work

For instance Y does not have the right X-axis start stop points. And you are using x as input to Y while x already used as pivot inside the double for loop.

When I ran your code Y generates a single value, it is not a vector but just a scalar.

enter image description here

  1. This

    bar(x,f/sum(f));

bringing down all input values with sum(f) division? no need.

On attempting to overlap the ideal probability density function, often one has to do additional scaling, to have both real and ideal visually overlapped.

MATLAB can do the scaling for us, and no need to modify input data /sum(f). With a dual plot using yyaxis

  1. You also mixed variance and standard deviation.

Instead try something like this

y2=1 / sqrt(2*pi*var1)*exp(-(x2-m1).^2 / (2*var1))
  1. ok, the following solves your question(s)

codehere

clear all;
close all;
clc
p=0.3; % thresholds
q=0.2;
s=0.5;
n_step=100;
max_cnt=10000;
n_bin=30; % histogram amount bins
xf=zeros(1,max_cnt);
for cnt=1:max_cnt % runs loop
x=0;
for i = 1:n_step  % steps loop
t_rand1 = rand(1, 1);
if t_rand1 <=p
x=x-1;
elseif t_rand1<=(p+q)
x=x-2; 
else
x=x+1;
end
end
xf(cnt) = x;
end
% [f,x]=hist(xf,n_bin);
hf1=figure(1)
ax1=gca
yyaxis left
hp1=histogram(xf,n_bin);
% bar(x,f/sum(f));
grid on
xlabel('xf')
ylabel('frequency')
m1 = mean(xf)
var1 = var(xf)
s1=var1^.5   % sigma
%applying central limit theorem %finding the mean 
n_x2=1e3 % just enough points
min_x2=min(hp1.BinEdges)
max_x2=max(hp1.BinEdges)
% quite same as
min_x2=hp1.BinLimits(1)
max_x2=hp1.BinLimits(2)
x2=linspace(min_x2,max_x2,n_x2)
y2=1/sqrt(2*pi*var1)*exp(-(x2-m1).^2/(2*var1)); 
% hold(ax1,'on')
yyaxis right
plot(ax1,x2,y2,'r','LineWidth',2)

. . enter image description here .

  1. note I have not used these lines

    % Xp=-1; Xq=-2; Xs=1; mu=Xp.*p+Xq.*q+Xs.*s; % muN=n_step.*mu; % % sigma=(Xp).^2.*p+(Xq).^2.*q+(Xs).^2.s; % variance % sigmaN=n_step.(sigma-(mu).^2);

  2. People ususally call sigma to variance^.5

This supplied script is a good start point to now take it to wherever you need it to go.

Upvotes: 0

patrik
patrik

Reputation: 4558

For the first question, check the help for hist on mathworks homepage

[nelements,centers] = hist(data,nbins);

You do not select the bin size, but the number of bins. nelements gives the elements per bin and center is all the bin centers. So to say, it would be the same to call

hist(data,nbins);

as

  [nelements,centers] = hist(data,nbins);
  plot(centers,nelements);

except that the representation is different (line or pile). To normalize, simply divide nelements with sum(nelements)

For c, here i.i.d. variables it actually is a difference if the variables are real or complex. However for real variables the central limit theorem in short tells you that for a large number of samples the distribution will limit the normal distribution. So if the samples are real, you simply asssumes a normal distribution, calculates the mean and variance and plots this as a normal distribution. If the variables are complex, then each of the variables will be normally distributed which means that you will have a rayleigh distribution instead.

Upvotes: 0

Related Questions