蒙特卡罗风格评估一个完整的MATLAB
我知道我们可以通过在右上角“投掷”点,用蒙特卡罗方法计算出圆周率pi,并计算出圆内的圆周率等 我想对每个函数f都这样做,所以我在矩形[a,b]x[0;max(f)]中“抛出”随机点,我正在测试我的随机点y是否低于f(随机点x),然后我将总数除以f以下的点数。蒙特卡罗风格评估一个完整的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
代码如下:
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)如果x(i)^2+y(i)^2@RomainB,则测试为。那么,它将替换循环中的count=count+1
。具有相同大小向量的比较y
给出了一个向量,其条目等于true
(1
)或false
(0
),并且sum
只计算和