如何计算总和与变化的上限范围

时间:2014-11-21 10:28:44

标签: algorithm matlab math

我实现了函数来获取W的值,输入是k,epsilon和Omega。函数W定义为 enter image description here

请不要担心等式的复杂性。使用三个已知参数k,epsilon和Omega非常容易。现在,我想在matlab中实现它。但是,我的问题是如何设置第一个循环的范围与上限范围min(g-1,k)。让我们看看我的实现更多细节。这是正确的

 function W=getW(k,epsilon,Omega)
 n=ceil((1+epsilon)*k);
 sumIn=0;
 sumOut=0;
 g=2;
 for h=1 :min(n-1,k)    
     for g=2:n
        sumIn=sumIn+(g-h)*getA(k,epsilon,g,Omega)*getT(k,g,h);    
     end
     sumOut=sumOut+sumIn;
 end
 sumOut
end
function A=getA(k,epsilon,g,Omega)
    n=ceil((1+epsilon)*k);
    A=nchoosek(n,g)*(Omega)^g*(1-Omega)^(n-g)
end
function T=getT(k,g,h)
    T=nchoosek(k,h)*getS(g,h)/(k^g);
end
function S=getS(g,h)
    sumSX=0;
    for x=1:h-1
    sumSX=sumSX+(-1)^(x-h+1)*nchoosek(h,x)*x^g;
    end
    S=h^g-sumSX;
end

要运行它,请设置W = getW(500,0.1,0.02)

2 个答案:

答案 0 :(得分:1)

我认为您正在寻找的条件是:

min((1+epsilon)*k - 1, k);

g-1应该在右侧循环完成后进行评估,并取最后一个g值。

答案 1 :(得分:1)

它不起作用,因为Matlab不再检查FOR行,至少它不在调试器中。我想当Matlab解释行for h=1 :min(g-1,k)时,它会计算重复循环所需的次数。在这种情况下它是一次因为g是2.即使g改变它也不会再次检查该行。为了避免这种情况,只需使用while循环。与

function W=getW(k,epsilon,Omega)
n=ceil((1+epsilon)*k);    
sumOut=0;
g=2;
h=1;
while(h <= min(g-1,k))
    sumIn=0;
    for g=2:n
        sumIn=sumIn+(g-h)*getA(k,epsilon,g,Omega)*getT(k,g,h);    
    end
    sumOut=sumOut+sumIn;
    h=h+1;
end

function A=getA(k,epsilon,g,Omega)
    n=ceil((1+epsilon)*k);
    A=nchoosek(n,g)*(Omega)^g*(1-Omega)^(n-g)
end
function T=getT(k,g,h)
    T=nchoosek(k,h)*getS(g,h)/(k^g);
end
function S=getS(g,h)
    sumSX=0;
    for x=1:h-1
        sumSX=sumSX+(-1)^(x-h+1)*nchoosek(h,x)*x^g;
    end
    S=h^g-sumSX;
end