任务:使用Monte_Carlo方法,计算N = 100,200,500,1000,2000,5000,10000,100000的PI近似值,并在LogLog图上绘制逼近N的误差。其中Error = abs(实际值 - 近似值)。此外,使用另外两个无限级数方法计算PI,并计算N = 10,20,50,100,200,500,1000,2000,5000,10000的pi。在同一图表上绘制所有2个公式和MonteCarlo方法的LogLog图上的近似误差。
Estimating PI using M_C Method.
clear all
clc
close all
%n = linspace(0, 100000, 100)
n = [100, 200, 500, 1000, 2000, 5000, 10000, 100000]
c = 0;
t = 0;
for q=1:length(n)
x = rand([1 n(q)]);
y = rand([1 n(q)]);
for i= 1:n(q)
t = t+1;
if x(i)^2 + y(i)^2 <= 1
c = c+1;
figure(2)
k(i) = x(i);
r(i) = y(i);
hold on;
else
figure(2)
p(i) = x(i);
j(i) = y(i);
end
end
figure(1)
hold on
if n(q) == 1000
plot(k, r, 'b.');
plot(p, j, 'r.');
end
ratio = c/t;
PI= 4*ratio
error = abs(pi - PI)
figure(2)
loglog(n(q), error, '-b');
end
loglog(n, error, 's-')
grid on
%% Calculating PI using the James Gregory
%n = 10000;
n = [10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000]
d = 1;
c = 4;
for j = 1:n
d = d + 2;
c = c + ((-1)^(j))*(4)*(1/d);
end
PI_1 = c;
error = abs(n - PI_1);
loglog(n,error, '-s')
display(c);
%% Calculating PI using the Leibniz Formula for PI
%n = 10000;
n = [10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000]
d = 1;
c = 1;
for k = 1:n
d = d + 2;
c = c + ((-1)^k)*(1/d);
end
PI_2 = c*4;
error = abs(n - PI_2);
figure(3)
loglog(n, error, '-s')
我遇到的问题是loglog图表没有显示预期的信息。
答案 0 :(得分:2)
对于蒙特卡洛绘图,行
loglog(n, error, 's-')
跟随for
循环覆盖
loglog(n(q), error, '-b');
因为hold('on')
从未发出figure(2)
。
此外,在这两种情况下,由于样式选项和error
不是矢量这一事实,图表看起来很奇怪:
调用loglog(n, error, 's-')
会生成一系列已断开连接的框,因为n
是向量而error
是标量; Matlab将n
的元素解释为分离的数据集,每个数据集与相同的标量值error
(error
- 循环的最后一次迭代中的for
相关联; {{1另一个例子)。
被叫plot([1,2],0,'s-')
有类似的问题。因为这种风格需要一个坚实的蓝线&#34;但传递给loglog(n(q), error, '-b');
的数据是每次迭代的标量 - 标量对,不会出现任何内容。 Matlab不能为标量 - 标量输入形成一条线(考虑线图loglog
而不是圆形图plot(1,1,'-b')
作为另一个例子。)
将plot(1,1,'ob')
更改为error
:
length(n)
并且仅在error = zeros(1,length(n)); % before for-loop
...
error(q) = abs(pi - PI); % inside the q-for-loop
- 循环之后执行loglog
绘图(由于绘图调用相对于计算而言,这也是性能提升)。
谈到表演(加速你的蒙特卡洛),除了不屈服于curse of dimensionality之外,蒙特卡洛整合的最大优点是其可笑的可并行化(即可矢量化)性质。
这是一件很棒的事情,因为香草蒙特卡洛需要大量的样本来获得准确的结果。 此外,Matlab的logical indexing允许一种很好的语义方式来提取满足多个标准的值。
话虽如此,您可以使用以下代码对蒙特卡罗方法的for
- i
- 循环进行编辑:
for