MatLab-给定条件下的数值积分-从Mathematica翻译

MatLab-给定条件下的数值积分-从Mathematica翻译,matlab,integration,numerical,Matlab,Integration,Numerical,这对我的数学不起作用-我不知道为什么不起作用。它通常会给我0,但有时也会给我一个不同的数字。我知道它应该是一个小的,非零的数字 有人能帮我把这个翻译成MatLab吗?我是这个项目的新手,如果有经验的人能帮我开始,我会节省时间 myO[e1_, e2_] := (e1)/((e1) + (e2)); myU[e1_, e2_] := (1 - e2)/((1 - e1) + (1 - e2)); myV[p_, e1_, e2_] := p (e1)/(p (e1) + (1 - p) (1 -

这对我的数学不起作用-我不知道为什么不起作用。它通常会给我
0
,但有时也会给我一个不同的数字。我知道它应该是一个小的,非零的数字

有人能帮我把这个翻译成MatLab吗?我是这个项目的新手,如果有经验的人能帮我开始,我会节省时间

myO[e1_, e2_] := (e1)/((e1) + (e2));
myU[e1_, e2_] := (1 - e2)/((1 - e1) + (1 - e2));
myV[p_, e1_, e2_] := p (e1)/(p (e1) + (1 - p) (1 - e2));
myW[p_, e1_, e2_] := p (1 - e1)/(p (1 - e1) + (1 - p) e2);

NIntegrate[ Boole[0 < e1 < e2 < 1/2 && 0 < e3 < 1/2 && e1 < p < 1 - e1 && 
                  e3 < myV[p, e1, e2] < 1 - e3 < myW[p, e1, e2] && 
                  myO[e1, e2] < e3 < myU[e1, e2]], 
                 {p, 0, 1}, {e1, 0, 1/2}, {e2, 0, 1/2}, {e3, 0, 1/2}]
myO[e1,e2]:=(e1)/(e1)+(e2));
myU[e1,e2]:=(1-e2)/(1-e1)+(1-e2));
myV[p_,e1_,e2_]:=p(e1)/(p(e1)+(1-p)(1-e2));
myW[p_,e1_,e2_]:=p(1-e1)/(p(1-e1)+(1-p)e2;
九合一[Boole[0

对于那些不熟悉Mathematica的人,
Boole
只要给出满足条件的
1
,否则给出
0
。因此,我希望对所有参数空间进行积分,以找到满足条件的子空间的体积。

我相信这应该是您要寻找的。它不是很优雅,Matlab并不是专门为它设计的。我分解了你们的条件(Matlab不支持xintegral期望给定的函数被矢量化

我不能告诉你是否有合理的结果,因为计算需要很长时间,我没有耐心等到它完成

function I = LauBo

myO = @(e1, e2) e1 ./ (e1 + e2);
myU = @(e1, e2) (1 - e2) ./ (2 - e1 - e2);
myV = @(p, e1, e2) p .* e1 ./ (p .* e1 + (1 - p) .* (1 - e2));
myW = @(p, e1, e2) p .* (1 - e1) ./ (p .* (1 - e1) + (1 - p) .* e2);

    function I = first(p, e1, e2, e3)
        % integrand
        I = double(e3 < myV(p, e1, e2)) .* (myV(p, e1, e2) < 1 - e3) .* ...
            (1 - e3 < myW(p, e1, e2)) .* (myO(e1, e2) < e3) .* (e3 < myU(e1, e2));
    end

    function I = second(e1, e2, e3)
        % integrate over  p   from e1 to (1 - e1)
        I = nan(size(e1));
        for i = 1 : numel(e1)
            I(i) = integral(@(p) first(p, e1(i), e2, e3), e1(i), 1 - e1(i));
        end
    end

    function I = third(e2, e3)
        % integrate over  e1  from 0 to e2
        I = nan(size(e2));
        for i = 1 : numel(e2)
            I(i) = integral(@(e1) second(e1, e2(i), e3), 0, e2(i));
        end
    end

    function I = fourth(e3)
        % integrate over  e2  from 0 to 0.5
        I = nan(size(e3));
        for i = 1 : numel(e3)
            I(i) = integral(@(e2) third(e2, e3(i)), 0, 0.5);
        end
    end

% integrate over  e3  from 0 to 0.5
I = integral(@fourth, 0, 0.5);

end
函数I=LauBo
myO=@(e1,e2)e1./(e1+e2);
myU=@(e1,e2)(1-e2)。/(2-e1-e2);
myV=@(p,e1,e2)p.*e1./(p.*e1+(1-p.*(1-e2));
myW=@(p,e1,e2)p.*(1-e1)。/(p.*(1-e1)+(1-p)。*e2);
函数I=第一个(p、e1、e2、e3)
%被积函数
I=双(e3
这是另一次尝试,这次使用。随机生成积分极限内的值,在这些点上对函数进行评估,并将积分估计为“命中数”的分数乘以积分区域的总体积

我已经实现了它,随机数以1000万块的形式生成,并且每个块的估计值都会迭代更新。该函数将永远运行,一旦估计值足够精确,就应该停止该函数

运行几分钟后,积分值似乎接近0.001775

function LauBo2

myO = @(e1, e2) e1 ./ (e1 + e2);
myU = @(e1, e2) (1 - e2) ./ (2 - e1 - e2);
myV = @(p, e1, e2) p .* e1 ./ (p .* e1 + (1 - p) .* (1 - e2));
myW = @(p, e1, e2) p .* (1 - e1) ./ (p .* (1 - e1) + (1 - p) .* e2);

    function I = integrand(p, e1, e2, e3)
        I = double(e3 < myV(p, e1, e2)) .* (myV(p, e1, e2) < 1 - e3) .* ...
            (1 - e3 < myW(p, e1, e2)) .* (myO(e1, e2) < e3) .* ...
            (e3 < myU(e1, e2)) .* (e1 < p) .* ( p < 1 - e1) .* (e1 < e2);
    end

n = 10000000;
S = 0;
N = 0;
while true
    p = rand(n, 1);         % p from 0 1
    e1 = 0.5 * rand(n, 1);  % e1 from 0 to 0.5
    e2 = 0.5 * rand(n, 1);  % e2 from 0 to 0.5
    e3 = 0.5 * rand(n, 1);  % e3 from 0 to 0.5

    S = S + mean(integrand(p, e1, e2, e3));
    N = N + 1;

    I = S / N  * 1 * 0.5 * 0.5 * 0.5;
    fprintf('%.20f\n', I)
end

end
函数LauBo2
myO=@(e1,e2)e1./(e1+e2);
myU=@(e1,e2)(1-e2)。/(2-e1-e2);
myV=@(p,e1,e2)p.*e1./(p.*e1+(1-p.*(1-e2));
myW=@(p,e1,e2)p.*(1-e1)。/(p.*(1-e1)+(1-p)。*e2);
函数I=被积函数(p,e1,e2,e3)
I=双(e3
非常感谢!我正在运行它。确实需要很长时间;)太好了!对于我所需要的精度,这应该也很好,使用1000万点。@LauBo,很高兴我能帮忙!:-)