MATLAB中的对数图(估算PI,误差vs N)

MATLAB中的对数图(估算PI,误差vs N),matlab,pi,Matlab,Pi,任务:使用蒙特卡罗方法,计算N=10020050010002000500010000100001000000的PI近似值,并在对数图上绘制近似值与N的误差。其中Error=abs(实际值­-近似值)。此外,使用另外两种无穷级数方法计算PI,并计算N=10,20,501002005001000500010000的PI。在同一图表上绘制所有2个公式和蒙特卡罗方法的对数图上的近似误差 Estimating PI using M_C Method. clear all clc close all %n

任务:使用蒙特卡罗方法,计算N=10020050010002000500010000100001000000的PI近似值,并在对数图上绘制近似值与N的误差。其中Error=abs(实际值­-近似值)。此外,使用另外两种无穷级数方法计算PI,并计算N=10,20,501002005001000500010000的PI。在同一图表上绘制所有2个公式和蒙特卡罗方法的对数图上的近似误差

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')
使用M_C方法估算PI。
清除所有
clc
全部关闭
%n=linspace(0,100000,100)
n=[10020050010002000500010000100000]
c=0;
t=0;
对于q=1:长度(n)
x=兰特([1 n(q)]);
y=兰特([1 n(q)]);
对于i=1:n(q)
t=t+1;
如果x(i)^2+y(i)^2
对于蒙特卡罗绘图,线

loglog(n, error, 's-')
之后,循环覆盖由

loglog(n(q), error, '-b');
因为
图(2)
从未发出过
保持('on')
。 此外,在这两种情况下,由于样式选项和
error
不是矢量这一事实,曲线图看起来都很奇怪:

  • 调用
    loglog(n,error,'s-)
    将生成一系列断开连接的框,因为
    n
    是一个向量,
    error
    是一个标量;Matlab将
    n
    的元素解释为单独的数据集,每个数据集都与相同的标量值
    error
    (来自
    for
    -循环的上次迭代的
    error
    绘图([1,2],0,'s-)
    是另一个示例)

  • 被调用的
    loglog(n(q),错误'-b')也有类似的问题。由于该样式需要一条“蓝色实线”,但每次迭代传递到
    loglog
    的数据都是标量对,因此不会显示任何内容。Matlab无法为标量输入形成一条直线(另一个例子是直线图
    图(1,1,'-b')
    与圆形图
    图(1,1,'ob')

这些问题可以通过将
error
更改为
长度(n)
的向量来解决:

并且仅在
for
-循环之后执行
loglog
绘图(这也是一种性能提升,因为绘图调用相对于计算而言非常繁重)

性能讨论 说到性能(加速蒙特卡罗),蒙特卡罗积分的最大优点,除了不屈服于性能之外,是其可笑的可并行(即向量化)特性

这是一件很棒的事情,因为香草蒙特卡罗需要大量的样本才能得到准确的结果。 此外,Matlab还提供了一种很好的语义方法来提取满足许多条件的值

话虽如此,Monte Carlo方法的
i
-
-循环的
可以通过以下代码进行审查:

% % ----- i-for-loop replacement

%   Determine location of points
inCircle = (x.^2 + y.^2) <= 1;

%   k = xIn, r = yIn
xIn = x(inCircle);
yIn = y(inCircle);

%   p = xOut, j = yOut
xOut = x(~inCircle);    % or x(not(inCircle));
yOut = y(~inCircle);    % or y(not(inCircle));

% % ----- end of i-for-loop replacement

%   Calculate MC pi and error
ratio    = nnz(inCircle)/n(q);
PI       = 4*ratio;
error(q) = abs(pi - PI);
%%----i-for-loop替换
%确定点的位置

inCircle=(x.^2+y.^2)可能未正确计算信息。我不认为问题出在日志上,是吗?是的,你的代码可以工作。请简要说明,您期望的是什么样的绘图,您现在得到的绘图是什么,以及您得到的任何错误。好吧,当我运行代码时,我得到的似乎是一个无限的数字循环,我假设,因为它正在为n中的所有值绘制,但它似乎没有停止。我想我想要的是图形在通过数组“n”的值时更新,并在最后一个值处停止,同时绘制各种值的LogLog图。此外,包含Loglog图的图形不会呈现任何点…感谢TroyHaskin。我将尝试进行您建议的修改。如果我遇到任何问题,可以再问你一些问题吗?
% % ----- i-for-loop replacement

%   Determine location of points
inCircle = (x.^2 + y.^2) <= 1;

%   k = xIn, r = yIn
xIn = x(inCircle);
yIn = y(inCircle);

%   p = xOut, j = yOut
xOut = x(~inCircle);    % or x(not(inCircle));
yOut = y(~inCircle);    % or y(not(inCircle));

% % ----- end of i-for-loop replacement

%   Calculate MC pi and error
ratio    = nnz(inCircle)/n(q);
PI       = 4*ratio;
error(q) = abs(pi - PI);