2017-11-10 5 views
1

不可欠MATLABを..評価するモンテカルロスタイルは、私たちは右上隅に「投げる」の点で、モンテカルロ法を用いた<strong>パイ</strong>を近似し、円などの内部にあるどのようにそれらの多く数えることができることを知っていた

私は F 機能毎ことをしたいので、私は長方形 [B]×[0、最大値(F)] ランダムな点を「投げ」しています私のrandom_point_y場合と私がテストしていますがf(random_point_x)よりも小さい場合は、fの下の点の数で合計を除算します。私は結果1.3414を持っているmonte carlo

しかし、: - (X^2)-1と1の間の例えば

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 

Iは、F = E ^ためであった:
ここでは、コードされ1.3373
は500.000ポイントです。 正確な結果はです1.49365

私は何が欠けていますか?

+0

はところであなたができる:これとは別に


は、あなたのコードは、いくつかのベクトル化で、より速く、より明確になります '= -1;' 'B = 1;' 'F ='n = 5000;' 'randnums = a +(ba)* rand(1、n);' 'int(= ba)* mean(f randnums)) ' –

+0

はい、動作しますが、私は本当にその"発射 "を実装したいと思います。 また、 '' x(i)^ 2 + y(i)^ 2 <= 1'なら 'f = @(x)exp(-x。^ 2);'と '' x '私は本当にどこから来たのか分かりません。 –

答えて

2

次の2つの小さなミスがあります:それはcount/n、ないn/countあるべき

  • を。正しいcount/nを使用すると、の割合が曲線の下の点のになります。
  • の領域には、曲線の下にを配置するには、その割合に矩形の領域である(b-a)*max_valueを掛けます。

ですので、count/n * (b-a)*max_valueを使用してください。

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 
+1

@RomainB。つまり、あなたのループの 'count = count + 1'を置き換えます。等しい大きさのベクトルを持つ比較 'y

関連する問題

 関連する問題