蒙特卡罗风格评估一个完整的MATLAB

蒙特卡罗风格评估一个完整的MATLAB,matlab,montecarlo,approximation,Matlab,Montecarlo,Approximation,我知道我们可以通过在右上角“投掷”点,用蒙特卡罗方法计算出圆周率pi,并计算出圆内的圆周率等 我想对每个函数f都这样做,所以我在矩形[a,b]x[0;max(f)]中“抛出”随机点,我正在测试我的随机点y是否低于f(随机点x),然后我将总数除以f以下的点数。 代码如下: clear close all %Let's define our function f clear close all f = @(x) exp(-x.^2); a=-1; b=1; range = [a:0.01:b]; f

我知道我们可以通过在右上角“投掷”点,用蒙特卡罗方法计算出圆周率pi,并计算出圆内的圆周率等

我想对每个函数f都这样做,所以我在矩形[a,b]x[0;max(f)]中“抛出”随机点,我正在测试我的随机点y是否低于f(随机点x),然后我将总数除以f以下的点数。
代码如下:

clear
close all
%Let's define our function f
clear
close all
f = @(x) exp(-x.^2);
a=-1; b=1;
range = [a:0.01:b];
f_range = f(range);

%Let's find the maximum value of f
max_value = f(1);
max_x = range(1);
for i = range
    if (f(i) > max_value) %If we have a new maximum
        max_value = f(i);
        max_x = i;
    end
end


n=5000;
count=0;
%Let's generate uniformly distributed points over [a,b] x [0;max_f]
x = (b-a)*rand(1,n) + a;
y = rand(1,n) * max_value;

for i=1:n
    if y(i)<f(x(i)) %If my point is below the function
        count = count + 1;
    end
end


%PLOT
hold on

%scatter(x,y,'.')
plot(range,f_range,'LineWidth',2)
axis([a-1 b+1 -1 max_value+1])
integral = (n/count)

hold off
清除
全部关闭
%让我们定义函数f
清楚的
全部关闭
f=@(x)exp(-x.^2);
a=-1;b=1;
范围=[a:0.01:b];
f_范围=f(范围);
%让我们找出f的最大值
最大值=f(1);
max_x=范围(1);
对于i=范围
如果(f(i)>最大值)%
最大值=f(i);
max_x=i;
结束
结束
n=5000;
计数=0;
%让我们在[a,b]x[0;max\u f]上生成均匀分布的点
x=(b-a)*兰德(1,n)+a;
y=兰特(1,n)*最大值;
对于i=1:n

如果y(i)你有两个小错误:

  • 它应该是
    count/n
    ,而不是
    n/count
    。使用正确的
    计数/n
    将给出曲线下方的点的比例
  • 要获得曲线下方的面积,请将该比例乘以矩形的面积,
    (b-a)*max_值
因此,使用
count/n*(b-a)*max_值


除此之外,通过一些矢量化,您的代码将更快更清晰:

clear
close all
f = @(x) exp(-x.^2);
a=-1; b=1;
range = [a:0.01:b];

%Let's find the maximum value of f
max_value = max(f(range));

n=50000;
%Let's generate uniformly distributed points over [a,b] x [0;max_f]
x = (b-a)*rand(1,n) + a;
y = rand(1,n) * max_value;

count = sum(y < f(x));
result = count/n * (b-a)*max_value
清除
全部关闭
f=@(x)exp(-x.^2);
a=-1;b=1;
范围=[a:0.01:b];
%让我们找出f的最大值
最大值=最大值(f(范围));
n=50000;
%让我们在[a,b]x[0;max\u f]上生成均匀分布的点
x=(b-a)*兰德(1,n)+a;
y=兰特(1,n)*最大值;
计数=总和(y
btw你可以做:
a=-1
b=1
f=@(x)exp(-x.^2)
n=5000
randnums=a+(b-a)*rand(1,n)
intg=(b-a)*平均值(f(randnums))
是的,它可以工作,但我真的很想实现“触发”。如果我设置
f=@(x)exp(-x.^2)。那么,它将替换循环中的
count=count+1
。具有相同大小向量的比较
y
给出了一个向量,其条目等于
true
1
)或
false
0
),并且
sum
只计算和