2014-11-21 42 views
0

我实现了获取输入为W的值为k,epsilon和Ω的函数。函数W定义为 enter image description here如何用变化的上范围来计算总和

请不要担心方程的复杂性。用三个已知的参数k,ε和Ω很容易。现在,我想在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

该符号不明确(如果不正确)。关于红色框中的双求和公式:'g'是内部求和的运行指数(因此是一个虚拟指数),在外部求和的范围内怎么会出现这个参数呢?你确定那里没有错别字吗? – 2014-11-21 11:53:08

回答

1

我想你要找的条件是:

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

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

+0

感谢Chris Eelmaa。该公式是正确的。所以h将从1运行到最小(g-1,k)。例如,如果k = 500,g = 501,那么h将从1运行到500.否则,k = 500,g = 400,然后h从1运行到400.然而,不知道如何把它的条件在我的代码中。我认为它已检查非常迭代 – user8264 2014-11-21 10:59:13

+0

@ user8264:是的,这就是我所说的。只要用'min(n-1,k)'或我给你的东西。他们是一样的。 – 2014-11-21 11:01:30

+0

所以让我看看我的代码。你认为这是正确的吗? – user8264 2014-11-21 11:02:05

1

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

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 
+0

对。这是我想的。我认为首先总和必须使用,而 – user8264 2014-11-21 11:00:00

+0

让我检查我的代码中的所有内容。这是对的吗? – user8264 2014-11-21 11:01:30

+0

它不能运行dueto g是未定义的 – user8264 2014-11-21 11:02:55