Trying to do simple Monte Carlo simulation

15 vues (au cours des 30 derniers jours)
Matthew Jerome
Matthew Jerome le 8 Juin 2018
Commenté : Walter Roberson le 27 Avr 2023
Hey, so I'm trying to do some a simple monte carlo simulation for some tolerances.
Essentially, I have lengths and their tolerances:
5 +- .2 in
6 +- .3 in
7 +- .4 in
I am trying to do a normal distribution of these 3. So my current code is:
n = 100000
x1 = ( randn(n,1) * 3 ) + 5;
x2 = ( randn(n,1) * 3 ) + 6;
x3 = ( randn(n,1) * 3 ) + 7;
y = sqrt(x1.^2+x2.^2+x3.^2)
y_mean = mean(y)
y_std = std(y)
y_median = median(y)
My issue is that how do I take into account the tolerances into the x1, x2, x3 functions? There is a place for the standard deviation, which is 3, and a place for the mean, but I am unsure how to put in the tolerances / do an analysis of the tolerances.
Any help would be greatly appreciated. Thank you.
  12 commentaires
Pranav Akshay
Pranav Akshay le 27 Avr 2023
actually iam doing project on tolerance analysis between the shafts in a gear box. So can i have the whole code
Walter Roberson
Walter Roberson le 27 Avr 2023
What are you asking to have the whole code for?

Connectez-vous pour commenter.

Réponse acceptée

James Tursa
James Tursa le 8 Juin 2018
Modifié(e) : James Tursa le 8 Juin 2018
Based on the wording of the assignment:
To generate a normal distributed sample from the "5 +- .2 in":
r = randn*(0.2/3) + 5;
That is, 0.2 is 3 sd, so you use 0.2/3 as the sd of the sample, and then you add the mean of 5.
The uniform one you already know,
r = rand*(0.2*2) + (5 - 0.2);
Note that the target sample mean values (5 or 6 or 7) really don't play a part in your final answer, since you will be subtracting these values out of the sample vectors before you take the sqrt(etc) of the tolerance error results.
  1 commentaire
Matthew Jerome
Matthew Jerome le 8 Juin 2018
Thank you for all your help and time today

Connectez-vous pour commenter.

Plus de réponses (1)

Walter Roberson
Walter Roberson le 8 Juin 2018
If the point is that you need to generate values that are within that range, then switch to using the facilities of the Statistics toolbox, and see https://www.mathworks.com/help/stats/prob.normaldistribution.truncate.html
However, my take would be that you should instead be generating the values the way you are, and then testing, for example,
mask1 = x1 >= 5-0.2 & x1 <= 5+0.2;
If you wanted to know the fraction, then that would be mean(mask1)
  3 commentaires
Image Analyst
Image Analyst le 8 Juin 2018
You generate the values with randn() like you did. Masking just allows you to count the number of values that are in the range, like values in the range 5 +/- 0.2. You can use sum() to get the absolute count, or use mean() to get the fraction (=count/ total # of elements).
Walter Roberson
Walter Roberson le 8 Juin 2018
num_rejections = sum(x1 < 5-0.25 | x1 > 5+0.25);

Connectez-vous pour commenter.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by