MATLAB中的LogLog图(估计PI,误差与N)

时间:2015-05-04 23:28:31

标签: matlab pi

任务:使用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图表没有显示预期的信息。

1 个答案:

答案 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的元素解释为分离的数据集,每个数据集与相同的标量值errorerror - 循环的最后一次迭代中的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