我实现了函数来获取W的值,输入是k,epsilon和Omega。函数W定义为
请不要担心等式的复杂性。使用三个已知参数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)
答案 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