【问题标题】:How to compute sum of sum with changing upper range如何通过改变上限来计算总和的总和
【发布时间】:2014-11-21 19:27:00
【问题描述】:

我正在实现函数以获取 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)

【问题讨论】:

  • 符号不明确(如果不正确的话)。关于红框内的双求和公式:g是内求和的运行指标(所以是哑指标),它怎么会作为参数出现在外求和的范围内呢?你确定那里没有错字吗?

标签: algorithm matlab math


【解决方案1】:

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

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

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

【讨论】:

  • 感谢 Chris Eelmaa。公式是正确的。所以 h 将从 1 运行到 min(g-1,k)。例如,如果k=500,g=501,那么h会从1跑到500。否则,k=500,g=400,那么h会从1跑到400。但是,不知道如何设置条件在我的代码中。我认为它有检查非常迭代
  • @user8264:是的,我就是这么说的。只需使用min(n-1, k) 或我给你的。它们是一样的。
  • 我根据您的建议进行了修改。但是,它不能停止
  • 您是否将for h=1 :min(g-1,k) 替换为for h=1 :min(n-1,k)
  • 是的,我试过了。但是,基于Solid的解释。他说Matlab不要再用FOR检查那行了。所以 h=1 :min(n-1,k) 只能从 h=1 运行到 n
【解决方案2】:

它不起作用,因为 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

【讨论】:

  • 对。这是我认为的。我认为第一个 sum 必须使用 while
  • g 未定义,无法运行
  • 是的。太感谢了。现在是正确的。让我们再看看我的方程式。我的实现是否正确以获得 A、T、S?
  • 我不明白这个等式,但如果我必须实现它,我会按照你的方式来做(只是使用 while 循环和我发布的更改)。
猜你喜欢
  • 2017-03-05
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 2020-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多