Trying to do simple Monte Carlo simulation

14 ビュー (過去 30 日間)
Matthew Jerome
Matthew Jerome 2018 年 6 月 8 日
コメント済み: Walter Roberson 2023 年 4 月 27 日
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 件のコメント
Pranav Akshay
Pranav Akshay 2023 年 4 月 27 日
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 2023 年 4 月 27 日
What are you asking to have the whole code for?

サインインしてコメントする。

採用された回答

James Tursa
James Tursa 2018 年 6 月 8 日
編集済み: James Tursa 2018 年 6 月 8 日
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 件のコメント
Matthew Jerome
Matthew Jerome 2018 年 6 月 8 日
Thank you for all your help and time today

サインインしてコメントする。

その他の回答 (1 件)

Walter Roberson
Walter Roberson 2018 年 6 月 8 日
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 件のコメント
Image Analyst
Image Analyst 2018 年 6 月 8 日
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 2018 年 6 月 8 日
num_rejections = sum(x1 < 5-0.25 | x1 > 5+0.25);

サインインしてコメントする。

Community Treasure Hunt

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

Start Hunting!

Translated by