如果进行模拟,则确定数字的频率

时间:2014-09-29 15:06:17

标签: matlab simulation

我有以下功能:

enter image description here

我必须从这个函数生成2000个随机数,然后进行直方图。 那么我必须确定它们中有多少比P(X> 2)大2。

这是我的功能:

%function [ output_args ] = Weibullverdeling( X )
%UNTITLED Summary of this function goes here
%   Detailed explanation goes here
for i=1:2000
   % x= rand*1000;
    %x=ceil(x);
    x=i;
  Y(i) = 3*(log(x))^(6/5);
  X(i)=x;
end
plot(X,Y)

它给了我以下图片:enter image description here

我怎么可能告诉我有多少值我有2个以上?

4 个答案:

答案 0 :(得分:1)

很简单:

>> Y_greater_than_2 = Y(Y>2);
>> size(Y_greater_than_2)
ans =

      1   1998

因此,2000年的1998年价值大于2。

修改

如果要查找两个其他值之间的值,例如介于1和4之间,则需要执行以下操作:

>> Y_between = Y(Y>=1 & Y<=4);
>> size(Y_between)
ans =

   1   2

答案 1 :(得分:0)

这就是我的想法:

for i=1:2000
  x=rand(1);
  Y(i) = 3*(log(x))^(6/5);
  X(i)=x;
end
plot(X,Y)

U是一个统一的随机变量,你可以从中得到X.所以你需要在MATLAB中使用rand函数。

之后你实施:

size(Y(Y>2),2);

答案 2 :(得分:0)

您可以直接实施代码(此处k是您的根,n是数据点数,y是最高分布数,x最小分布数量和等式lambda中的lambda

X=(log(x+rand(1,n).*(y-x)).*lambda).^(1/k);
result=numel(X(X>2));

让我们分开并详细解释:

你想要一个数字的第k个根:

number.^(1/k)

你想要一个数字的自然对数:

log(number)

你想要乘以......:

numberA.*numberB

你想得到x和y之间的1000个随机数:

(x+rand(1,1000).*(y-x))

你想要把所有这些结合起来:

x= lower_bound;
y= upper_bound;
n= No_Of_data;   
lambda=wavelength; %my guess 
k= No_of_the_root;
X=(log(x+rand(1,n).*(y-x)).*lambda).^(1/k);

因此,您只需要插入x,y,n,lambdak

然后检查

bigger_2 = X(X>2);

只返回大于2的值,如果你想要大于2的元素数

No_bigger_2=numel(bigger_2);

答案 3 :(得分:0)

我将假设您所呈现的内容应该是基于反演的随机变量生成算法,并且您需要实值(非复杂)解决方案,因此您省略了否定在对数上签名。如果这些假设是正确的,那么就没有必要模拟得到你的答案。

根据规定的假设,您的公式是互补累积分布函数(CCDF)的倒数。它是互补的,因为较小的U值给出较大的X值,反之亦然。解决U的(校正的)公式。使用Matlab实现中的值:

      X = 3 * (-log(U))^(6/5)
  X / 3 = (-log(U))^(6/5)
-log(U) = (X / 3)^(5/6) 
      U = exp(-((X / 3)^(5/6)))

由于这是CCDF,插入X的值会给出大于X的结果的概率(或比例)。求解X = 2得到0.49,即49%的结果应该大于2。 / p>

如果lambda在激进区内,则进行适当的调整,但导致解决方案的代数类似。除非我弄乱了算术,否则比例将达到55.22%。

如果您仍然需要模拟这一点,那么了解分析答案可以帮助您确认模拟的正确性。